Project

General

Profile

Download (8.88 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
	status_ntpd.php
5
	part of pfSense (https://www.pfsense.org/)
6

    
7
	Copyright (C) 2013 Dagorlad
8
	Copyright (C) 2012 Jim Pingle
9
	Copyright (C) 2013-2015 Electric Sheep Fencing, LP
10
	All rights reserved.
11

    
12
	Redistribution and use in source and binary forms, with or without
13
	modification, are permitted provided that the following conditions are met:
14

    
15
	1. Redistributions of source code must retain the above copyright notice,
16
	   this list of conditions and the following disclaimer.
17

    
18
	2. Redistributions in binary form must reproduce the above copyright
19
	   notice, this list of conditions and the following disclaimer in the
20
	   documentation and/or other materials provided with the distribution.
21

    
22
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
23
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
24
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
26
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
	POSSIBILITY OF SUCH DAMAGE.
32
*/
33
/*
34
	pfSense_BUILDER_BINARIES:	/usr/local/sbin/ntpd	/usr/local/sbin/ntpq
35
	pfSense_MODULE: ntpd
36
*/
37

    
38
##|+PRIV
39
##|*IDENT=page-status-ntp
40
##|*NAME=Status: NTP page
41
##|*DESCR=Allow access to the 'Status: NTP' page.
42
##|*MATCH=status_ntpd.php*
43
##|-PRIV
44

    
45
require_once("guiconfig.inc");
46

    
47
if (!isset($config['ntpd']['noquery'])) {
48
	if (isset($config['system']['ipv6allow'])) {
49
		$inet_version = "";
50
	} else {
51
		$inet_version = " -4";
52
	}
53

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

    
56
	$ntpq_servers = array();
57
	foreach ($ntpq_output as $line) {
58
		$server = array();
59

    
60
		switch (substr($line, 0, 1)) {
61
			case " ":
62
				$server['status'] = "Unreach/Pending";
63
				break;
64
			case "*":
65
				$server['status'] = "Active Peer";
66
				break;
67
			case "+":
68
				$server['status'] = "Candidate";
69
				break;
70
			case "o":
71
				$server['status'] = "PPS Peer";
72
				break;
73
			case "#":
74
				$server['status'] = "Selected";
75
				break;
76
			case ".":
77
				$server['status'] = "Excess Peer";
78
				break;
79
			case "x":
80
				$server['status'] = "False Ticker";
81
				break;
82
			case "-":
83
				$server['status'] = "Outlier";
84
				break;
85
		}
86

    
87
		$line = substr($line, 1);
88
		$peerinfo = preg_split("/[\s\t]+/", $line);
89

    
90
		$server['server'] = $peerinfo[0];
91
		$server['refid'] = $peerinfo[1];
92
		$server['stratum'] = $peerinfo[2];
93
		$server['type'] = $peerinfo[3];
94
		$server['when'] = $peerinfo[4];
95
		$server['poll'] = $peerinfo[5];
96
		$server['reach'] = $peerinfo[6];
97
		$server['delay'] = $peerinfo[7];
98
		$server['offset'] = $peerinfo[8];
99
		$server['jitter'] = $peerinfo[9];
100

    
101
		$ntpq_servers[] = $server;
102
	}
103

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

    
150
if (isset($config['ntpd']['gps']['type']) && ($config['ntpd']['gps']['type'] == 'SureGPS') && (isset($gps_ok))) {
151
	//GSV message is only enabled by init commands in services_ntpd_gps.php for SureGPS board
152
	$gpsport = fopen("/dev/gps0", "r+");
153
	while ($gpsport) {
154
		$buffer = fgets($gpsport);
155
		if (substr($buffer, 0, 6) == '$GPGSV') {
156
			//echo $buffer."\n";
157
			$gpgsv = explode(',', $buffer);
158
			$gps_satview = $gpgsv[3];
159
			break;
160
		}
161
	}
162
}
163

    
164
$pgtitle = array(gettext("Status"), gettext("NTP"));
165
$shortcut_section = "ntp";
166

    
167
include("head.inc");
168
?>
169

    
170
<div class="panel panel-default">
171
	<div class="panel-heading"><h2 class="panel-title">Network Time Protocol Status</h2></div>
172
	<div class="panel-body">
173
		<table class="table table-striped table-hover table-condensed">
174
			<thead>
175
				<tr>
176
					<th><?=gettext("Status"); ?></th>
177
					<th><?=gettext("Server"); ?></th>
178
					<th><?=gettext("Ref ID"); ?></th>
179
					<th><?=gettext("Stratum"); ?></th>
180
					<th><?=gettext("Type"); ?></th>
181
					<th><?=gettext("When"); ?></th>
182
					<th><?=gettext("Poll"); ?></th>
183
					<th><?=gettext("Reach"); ?></th>
184
					<th><?=gettext("Delay"); ?></th>
185
					<th><?=gettext("Offset"); ?></th>
186
					<th><?=gettext("Jitter"); ?></th>
187
				</tr>
188
			</thead>
189
			<tbody>
190
				<?php if (isset($config['ntpd']['noquery'])): ?>
191
				<tr>
192
					<td class="warning" colspan="11">
193
						Statistics unavailable because ntpq and ntpdc queries are disabled in the <a href="services_ntpd.php">NTP service settings</a>.
194
					</td>
195
				</tr>
196
				<?php elseif (count($ntpq_servers) == 0): ?>
197
				<tr>
198
					<td class="warning" colspan="11">
199
						No peers found, <a href="status_services.php">is the ntp service running?</a>
200
					</td>
201
				</tr>
202
				<?php else:
203

    
204
					$i = 0;
205
					foreach ($ntpq_servers as $server): ?>
206
						<tr>
207
							<td><?=$server['status']?></td>
208
							<td><?=$server['server']?></td>
209
							<td><?=$server['refid']?></td>
210
							<td><?=$server['stratum']?></td>
211
							<td><?=$server['type']?></td>
212
							<td><?=$server['when']?></td>
213
							<td><?=$server['poll']?></td>
214
							<td><?=$server['reach']?></td>
215
							<td><?=$server['delay']?></td>
216
							<td><?=$server['offset']?></td>
217
							<td><?=$server['jitter']?></td>
218
						</tr> <?php
219
					   $i++;
220
				   endforeach;
221
			   endif;
222
?>
223
			</tbody>
224
		</table>
225
	</div>
226
</div>
227

    
228

    
229
<?php
230

    
231
// GPS satellite information (if available)
232
if (($gps_ok) && ($gps_lat) && ($gps_lon)):
233
	$gps_goo_lnk = 2; ?>
234

    
235
	<div class="panel panel-default">
236
		<div class="panel-heading"><h2 class="panel-title">GPS information</h2></div>
237
		<div class="panel-body">
238
			<table class="table table-striped table-hover table-condensed">
239
				<thead>
240
				<tr>
241
					<th>
242
						 <?=gettext("Clock Latitude"); ?>
243
					</th>
244
					<th>
245
						<?=gettext("Clock Longitude"); ?>
246
					</th>
247
					<?php if (isset($gps_alt)) { ?>
248
						 <th>
249
							 <?=gettext("Clock Altitude")?>
250
						 </th>
251
						 <?php $gps_goo_lnk++;
252
					 }
253

    
254
					 if (isset($gps_sat) || isset($gps_satview)) { ?>
255
						<th>
256
							<?=gettext("Satellites")?>
257
						</th> <?php
258
						$gps_goo_lnk++;
259
					 }?>
260
					</tr>
261
				</thead>
262

    
263
				<tbody>
264
					<tr>
265
						<td>
266
							<?=printf("%.5f", $gps_lat); ?> (<?=printf("%d", $gps_lat_deg); ?>&deg; <?=printf("%.5f", $gps_lat_min*60); ?><?=$gps_vars[4]; ?>)
267
						</td>
268
						<td>
269
							<?=printf("%.5f", $gps_lon); ?> (<?=printf("%d", $gps_lon_deg); ?>&deg; <?=printf("%.5f", $gps_lon_min*60); ?><?=$gps_vars[6]; ?>)
270
						</td>
271

    
272
						<?php if (isset($gps_alt)) { ?>
273
							<td>
274
								<?=$gps_alt . ' ' . $gps_alt_unit?>
275
							</td>
276
							}
277

    
278
						if (isset($gps_sat) || isset($gps_satview)) { ?>
279
							<td align="center"> <?php
280
								if (isset($gps_satview)) {
281
									print('in view ' . intval($gps_satview));
282
								}
283

    
284
							if (isset($gps_sat) && isset($gps_satview)) {
285
								print(', ');
286
							}
287
							if (isset($gps_sat)) {
288
								print('in use ' . $gps_sat);
289
							} ?>
290
							</td> <?php
291
						}
292
						?>
293
					</tr>
294
					<tr>
295
						<td colspan="<?=$gps_goo_lnk; ?>"><a target="_gmaps" href="http://maps.google.com/?q=<?=$gps_lat; ?>,<?=$gps_lon; ?>">Google Maps Link</a></td>
296
					</tr>
297
				</tbody>
298
			</table>
299
		</div>
300
	</div>
301

    
302
<?php	endif;
303

    
304
include("foot.inc"); ?>
(178-178/235)