Project

General

Profile

Download (11.9 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
 * Redistribution and use in source and binary forms, with or without
15
 * modification, are permitted provided that the following conditions are met:
16
 *
17
 * 1. Redistributions of source code must retain the above copyright notice,
18
 *    this list of conditions and the following disclaimer.
19
 *
20
 * 2. Redistributions in binary form must reproduce the above copyright
21
 *    notice, this list of conditions and the following disclaimer in
22
 *    the documentation and/or other materials provided with the
23
 *    distribution.
24
 *
25
 * 3. All advertising materials mentioning features or use of this software
26
 *    must display the following acknowledgment:
27
 *    "This product includes software developed by the pfSense Project
28
 *    for use in the pfSense® software distribution. (http://www.pfsense.org/).
29
 *
30
 * 4. The names "pfSense" and "pfSense Project" must not be used to
31
 *    endorse or promote products derived from this software without
32
 *    prior written permission. For written permission, please contact
33
 *    coreteam@pfsense.org.
34
 *
35
 * 5. Products derived from this software may not be called "pfSense"
36
 *    nor may "pfSense" appear in their names without prior written
37
 *    permission of the Electric Sheep Fencing, LLC.
38
 *
39
 * 6. Redistributions of any form whatsoever must retain the following
40
 *    acknowledgment:
41
 *
42
 * "This product includes software developed by the pfSense Project
43
 * for use in the pfSense software distribution (http://www.pfsense.org/).
44
 *
45
 * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
46
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
48
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR
49
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
51
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
52
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
54
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
55
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
56
 * OF THE POSSIBILITY OF SUCH DAMAGE.
57
 */
58

    
59
##|+PRIV
60
##|*IDENT=page-status-ntp
61
##|*NAME=Status: NTP
62
##|*DESCR=Allow access to the 'Status: NTP' page.
63
##|*MATCH=status_ntpd.php*
64
##|-PRIV
65

    
66
require_once("guiconfig.inc");
67

    
68
if (!isset($config['ntpd']['noquery'])) {
69
	if (isset($config['system']['ipv6allow'])) {
70
		$inet_version = "";
71
	} else {
72
		$inet_version = " -4";
73
	}
74

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

    
77
	$ntpq_servers = array();
78
	foreach ($ntpq_output as $line) {
79
		$server = array();
80

    
81
		switch (substr($line, 0, 1)) {
82
			case " ":
83
				$server['status'] = gettext("Unreach/Pending");
84
				break;
85
			case "*":
86
				$server['status'] = gettext("Active Peer");
87
				break;
88
			case "+":
89
				$server['status'] = gettext("Candidate");
90
				break;
91
			case "o":
92
				$server['status'] = gettext("PPS Peer");
93
				break;
94
			case "#":
95
				$server['status'] = gettext("Selected");
96
				break;
97
			case ".":
98
				$server['status'] = gettext("Excess Peer");
99
				break;
100
			case "x":
101
				$server['status'] = gettext("False Ticker");
102
				break;
103
			case "-":
104
				$server['status'] = gettext("Outlier");
105
				break;
106
		}
107

    
108
		$line = substr($line, 1);
109
		$peerinfo = preg_split("/[\s\t]+/", $line);
110

    
111
		$server['server'] = $peerinfo[0];
112
		$server['refid'] = $peerinfo[1];
113
		$server['stratum'] = $peerinfo[2];
114
		$server['type'] = $peerinfo[3];
115
		$server['when'] = $peerinfo[4];
116
		$server['poll'] = $peerinfo[5];
117
		$server['reach'] = $peerinfo[6];
118
		$server['delay'] = $peerinfo[7];
119
		$server['offset'] = $peerinfo[8];
120
		$server['jitter'] = $peerinfo[9];
121

    
122
		$ntpq_servers[] = $server;
123
	}
124

    
125
	exec("/usr/local/sbin/ntpq -c clockvar $inet_version", $ntpq_clockvar_output);
126
	foreach ($ntpq_clockvar_output as $line) {
127
		if (substr($line, 0, 9) == "timecode=") {
128
			$tmp = explode('"', $line);
129
			$tmp = $tmp[1];
130
			if (substr($tmp, 0, 6) == '$GPRMC') {
131
				$gps_vars = explode(",", $tmp);
132
				$gps_ok = ($gps_vars[2] == "A");
133
				$gps_lat_deg = substr($gps_vars[3], 0, 2);
134
				$gps_lat_min = substr($gps_vars[3], 2) / 60.0;
135
				$gps_lon_deg = substr($gps_vars[5], 0, 3);
136
				$gps_lon_min = substr($gps_vars[5], 3) / 60.0;
137
				$gps_lat = $gps_lat_deg + $gps_lat_min;
138
				$gps_lat = $gps_lat * (($gps_vars[4] == "N") ? 1 : -1);
139
				$gps_lon = $gps_lon_deg + $gps_lon_min;
140
				$gps_lon = $gps_lon * (($gps_vars[6] == "E") ? 1 : -1);
141
				$gps_la = $gps_vars[4];
142
				$gps_lo = $gps_vars[6];
143
			} elseif (substr($tmp, 0, 6) == '$GPGGA') {
144
				$gps_vars = explode(",", $tmp);
145
				$gps_ok = $gps_vars[6];
146
				$gps_lat_deg = substr($gps_vars[2], 0, 2);
147
				$gps_lat_min = substr($gps_vars[2], 2) / 60.0;
148
				$gps_lon_deg = substr($gps_vars[4], 0, 3);
149
				$gps_lon_min = substr($gps_vars[4], 3) / 60.0;
150
				$gps_lat = $gps_lat_deg + $gps_lat_min;
151
				$gps_lat = $gps_lat * (($gps_vars[3] == "N") ? 1 : -1);
152
				$gps_lon = $gps_lon_deg + $gps_lon_min;
153
				$gps_lon = $gps_lon * (($gps_vars[5] == "E") ? 1 : -1);
154
				$gps_alt = $gps_vars[9];
155
				$gps_alt_unit = $gps_vars[10];
156
				$gps_sat = (int)$gps_vars[7];
157
				$gps_la = $gps_vars[3];
158
				$gps_lo = $gps_vars[5];
159
			} elseif (substr($tmp, 0, 6) == '$GPGLL') {
160
				$gps_vars = preg_split('/[,\*]+/', $tmp);
161
				$gps_ok = ($gps_vars[6] == "A");
162
				$gps_lat_deg = substr($gps_vars[1], 0, 2);
163
				$gps_lat_min = substr($gps_vars[1], 2) / 60.0;
164
				$gps_lon_deg = substr($gps_vars[3], 0, 3);
165
				$gps_lon_min = substr($gps_vars[3], 3) / 60.0;
166
				$gps_lat = $gps_lat_deg + $gps_lat_min;
167
				$gps_lat = $gps_lat * (($gps_vars[2] == "N") ? 1 : -1);
168
				$gps_lon = $gps_lon_deg + $gps_lon_min;
169
				$gps_lon = $gps_lon * (($gps_vars[4] == "E") ? 1 : -1);
170
				$gps_la = $gps_vars[2];
171
				$gps_lo = $gps_vars[4];
172
			}
173
		}
174
	}
175
}
176

    
177
if (isset($config['ntpd']['gps']['type']) && ($config['ntpd']['gps']['type'] == 'SureGPS') && (isset($gps_ok))) {
178
	//GSV message is only enabled by init commands in services_ntpd_gps.php for SureGPS board
179
	$gpsport = fopen("/dev/gps0", "r+");
180
	while ($gpsport) {
181
		$buffer = fgets($gpsport);
182
		if (substr($buffer, 0, 6) == '$GPGSV') {
183
			//echo $buffer."\n";
184
			$gpgsv = explode(',', $buffer);
185
			$gps_satview = $gpgsv[3];
186
			break;
187
		}
188
	}
189
}
190

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

    
194
	if ($_REQUEST['dogps'] == "yes") {
195
		print_gps();
196
	} else {
197
		print_status();
198
	}
199

    
200
	exit;
201
}
202

    
203
function print_status() {
204
	global $config, $ntpq_servers;
205

    
206
	if (isset($config['ntpd']['noquery'])):
207

    
208
		print("<tr>\n");
209
		print('<td class="warning" colspan="11">');
210
		printf(gettext("Statistics unavailable because ntpq and ntpdc queries are disabled in the %sNTP service settings%s"), '<a href="services_ntpd.php">', '</a>');
211
		print("</td>\n");
212
		print("</tr>\n");
213
	elseif (count($ntpq_servers) == 0):
214
		print("<tr>\n");
215
		print('<td class="warning" colspan="11">');
216
		printf(gettext("No peers found, %sis the ntp service running?%s"), '<a href="status_services.php">', '</a>');
217
		print("</td>\n");
218
		print("</tr>\n");
219
	else:
220

    
221
		$i = 0;
222
		foreach ($ntpq_servers as $server):
223
			print("<tr>\n");
224
			print("<td>" . $server['status'] . "</td>\n");
225
			print("<td>" . $server['server'] . "</td>\n");
226
			print("<td>" . $server['refid'] . "</td>\n");
227
			print("<td>" . $server['stratum'] . "</td>\n");
228
			print("<td>" . $server['type'] . "</td>\n");
229
			print("<td>" . $server['when'] . "</td>\n");
230
			print("<td>" . $server['poll'] . "</td>\n");
231
			print("<td>" . $server['reach'] . "</td>\n");
232
			print("<td>" . $server['delay'] . "</td>\n");
233
			print("<td>" . $server['offset'] . "</td>\n");
234
			print("<td>" . $server['jitter'] . "</td>\n");
235
			print("</tr>\n");
236
			$i++;
237
		endforeach;
238
	endif;
239
}
240

    
241
function print_gps() {
242
	global 	$gps_lat, $gps_lon, $gps_lat_deg, $gps_lon_deg, $gps_lat_min, $gps_lon_min, $gps_la, $gps_lo,
243
			$gps_alt, $gps_alt_unit, $gps_sat, $gps_satview, $gps_goo_lnk;
244

    
245
	print("<tr>\n");
246
	print("<td>\n");
247
	printf("%.5f", $gps_lat);
248
	print(" (");
249
	printf("%d%s", $gps_lat_deg, "&deg;");
250
	printf("%.5f", $gps_lat_min*60);
251
	print($gps_la);
252
	print(")");
253
	print("</td>\n");
254
	print("<td>\n");
255
	printf("%.5f", $gps_lon);
256
	print(" (");
257
	printf("%d%s", $gps_lon_deg, "&deg;");
258
	printf("%.5f", $gps_lon_min*60);
259
	print($gps_lo);
260
	print(")");
261
	print("</td>\n");
262

    
263
	if (isset($gps_alt)) {
264
		print("<td>\n");
265
		print($gps_alt . ' ' . $gps_alt_unit);
266
		print("</td>\n");
267
	}
268

    
269
	if (isset($gps_sat) || isset($gps_satview)) {
270
		print('<td>');
271

    
272
		if (isset($gps_satview)) {
273
			print(gettext('in view ') . intval($gps_satview));
274
		}
275

    
276
		if (isset($gps_sat) && isset($gps_satview)) {
277
			print(', ');
278
		}
279
		if (isset($gps_sat)) {
280
			print(gettext('in use ') . $gps_sat);
281
		}
282

    
283
		print("</td>\n");
284
	}
285

    
286
	print("</tr>\n");
287
	print("<tr>\n");
288
	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>');
289
	print("</tr>\n");
290
}
291

    
292
$pgtitle = array(gettext("Status"), gettext("NTP"));
293
$shortcut_section = "ntp";
294

    
295
include("head.inc");
296
?>
297

    
298
<div class="panel panel-default">
299
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Network Time Protocol Status");?></h2></div>
300
	<div class="panel-body">
301
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap" data-sortable>
302
			<thead>
303
				<tr>
304
					<th><?=gettext("Status")?></th>
305
					<th><?=gettext("Server")?></th>
306
					<th><?=gettext("Ref ID")?></th>
307
					<th><?=gettext("Stratum")?></th>
308
					<th><?=gettext("Type")?></th>
309
					<th><?=gettext("When")?></th>
310
					<th><?=gettext("Poll")?></th>
311
					<th><?=gettext("Reach")?></th>
312
					<th><?=gettext("Delay")?></th>
313
					<th><?=gettext("Offset")?></th>
314
					<th><?=gettext("Jitter")?></th>
315
				</tr>
316
			</thead>
317
			<tbody id="ntpbody">
318
				<?=print_status()?>
319
			</tbody>
320
		</table>
321
	</div>
322
</div>
323

    
324

    
325
<?php
326

    
327
$showgps = 0;
328

    
329
// GPS satellite information (if available)
330
if (($gps_ok) && ($gps_lat) && ($gps_lon)):
331
	$gps_goo_lnk = 2;
332
	$showgps = 1;
333
?>
334

    
335
<div class="panel panel-default">
336
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("GPS Information");?></h2></div>
337
	<div class="panel-body">
338
		<table class="table table-striped table-hover table-condensed">
339
			<thead>
340
				<tr>
341
					<th><?=gettext("Clock Latitude")?></th>
342
					<th><?=gettext("Clock Longitude")?></th>
343
<?php
344
	if (isset($gps_alt)) {
345
?>
346
					<th><?=gettext("Clock Altitude")?></th>
347
<?php
348
		$gps_goo_lnk++;
349
	}
350

    
351
	if (isset($gps_sat) || isset($gps_satview)) {
352
?>
353
					<th><?=gettext("Satellites")?></th>
354
<?php
355
		$gps_goo_lnk++;
356
	}
357
?>
358
				</tr>
359
			</thead>
360

    
361
			<tbody id="gpsbody">
362
				<?=print_gps()?>
363
			</tbody>
364
		</table>
365
	</div>
366
</div>
367

    
368
<?php
369
endif;
370
?>
371

    
372
<script type="text/javascript">
373
//<![CDATA[
374
events.push(function() {
375
	ajax_lock = false;		// Mutex so we don't make a call until the previous call is finished
376
	do_gps = "no";
377

    
378
	// Fetch the tbody contents from the server
379
	function update_tables() {
380

    
381
		if (ajax_lock) {
382
			return;
383
		}
384

    
385
		ajax_lock = true;
386

    
387
		ajaxRequest = $.ajax(
388
			{
389
				url: "/status_ntpd.php",
390
				type: "post",
391
				data: {
392
					ajax: 	"ajax",
393
					dogps:  do_gps
394
				}
395
			}
396
		);
397

    
398
		// Deal with the results of the above ajax call
399
		ajaxRequest.done(function (response, textStatus, jqXHR) {
400
			if (do_gps == "yes") {
401
				$('#gpsbody').html(response);
402
			} else {
403
				$('#ntpbody').html(response);
404
			}
405

    
406
			ajax_lock = false;
407

    
408
			// Alternate updating the status table and the gps table (if enabled)
409
			if ((do_gps == "yes") || ("<?=$showgps?>" != 1)) {
410
				do_gps = "no";
411
			} else {
412
				do_gps = "yes";
413
			}
414

    
415
			// and do it again
416
			setTimeout(update_tables, 5000);
417
		});
418

    
419

    
420
	}
421

    
422
	// Populate the tbody on page load
423
	update_tables();
424
});
425
//]]>
426
</script>
427

    
428
<?php
429
include("foot.inc");
430
?>
(179-179/227)