Project

General

Profile

Download (11.9 KB) Statistics
| Branch: | Tag: | Revision:
1 e078c882 jim-p
<?php
2
/*
3 c5d81585 Renato Botelho
 * status_ntpd.php
4 191cb31d Stephen Beaver
 *
5 c5d81585 Renato Botelho
 * part of pfSense (https://www.pfsense.org)
6 38809d47 Renato Botelho do Couto
 * Copyright (c) 2004-2013 BSD Perimeter
7
 * Copyright (c) 2013-2016 Electric Sheep Fencing
8
 * Copyright (c) 2014-2019 Rubicon Communications, LLC (Netgate)
9 c5d81585 Renato Botelho
 * Copyright (c) 2013 Dagorlad
10
 * All rights reserved.
11 191cb31d Stephen Beaver
 *
12 c5d81585 Renato Botelho
 * originally based on m0n0wall (http://m0n0.ch/wall)
13
 * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>.
14
 * All rights reserved.
15 191cb31d Stephen Beaver
 *
16 b12ea3fb Renato Botelho
 * Licensed under the Apache License, Version 2.0 (the "License");
17
 * you may not use this file except in compliance with the License.
18
 * You may obtain a copy of the License at
19 191cb31d Stephen Beaver
 *
20 b12ea3fb Renato Botelho
 * http://www.apache.org/licenses/LICENSE-2.0
21 191cb31d Stephen Beaver
 *
22 b12ea3fb Renato Botelho
 * Unless required by applicable law or agreed to in writing, software
23
 * distributed under the License is distributed on an "AS IS" BASIS,
24
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25
 * See the License for the specific language governing permissions and
26
 * limitations under the License.
27 5d36f3c4 Stephen Beaver
 */
