Project

General

Profile

Download (10.8 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
 * status_ntpd.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6
 * Copyright (c) 2004-2016 Rubicon Communications, LLC (Netgate)
7
 * Copyright (c) 2013 Dagorlad
8
 * All rights reserved.
9
 *
10
 * originally based on m0n0wall (http://m0n0.ch/wall)
11
 * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>.
12
 * All rights reserved.
13
 *
14
 * Licensed under the Apache License, Version 2.0 (the "License");
15
 * you may not use this file except in compliance with the License.
16
 * You may obtain a copy of the License at
17
 *
18
 * http://www.apache.org/licenses/LICENSE-2.0
19
 *
20
 * Unless required by applicable law or agreed to in writing, software
21
 * distributed under the License is distributed on an "AS IS" BASIS,
22
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
 * See the License for the specific language governing permissions and
24
 * limitations under the License.
25
 */
26

    
27
##|+PRIV
28
##|*IDENT=page-status-ntp
29
##|*NAME=Status: NTP
30
##|*DESCR=Allow access to the 'Status: NTP' page.
31
##|*MATCH=status_ntpd.php*
32
##|-PRIV
33

    
34
require_once("guiconfig.inc");
35

    
36
if (!isset($config['ntpd']['noquery'])) {
37
	if (isset($config['system']['ipv6allow'])) {
38
		$inet_version = "";
39
	} else {
40
		$inet_version = " -4";
41
	}
42

    
43
	exec("/usr/local/sbin/ntpq -pn $inet_version | /usr/bin/tail +3", $ntpq_output);
44

    
45
	$ntpq_servers = array();
46
	foreach ($ntpq_output as $line) {
47
		$server = array();
48
		$status_char = substr($line, 0, 1);
49
		$line = substr($line, 1);
50
		$peerinfo = preg_split("/[\s\t]+/", $line);
51

    
52
		$server['server'] = $peerinfo[0];
53
		$server['refid'] = $peerinfo[1];
54
		$server['stratum'] = $peerinfo[2];
55
		$server['type'] = $peerinfo[3];
56
		$server['when'] = $peerinfo[4];
57
		$server['poll'] = $peerinfo[5];
58
		$server['reach'] = $peerinfo[6];
59
		$server['delay'] = $peerinfo[7];
60
		$server['offset'] = $peerinfo[8];
61
		$server['jitter'] = $peerinfo[9];
62

    
63
		switch ($status_char) {
64
			case " ":
65
				if ($server['refid'] == ".POOL.") {
66
					$server['status'] = gettext("Pool Placeholder");
67
				} else {
68
					$server['status'] = gettext("Unreach/Pending");
69
				}
70
				break;
71
			case "*":
72
				$server['status'] = gettext("Active Peer");
73
				break;
74
			case "+":
75
				$server['status'] = gettext("Candidate");
76
				break;
77
			case "o":
78
				$server['status'] = gettext("PPS Peer");
79
				break;
80
			case "#":
81
				$server['status'] = gettext("Selected");
82
				break;
83
			case ".":
84
				$server['status'] = gettext("Excess Peer");
85
				break;
86
			case "x":
87
				$server['status'] = gettext("False Ticker");
88
				break;
89
			case "-":
90
				$server['status'] = gettext("Outlier");
91
				break;
92
		}
93

    
94
		$ntpq_servers[] = $server;
95
	}
96

    
97
	exec("/usr/local/sbin/ntpq -c clockvar $inet_version", $ntpq_clockvar_output);
98
	foreach ($ntpq_clockvar_output as $line) {
99
		if (substr($line, 0, 9) == "timecode=") {
100
			$tmp = explode('"', $line);
101
			$tmp = $tmp[1];
102
			if (substr($tmp, 0, 6) == '$GPRMC') {
103
				$gps_vars = explode(",", $tmp);
104
				$gps_ok = ($gps_vars[2] == "A");
105
				$gps_lat_deg = substr($gps_vars[3], 0, 2);
106
				$gps_lat_min = substr($gps_vars[3], 2);
107
				$gps_lon_deg = substr($gps_vars[5], 0, 3);
108
				$gps_lon_min = substr($gps_vars[5], 3);
109
				$gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
110
				$gps_lat = $gps_lat * (($gps_vars[4] == "N") ? 1 : -1);
111
				$gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
112
				$gps_lon = $gps_lon * (($gps_vars[6] == "E") ? 1 : -1);
113
				$gps_lat_dir = $gps_vars[4];
114
				$gps_lon_dir = $gps_vars[6];
115
			} elseif (substr($tmp, 0, 6) == '$GPGGA') {
116
				$gps_vars = explode(",", $tmp);
117
				$gps_ok = $gps_vars[6];
118
				$gps_lat_deg = substr($gps_vars[2], 0, 2);
119
				$gps_lat_min = substr($gps_vars[2], 2);
120
				$gps_lon_deg = substr($gps_vars[4], 0, 3);
121
				$gps_lon_min = substr($gps_vars[4], 3);
122
				$gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
123
				$gps_lat = $gps_lat * (($gps_vars[3] == "N") ? 1 : -1);
124
				$gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
125
				$gps_lon = $gps_lon * (($gps_vars[5] == "E") ? 1 : -1);
126
				$gps_alt = $gps_vars[9];
127
				$gps_alt_unit = $gps_vars[10];
128
				$gps_sat = (int)$gps_vars[7];
129
				$gps_lat_dir = $gps_vars[3];
130
				$gps_lon_dir = $gps_vars[5];
131
			} elseif (substr($tmp, 0, 6) == '$GPGLL') {
132
				$gps_vars = preg_split('/[,\*]+/', $tmp);
133
				$gps_ok = ($gps_vars[6] == "A");
134
				$gps_lat_deg = substr($gps_vars[1], 0, 2);
135
				$gps_lat_min = substr($gps_vars[1], 2);
136
				$gps_lon_deg = substr($gps_vars[3], 0, 3);
137
				$gps_lon_min = substr($gps_vars[3], 3);
138
				$gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
139
				$gps_lat = $gps_lat * (($gps_vars[2] == "N") ? 1 : -1);
140
				$gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
141
				$gps_lon = $gps_lon * (($gps_vars[4] == "E") ? 1 : -1);
142
				$gps_lat_dir = $gps_vars[2];
143
				$gps_lon_dir = $gps_vars[4];
144
			}
145
		}
146
	}
147
}
148

    
149
if (isset($gps_ok) && isset($config['ntpd']['gps']['extstatus']) && ($config['ntpd']['gps']['nmeaset']['gpgsv'] || $config['ntpd']['gps']['nmeaset']['gpgga'])) {
150
	$lookfor['GPGSV'] = $config['ntpd']['gps']['nmeaset']['gpgsv'];
151
	$lookfor['GPGGA'] = !isset($gps_sat) && $config['ntpd']['gps']['nmeaset']['gpgga'];
152
	$gpsport = fopen('/dev/gps0', 'r+');
153
	while ($gpsport && ($lookfor['GPGSV'] || $lookfor['GPGGA'])) {
154
		$buffer = fgets($gpsport);
155
		if ($lookfor['GPGSV'] && substr($buffer, 0, 6) == '$GPGSV') {
156
			$gpgsv = explode(',', $buffer);
157
			$gps_satview = (int)$gpgsv[3];
158
			$lookfor['GPGSV'] = 0;
159
		} elseif ($lookfor['GPGGA'] && substr($buffer, 0, 6) == '$GPGGA') {
160
			$gpgga = explode(',', $buffer);
161
			$gps_sat = (int)$gpgga[7];
162
			$gps_alt = $gpgga[9];
163
			$gps_alt_unit = $gpgga[10];
164
			$lookfor['GPGGA'] = 0;
165
		}
166
	}
167
}
168

    
169
// Responding to an AJAX call, we return the GPS data or the status data depending on $_REQUEST['dogps']
170
if ($_REQUEST['ajax']) {
171

    
172
	if ($_REQUEST['dogps'] == "yes") {
173
		print_gps();
174
	} else {
175
		print_status();
176
	}
177

    
178
	exit;
179
}
180

    
181
function print_status() {
182
	global $config, $ntpq_servers;
183

    
184
	if (isset($config['ntpd']['noquery'])):
185

    
186
		print("<tr>\n");
187
		print('<td class="warning" colspan="11">');
188
		printf(gettext("Statistics unavailable because ntpq and ntpdc queries are disabled in the %sNTP service settings%s"), '<a href="services_ntpd.php">', '</a>');
189
		print("</td>\n");
190
		print("</tr>\n");
191
	elseif (count($ntpq_servers) == 0):
192
		print("<tr>\n");
193
		print('<td class="warning" colspan="11">');
194
		printf(gettext("No peers found, %sis the ntp service running?%s"), '<a href="status_services.php">', '</a>');
195
		print("</td>\n");
196
		print("</tr>\n");
197
	else:
198

    
199
		$i = 0;
200
		foreach ($ntpq_servers as $server):
201
			print("<tr>\n");
202
			print("<td>" . $server['status'] . "</td>\n");
203
			print("<td>" . $server['server'] . "</td>\n");
204
			print("<td>" . $server['refid'] . "</td>\n");
205
			print("<td>" . $server['stratum'] . "</td>\n");
206
			print("<td>" . $server['type'] . "</td>\n");
207
			print("<td>" . $server['when'] . "</td>\n");
208
			print("<td>" . $server['poll'] . "</td>\n");
209
			print("<td>" . $server['reach'] . "</td>\n");
210
			print("<td>" . $server['delay'] . "</td>\n");
211
			print("<td>" . $server['offset'] . "</td>\n");
212
			print("<td>" . $server['jitter'] . "</td>\n");
213
			print("</tr>\n");
214
			$i++;
215
		endforeach;
216
	endif;
217
}
218

    
219
function print_gps() {
220
	global 	$gps_lat, $gps_lon, $gps_lat_deg, $gps_lon_deg, $gps_lat_min, $gps_lon_min, $gps_lat_dir, $gps_lon_dir,
221
			$gps_alt, $gps_alt_unit, $gps_sat, $gps_satview, $gps_goo_lnk;
222

    
223
	print("<tr>\n");
224
	print("<td>\n");
225
	printf("%.5f", $gps_lat);
226
	print(" (");
227
	printf("%d%s", $gps_lat_deg, "&deg;");
228
	printf("%.5f", $gps_lat_min);
229
	print($gps_lat_dir);
230
	print(")");
231
	print("</td>\n");
232
	print("<td>\n");
233
	printf("%.5f", $gps_lon);
234
	print(" (");
235
	printf("%d%s", $gps_lon_deg, "&deg;");
236
	printf("%.5f", $gps_lon_min);
237
	print($gps_lon_dir);
238
	print(")");
239
	print("</td>\n");
240

    
241
	if (isset($gps_alt)) {
242
		print("<td>\n");
243
		print($gps_alt . ' ' . $gps_alt_unit);
244
		print("</td>\n");
245
	}
246

    
247
	if (isset($gps_sat) || isset($gps_satview)) {
248
		print('<td>');
249

    
250
		if (isset($gps_satview)) {
251
			print(gettext('in view ') . intval($gps_satview));
252
		}
253

    
254
		if (isset($gps_sat) && isset($gps_satview)) {
255
			print(', ');
256
		}
257
		if (isset($gps_sat)) {
258
			print(gettext('in use ') . $gps_sat);
259
		}
260

    
261
		print("</td>\n");
262
	}
263

    
264
	print("</tr>\n");
265
	print("<tr>\n");
266
	print('<td colspan="' . $gps_goo_lnk . '"><a target="_gmaps" href="http://maps.google.com/?q=' . $gps_lat . ',' . $gps_lon . '">' . gettext("Google Maps Link") . '</a></td>');
267
	print("</tr>\n");
268
}
269

    
270
$pgtitle = array(gettext("Status"), gettext("NTP"));
271
$shortcut_section = "ntp";
272

    
273
include("head.inc");
274
?>
275

    
276
<div class="panel panel-default">
277
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Network Time Protocol Status");?></h2></div>
278
	<div class="panel-body">
279
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap" data-sortable>
280
			<thead>
281
				<tr>
282
					<th><?=gettext("Status")?></th>
283
					<th><?=gettext("Server")?></th>
284
					<th><?=gettext("Ref ID")?></th>
285
					<th><?=gettext("Stratum")?></th>
286
					<th><?=gettext("Type")?></th>
287
					<th><?=gettext("When")?></th>
288
					<th><?=gettext("Poll")?></th>
289
					<th><?=gettext("Reach")?></th>
290
					<th><?=gettext("Delay")?></th>
291
					<th><?=gettext("Offset")?></th>
292
					<th><?=gettext("Jitter")?></th>
293
				</tr>
294
			</thead>
295
			<tbody id="ntpbody">
296
				<?=print_status()?>
297
			</tbody>
298
		</table>
299
	</div>
300
</div>
301

    
302

    
303
<?php
304

    
305
$showgps = 0;
306

    
307
// GPS satellite information (if available)
308
if (($gps_ok) && ($gps_lat) && ($gps_lon)):
309
	$gps_goo_lnk = 2;
310
	$showgps = 1;
311
?>
312

    
313
<div class="panel panel-default">
314
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("GPS Information");?></h2></div>
315
	<div class="panel-body">
316
		<table class="table table-striped table-hover table-condensed">
317
			<thead>
318
				<tr>
319
					<th><?=gettext("Clock Latitude")?></th>
320
					<th><?=gettext("Clock Longitude")?></th>
321
<?php
322
	if (isset($gps_alt)) {
323
?>
324
					<th><?=gettext("Clock Altitude")?></th>
325
<?php
326
		$gps_goo_lnk++;
327
	}
328

    
329
	if (isset($gps_sat) || isset($gps_satview)) {
330
?>
331
					<th><?=gettext("Satellites")?></th>
332
<?php
333
		$gps_goo_lnk++;
334
	}
335
?>
336
				</tr>
337
			</thead>
338

    
339
			<tbody id="gpsbody">
340
				<?=print_gps()?>
341
			</tbody>
342
		</table>
343
	</div>
344
</div>
345

    
346
<?php
347
endif;
348
?>
349

    
350
<script type="text/javascript">
351
//<![CDATA[
352
events.push(function() {
353
	ajax_lock = false;		// Mutex so we don't make a call until the previous call is finished
354
	do_gps = "no";
355

    
356
	// Fetch the tbody contents from the server
357
	function update_tables() {
358

    
359
		if (ajax_lock) {
360
			return;
361
		}
362

    
363
		ajax_lock = true;
364

    
365
		ajaxRequest = $.ajax(
366
			{
367
				url: "/status_ntpd.php",
368
				type: "post",
369
				data: {
370
					ajax: 	"ajax",
371
					dogps:  do_gps
372
				}
373
			}
374
		);
375

    
376
		// Deal with the results of the above ajax call
377
		ajaxRequest.done(function (response, textStatus, jqXHR) {
378
			if (do_gps == "yes") {
379
				$('#gpsbody').html(response);
380
			} else {
381
				$('#ntpbody').html(response);
382
			}
383

    
384
			ajax_lock = false;
385

    
386
			// Alternate updating the status table and the gps table (if enabled)
387
			if ((do_gps == "yes") || ("<?=$showgps?>" != 1)) {
388
				do_gps = "no";
389
			} else {
390
				do_gps = "yes";
391
			}
392

    
393
			// and do it again
394
			setTimeout(update_tables, 5000);
395
		});
396

    
397

    
398
	}
399

    
400
	// Populate the tbody on page load
401
	update_tables();
402
});
403
//]]>
404
</script>
405

    
406
<?php
407
include("foot.inc");
408
?>
(177-177/225)