28 e078c882 jim-p
29
##|+PRIV
30
##|*IDENT=page-status-ntp
31 5230f468 jim-p
##|*NAME=Status: NTP
32 e078c882 jim-p
##|*DESCR=Allow access to the 'Status: NTP' page.
33
##|*MATCH=status_ntpd.php*
34
##|-PRIV
35
36
require_once("guiconfig.inc");
37
38 c2d8c3c8 Nano Caiordo
$allow_query = !isset($config['ntpd']['noquery']);
39 e0f12d6b Nano Caiordo
if (!empty($config['ntpd']['restrictions']['row']) && is_array($config['ntpd']['restrictions']['row'])) {
40 d73918f2 Nano Caiordo
	foreach ($config['ntpd']['restrictions']['row'] as $v) {
41 c2d8c3c8 Nano Caiordo
		if (ip_in_subnet($_SERVER['REMOTE_ADDR'], "{$v['acl_network']}/{$v['mask']}")) {
42
			$allow_query = !isset($v['noquery']);
43 d73918f2 Nano Caiordo
		}
44
	}
45
}
46
47
if ($allow_query) {
48 42b0c921 Phil Davis
	if (isset($config['system']['ipv6allow'])) {
49 e4a496ae Phil Davis
		$inet_version = "";
50 42b0c921 Phil Davis
	} else {
51 e4a496ae Phil Davis
		$inet_version = " -4";
52 42b0c921 Phil Davis
	}
53 5c8843d5 jim-p
54 e4a496ae Phil Davis
	exec("/usr/local/sbin/ntpq -pn $inet_version | /usr/bin/tail +3", $ntpq_output);
55 25890c50 jim-p
56 c56d07dc nagyrobi
	$ntpq_servers = array();
57
	foreach ($ntpq_output as $line) {
58
		$server = array();
59 fbb652ed jim-p
		$status_char = substr($line, 0, 1);
60
		$line = substr($line, 1);
61
		$peerinfo = preg_split("/[\s\t]+/", $line);
62
63
		$server['server'] = $peerinfo[0];
64
		$server['refid'] = $peerinfo[1];
65
		$server['stratum'] = $peerinfo[2];
66
		$server['type'] = $peerinfo[3];
67
		$server['when'] = $peerinfo[4];
68
		$server['poll'] = $peerinfo[5];
69
		$server['reach'] = $peerinfo[6];
70
		$server['delay'] = $peerinfo[7];
71
		$server['offset'] = $peerinfo[8];
72
		$server['jitter'] = $peerinfo[9];
73 c56d07dc nagyrobi
74 fbb652ed jim-p
		switch ($status_char) {
75 c56d07dc nagyrobi
			case " ":
76 fbb652ed jim-p
				if ($server['refid'] == ".POOL.") {
77
					$server['status'] = gettext("Pool Placeholder");
78
				} else {
79
					$server['status'] = gettext("Unreach/Pending");
80
				}
81 c56d07dc nagyrobi
				break;
82
			case "*":
83 3bd74348 bruno
				$server['status'] = gettext("Active Peer");
84 c56d07dc nagyrobi
				break;
85
			case "+":
86 3bd74348 bruno
				$server['status'] = gettext("Candidate");
87 c56d07dc nagyrobi
				break;
88
			case "o":
89 3bd74348 bruno
				$server['status'] = gettext("PPS Peer");
90 c56d07dc nagyrobi
				break;
91
			case "#":
92 3bd74348 bruno
				$server['status'] = gettext("Selected");
93 c56d07dc nagyrobi
				break;
94
			case ".":
95 3bd74348 bruno
				$server['status'] = gettext("Excess Peer");
96 c56d07dc nagyrobi
				break;
97
			case "x":
98 3bd74348 bruno
				$server['status'] = gettext("False Ticker");
99 c56d07dc nagyrobi
				break;
100
			case "-":
101 3bd74348 bruno
				$server['status'] = gettext("Outlier");
102 c56d07dc nagyrobi
				break;
103
		}
104
105
		$ntpq_servers[] = $server;
106
	}
107
108 62a407da Phil Davis
	exec("/usr/local/sbin/ntpq -c clockvar $inet_version", $ntpq_clockvar_output);
109 c56d07dc nagyrobi
	foreach ($ntpq_clockvar_output as $line) {
110
		if (substr($line, 0, 9) == "timecode=") {
111
			$tmp = explode('"', $line);
112
			$tmp = $tmp[1];
113
			if (substr($tmp, 0, 6) == '$GPRMC') {
114
				$gps_vars = explode(",", $tmp);
115 6c07db48 Phil Davis
				$gps_ok = ($gps_vars[2] == "A");
116 c56d07dc nagyrobi
				$gps_lat_deg = substr($gps_vars[3], 0, 2);
117 d627983d jskyboo
				$gps_lat_min = substr($gps_vars[3], 2);
118 c56d07dc nagyrobi
				$gps_lon_deg = substr($gps_vars[5], 0, 3);
119 d627983d jskyboo
				$gps_lon_min = substr($gps_vars[5], 3);
120 c92dbfc1 jim-p
				$gps_lat = (float) $gps_lat_deg + $gps_lat_min / 60.0;
121 c56d07dc nagyrobi
				$gps_lat = $gps_lat * (($gps_vars[4] == "N") ? 1 : -1);
122 c92dbfc1 jim-p
				$gps_lon = (float) $gps_lon_deg + $gps_lon_min / 60.0;
123 c56d07dc nagyrobi
				$gps_lon = $gps_lon * (($gps_vars[6] == "E") ? 1 : -1);
124 d627983d jskyboo
				$gps_lat_dir = $gps_vars[4];
125
				$gps_lon_dir = $gps_vars[6];
126 42b0c921 Phil Davis
			} elseif (substr($tmp, 0, 6) == '$GPGGA') {
127 c56d07dc nagyrobi
				$gps_vars = explode(",", $tmp);
128 6c07db48 Phil Davis
				$gps_ok = $gps_vars[6];
129 c56d07dc nagyrobi
				$gps_lat_deg = substr($gps_vars[2], 0, 2);
130 d627983d jskyboo
				$gps_lat_min = substr($gps_vars[2], 2);
131 c56d07dc nagyrobi
				$gps_lon_deg = substr($gps_vars[4], 0, 3);
132 d627983d jskyboo
				$gps_lon_min = substr($gps_vars[4], 3);
133 c92dbfc1 jim-p
				$gps_lat = (float) $gps_lat_deg + $gps_lat_min / 60.0;
134 c56d07dc nagyrobi
				$gps_lat = $gps_lat * (($gps_vars[3] == "N") ? 1 : -1);
135 c92dbfc1 jim-p
				$gps_lon = (float) $gps_lon_deg + $gps_lon_min / 60.0;
136 c56d07dc nagyrobi
				$gps_lon = $gps_lon * (($gps_vars[5] == "E") ? 1 : -1);
137
				$gps_alt = $gps_vars[9];
138
				$gps_alt_unit = $gps_vars[10];
139 fdb04797 jskyboo
				$gps_sat = (int)$gps_vars[7];
140 d627983d jskyboo
				$gps_lat_dir = $gps_vars[3];
141
				$gps_lon_dir = $gps_vars[5];
142 42b0c921 Phil Davis
			} elseif (substr($tmp, 0, 6) == '$GPGLL') {
143 fdb04797 jskyboo
				$gps_vars = preg_split('/[,\*]+/', $tmp);
144 6c07db48 Phil Davis
				$gps_ok = ($gps_vars[6] == "A");
145 c56d07dc nagyrobi
				$gps_lat_deg = substr($gps_vars[1], 0, 2);
146 d627983d jskyboo
				$gps_lat_min = substr($gps_vars[1], 2);
147 c56d07dc nagyrobi
				$gps_lon_deg = substr($gps_vars[3], 0, 3);
148 d627983d jskyboo
				$gps_lon_min = substr($gps_vars[3], 3);
149 c92dbfc1 jim-p
				$gps_lat = (float) $gps_lat_deg + $gps_lat_min / 60.0;
150 c56d07dc nagyrobi
				$gps_lat = $gps_lat * (($gps_vars[2] == "N") ? 1 : -1);
151 c92dbfc1 jim-p
				$gps_lon = (float) $gps_lon_deg + $gps_lon_min / 60.0;
152 c56d07dc nagyrobi
				$gps_lon = $gps_lon * (($gps_vars[4] == "E") ? 1 : -1);
153 d627983d jskyboo
				$gps_lat_dir = $gps_vars[2];
154
				$gps_lon_dir = $gps_vars[4];
155 6924a2bf jskyboo
			} elseif (substr($tmp, 0, 6) == '$PGRMF') {
156
				$gps_vars = preg_split('/[,\*]+/', $tmp);
157
				$gps_ok = $gps_vars[11];
158
				$gps_lat_deg = substr($gps_vars[6], 0, 2);
159
				$gps_lat_min = substr($gps_vars[6], 2);
160
				$gps_lon_deg = substr($gps_vars[8], 0, 3);
161
				$gps_lon_min = substr($gps_vars[8], 3);
162 c92dbfc1 jim-p
				$gps_lat = (float) $gps_lat_deg + $gps_lat_min / 60.0;
163 6924a2bf jskyboo
				$gps_lat = $gps_lat * (($gps_vars[7] == "N") ? 1 : -1);
164 c92dbfc1 jim-p
				$gps_lon = (float) $gps_lon_deg + $gps_lon_min / 60.0;
165 6924a2bf jskyboo
				$gps_lon = $gps_lon * (($gps_vars[9] == "E") ? 1 : -1);
166
				$gps_lat_dir = $gps_vars[7];
167
				$gps_lon_dir = $gps_vars[9];
168 c56d07dc nagyrobi
			}
169
		}
170 25890c50 jim-p
	}
171 e078c882 jim-p
}
172
173 d627983d jskyboo
if (isset($gps_ok) && isset($config['ntpd']['gps']['extstatus']) && ($config['ntpd']['gps']['nmeaset']['gpgsv'] || $config['ntpd']['gps']['nmeaset']['gpgga'])) {
174
	$lookfor['GPGSV'] = $config['ntpd']['gps']['nmeaset']['gpgsv'];
175
	$lookfor['GPGGA'] = !isset($gps_sat) && $config['ntpd']['gps']['nmeaset']['gpgga'];
176
	$gpsport = fopen('/dev/gps0', 'r+');
177
	while ($gpsport && ($lookfor['GPGSV'] || $lookfor['GPGGA'])) {
178 c56d07dc nagyrobi
		$buffer = fgets($gpsport);
179 d627983d jskyboo
		if ($lookfor['GPGSV'] && substr($buffer, 0, 6) == '$GPGSV') {
180 6c07db48 Phil Davis
			$gpgsv = explode(',', $buffer);
181 d627983d jskyboo
			$gps_satview = (int)$gpgsv[3];
182
			$lookfor['GPGSV'] = 0;
183
		} elseif ($lookfor['GPGGA'] && substr($buffer, 0, 6) == '$GPGGA') {
184
			$gpgga = explode(',', $buffer);
185
			$gps_sat = (int)$gpgga[7];
186
			$gps_alt = $gpgga[9];
187
			$gps_alt_unit = $gpgga[10];
188
			$lookfor['GPGGA'] = 0;
189 5c8843d5 jim-p
		}
190
	}
191
}
192
193 0cdf72ef Stephen Beaver
// Responding to an AJAX call, we return the GPS data or the status data depending on $_REQUEST['dogps']
194
if ($_REQUEST['ajax']) {
195
196
	if ($_REQUEST['dogps'] == "yes") {
197
		print_gps();
198
	} else {
199
		print_status();
200
	}
201
202
	exit;
203
}
204
205
function print_status() {
206 d73918f2 Nano Caiordo
	global $config, $ntpq_servers, $allow_query;
207 0cdf72ef Stephen Beaver
208 d73918f2 Nano Caiordo
	if (!$allow_query):
209 0cdf72ef Stephen Beaver
210
		print("<tr>\n");
211
		print('<td class="warning" colspan="11">');
212 702fa4d0 Phil Davis
		printf(gettext('Statistics unavailable because ntpq and ntpdc queries are disabled in the %1$sNTP service settings%2$s'), '<a href="services_ntpd.php">', '</a>');
213 0cdf72ef Stephen Beaver
		print("</td>\n");
214
		print("</tr>\n");
215
	elseif (count($ntpq_servers) == 0):
216
		print("<tr>\n");
217
		print('<td class="warning" colspan="11">');
218 702fa4d0 Phil Davis
		printf(gettext('No peers found, %1$sis the ntp service running?%2$s'), '<a href="status_services.php">', '</a>');
219 0cdf72ef Stephen Beaver
		print("</td>\n");
220
		print("</tr>\n");
221
	else:
222
223
		$i = 0;
224
		foreach ($ntpq_servers as $server):
225
			print("<tr>\n");
226
			print("<td>" . $server['status'] . "</td>\n");
227
			print("<td>" . $server['server'] . "</td>\n");
228
			print("<td>" . $server['refid'] . "</td>\n");
229
			print("<td>" . $server['stratum'] . "</td>\n");
230
			print("<td>" . $server['type'] . "</td>\n");
231
			print("<td>" . $server['when'] . "</td>\n");
232
			print("<td>" . $server['poll'] . "</td>\n");
233
			print("<td>" . $server['reach'] . "</td>\n");
234
			print("<td>" . $server['delay'] . "</td>\n");
235
			print("<td>" . $server['offset'] . "</td>\n");
236
			print("<td>" . $server['jitter'] . "</td>\n");
237
			print("</tr>\n");
238
			$i++;
239
		endforeach;
240
	endif;
241
}
242
243
function print_gps() {
244 d627983d jskyboo
	global 	$gps_lat, $gps_lon, $gps_lat_deg, $gps_lon_deg, $gps_lat_min, $gps_lon_min, $gps_lat_dir, $gps_lon_dir,
245 0cdf72ef Stephen Beaver
			$gps_alt, $gps_alt_unit, $gps_sat, $gps_satview, $gps_goo_lnk;
246
247
	print("<tr>\n");
248
	print("<td>\n");
249 ef268b48 Stephen Beaver
	printf("%.5f", $gps_lat);
250 0cdf72ef Stephen Beaver
	print(" (");
251 ef268b48 Stephen Beaver
	printf("%d%s", $gps_lat_deg, "&deg;");
252 d627983d jskyboo
	printf("%.5f", $gps_lat_min);
253
	print($gps_lat_dir);
254 0cdf72ef Stephen Beaver
	print(")");
255
	print("</td>\n");
256
	print("<td>\n");
257 ef268b48 Stephen Beaver
	printf("%.5f", $gps_lon);
258 0cdf72ef Stephen Beaver
	print(" (");
259 ef268b48 Stephen Beaver
	printf("%d%s", $gps_lon_deg, "&deg;");
260 d627983d jskyboo
	printf("%.5f", $gps_lon_min);
261
	print($gps_lon_dir);
262 0cdf72ef Stephen Beaver
	print(")");
263
	print("</td>\n");
264
265
	if (isset($gps_alt)) {
266 ef268b48 Stephen Beaver
		print("<td>\n");
267
		print($gps_alt . ' ' . $gps_alt_unit);
268
		print("</td>\n");
269 0cdf72ef Stephen Beaver
	}
270
271
	if (isset($gps_sat) || isset($gps_satview)) {
272 fdb04797 jskyboo
		print('<td>');
273 0cdf72ef Stephen Beaver
274
		if (isset($gps_satview)) {
275
			print(gettext('in view ') . intval($gps_satview));
276
		}
277
278
		if (isset($gps_sat) && isset($gps_satview)) {
279
			print(', ');
280
		}
281
		if (isset($gps_sat)) {
282
			print(gettext('in use ') . $gps_sat);
283
		}
284
285
		print("</td>\n");
286
	}
287
288
	print("</tr>\n");
289
	print("<tr>\n");
290
	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>');
291
	print("</tr>\n");
292
}
293
294 6c07db48 Phil Davis
$pgtitle = array(gettext("Status"), gettext("NTP"));
295 b32dd0a6 jim-p
$shortcut_section = "ntp";
296 8dff26ce sbeaver
297 e078c882 jim-p
include("head.inc");
298
?>
299 8dff26ce sbeaver
300
<div class="panel panel-default">
301 3bd74348 bruno
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Network Time Protocol Status");?></h2></div>
302 8dff26ce sbeaver
	<div class="panel-body">
303 10fe1eb5 Stephen Beaver
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap" data-sortable>
304 8dff26ce sbeaver
			<thead>
305
				<tr>
306 0cdf72ef Stephen Beaver
					<th><?=gettext("Status")?></th>
307
					<th><?=gettext("Server")?></th>
308
					<th><?=gettext("Ref ID")?></th>
309
					<th><?=gettext("Stratum")?></th>
310
					<th><?=gettext("Type")?></th>
311
					<th><?=gettext("When")?></th>
312
					<th><?=gettext("Poll")?></th>
313
					<th><?=gettext("Reach")?></th>
314
					<th><?=gettext("Delay")?></th>
315
					<th><?=gettext("Offset")?></th>
316
					<th><?=gettext("Jitter")?></th>
317 8dff26ce sbeaver
				</tr>
318
			</thead>
319 0cdf72ef Stephen Beaver
			<tbody id="ntpbody">
320
				<?=print_status()?>
321 8dff26ce sbeaver
			</tbody>
322
		</table>
323
	</div>
324
</div>
325
326
327
<?php
328
329 0cdf72ef Stephen Beaver
$showgps = 0;
330
331 8dff26ce sbeaver
// GPS satellite information (if available)
332
if (($gps_ok) && ($gps_lat) && ($gps_lon)):
333 c33f2391 Phil Davis
	$gps_goo_lnk = 2;
334 0cdf72ef Stephen Beaver
	$showgps = 1;
335 c33f2391 Phil Davis
?>
336 8dff26ce sbeaver
337 c33f2391 Phil Davis
<div class="panel panel-default">
338 3d7a8696 k-paulius
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("GPS Information");?></h2></div>
339 c33f2391 Phil Davis
	<div class="panel-body">
340
		<table class="table table-striped table-hover table-condensed">
341
			<thead>
342 8dff26ce sbeaver
				<tr>
343 0cdf72ef Stephen Beaver
					<th><?=gettext("Clock Latitude")?></th>
344
					<th><?=gettext("Clock Longitude")?></th>
345 c33f2391 Phil Davis
<?php
346
	if (isset($gps_alt)) {
347
?>
348 0cdf72ef Stephen Beaver
					<th><?=gettext("Clock Altitude")?></th>
349 c33f2391 Phil Davis
<?php
350
		$gps_goo_lnk++;
351
	}
352 8dff26ce sbeaver
353 c33f2391 Phil Davis
	if (isset($gps_sat) || isset($gps_satview)) {
354
?>
355 0cdf72ef Stephen Beaver
					<th><?=gettext("Satellites")?></th>
356 c33f2391 Phil Davis
<?php
357
		$gps_goo_lnk++;
358
	}
359
?>
360
				</tr>
361
			</thead>
362 8dff26ce sbeaver
363 0cdf72ef Stephen Beaver
			<tbody id="gpsbody">
364
				<?=print_gps()?>
365
			</tbody>
366
		</table>
367
	</div>
368
</div>
369 8dff26ce sbeaver
370 c33f2391 Phil Davis
<?php
371 0cdf72ef Stephen Beaver
endif;
372 c33f2391 Phil Davis
?>
373 8dff26ce sbeaver
374 0cdf72ef Stephen Beaver
<script type="text/javascript">
375
//<![CDATA[
376
events.push(function() {
377
	ajax_lock = false;		// Mutex so we don't make a call until the previous call is finished
378
	do_gps = "no";
379 8dff26ce sbeaver
380 0cdf72ef Stephen Beaver
	// Fetch the tbody contents from the server
381
	function update_tables() {
382
383
		if (ajax_lock) {
384
			return;
385 c33f2391 Phil Davis
		}
386 0cdf72ef Stephen Beaver
387
		ajax_lock = true;
388
389
		ajaxRequest = $.ajax(
390
			{
391
				url: "/status_ntpd.php",
392
				type: "post",
393
				data: {
394
					ajax: 	"ajax",
395
					dogps:  do_gps
396
				}
397
			}
398
		);
399
400
		// Deal with the results of the above ajax call
401
		ajaxRequest.done(function (response, textStatus, jqXHR) {
402
			if (do_gps == "yes") {
403
				$('#gpsbody').html(response);
404
			} else {
405
				$('#ntpbody').html(response);
406
			}
407
408
			ajax_lock = false;
409
410 adaa4d03 Stephen Beaver
			// Alternate updating the status table and the gps table (if enabled)
411 0cdf72ef Stephen Beaver
			if ((do_gps == "yes") || ("<?=$showgps?>" != 1)) {
412
				do_gps = "no";
413
			} else {
414 adaa4d03 Stephen Beaver
				do_gps = "yes";
415 0cdf72ef Stephen Beaver
			}
416
417
			// and do it again
418
			setTimeout(update_tables, 5000);
419
		});
420
421
422 c33f2391 Phil Davis
	}
423 8dff26ce sbeaver
424 0cdf72ef Stephen Beaver
	// Populate the tbody on page load
425
	update_tables();
426
});
427
//]]>
428
</script>
429 8dff26ce sbeaver
430 0cdf72ef Stephen Beaver
<?php
431 c33f2391 Phil Davis
include("foot.inc");
432
?>