Getting ntp status page to work without globally allowing queries



  • the status_ntpd.php page will only work if you globally allow queries, I modified the code in a patch so it does not carry out the check, this means if you dont have an ACL to allow it for localhost you will get some kind of error, but for those who want this behaviour I am pasting the patch.

    I didnt submit this as I think its not clean enough, its probable any proper solution would still need to generate the proper error page so basically a proper solution would need to check if an ACL is enabling access.

    --- status_ntpd.php.orig        2017-08-06 23:16:40.585209000 +0100
    +++ status_ntpd.php     2017-08-06 23:27:51.295867000 +0100
    @@ -33,128 +33,127 @@
    
     require_once("guiconfig.inc");
    
    -if (!isset($config['ntpd']['noquery'])) {
    -       if (isset($config['system']['ipv6allow'])) {
    -               $inet_version = "";
    -       } else {
    -               $inet_version = " -4";
    -       }
    -
    -       exec("/usr/local/sbin/ntpq -pn $inet_version | /usr/bin/tail +3", $ntpq_output);
    +//if (!isset($config['ntpd']['noquery'])) {
    +if (isset($config['system']['ipv6allow'])) {
    +       $inet_version = "";
    +} else {
    +       $inet_version = " -4";
    +}
    
    -       $ntpq_servers = array();
    -       foreach ($ntpq_output as $line) {
    -               $server = array();
    -               $status_char = substr($line, 0, 1);
    -               $line = substr($line, 1);
    -               $peerinfo = preg_split("/[\s\t]+/", $line);
    -
    -               $server['server'] = $peerinfo[0];
    -               $server['refid'] = $peerinfo[1];
    -               $server['stratum'] = $peerinfo[2];
    -               $server['type'] = $peerinfo[3];
    -               $server['when'] = $peerinfo[4];
    -               $server['poll'] = $peerinfo[5];
    -               $server['reach'] = $peerinfo[6];
    -               $server['delay'] = $peerinfo[7];
    -               $server['offset'] = $peerinfo[8];
    -               $server['jitter'] = $peerinfo[9];
    -
    -               switch ($status_char) {
    -                       case " ":
    -                               if ($server['refid'] == ".POOL.") {
    -                                       $server['status'] = gettext("Pool Placeholder");
    -                               } else {
    -                                       $server['status'] = gettext("Unreach/Pending");
    -                               }
    -                               break;
    -                       case "*":
    -                               $server['status'] = gettext("Active Peer");
    -                               break;
    -                       case "+":
    -                               $server['status'] = gettext("Candidate");
    -                               break;
    -                       case "o":
    -                               $server['status'] = gettext("PPS Peer");
    -                               break;
    -                       case "#":
    -                               $server['status'] = gettext("Selected");
    -                               break;
    -                       case ".":
    -                               $server['status'] = gettext("Excess Peer");
    -                               break;
    -                       case "x":
    -                               $server['status'] = gettext("False Ticker");
    -                               break;
    -                       case "-":
    -                               $server['status'] = gettext("Outlier");
    -                               break;
    -               }
    +exec("/usr/local/sbin/ntpq -pn $inet_version | /usr/bin/tail +3", $ntpq_output);
    
    -               $ntpq_servers[] = $server;
    +$ntpq_servers = array();
    +foreach ($ntpq_output as $line) {
    +       $server = array();
    +       $status_char = substr($line, 0, 1);
    +       $line = substr($line, 1);
    +       $peerinfo = preg_split("/[\s\t]+/", $line);
    +
    +       $server['server'] = $peerinfo[0];
    +       $server['refid'] = $peerinfo[1];
    +       $server['stratum'] = $peerinfo[2];
    +       $server['type'] = $peerinfo[3];
    +       $server['when'] = $peerinfo[4];
    +       $server['poll'] = $peerinfo[5];
    +       $server['reach'] = $peerinfo[6];
    +       $server['delay'] = $peerinfo[7];
    +       $server['offset'] = $peerinfo[8];
    +       $server['jitter'] = $peerinfo[9];
    +
    +       switch ($status_char) {
    +               case " ":
    +                       if ($server['refid'] == ".POOL.") {
    +                               $server['status'] = gettext("Pool Placeholder");
    +                       } else {
    +                               $server['status'] = gettext("Unreach/Pending");
    +                       }
    +                       break;
    +               case "*":
    +                       $server['status'] = gettext("Active Peer");
    +                       break;
    +               case "+":
    +                       $server['status'] = gettext("Candidate");
    +                       break;
    +               case "o":
    +                       $server['status'] = gettext("PPS Peer");
    +                       break;
    +               case "#":
    +                       $server['status'] = gettext("Selected");
    +                       break;
    +               case ".":
    +                       $server['status'] = gettext("Excess Peer");
    +                       break;
    +               case "x":
    +                       $server['status'] = gettext("False Ticker");
    +                       break;
    +               case "-":
    +                       $server['status'] = gettext("Outlier");
    +                       break;
            }
    
    -       exec("/usr/local/sbin/ntpq -c clockvar $inet_version", $ntpq_clockvar_output);
    -       foreach ($ntpq_clockvar_output as $line) {
    -               if (substr($line, 0, 9) == "timecode=") {
    -                       $tmp = explode('"', $line);
    -                       $tmp = $tmp[1];
    -                       if (substr($tmp, 0, 6) == '$GPRMC') {
    -                               $gps_vars = explode(",", $tmp);
    -                               $gps_ok = ($gps_vars[2] == "A");
    -                               $gps_lat_deg = substr($gps_vars[3], 0, 2);
    -                               $gps_lat_min = substr($gps_vars[3], 2);
    -                               $gps_lon_deg = substr($gps_vars[5], 0, 3);
    -                               $gps_lon_min = substr($gps_vars[5], 3);
    -                               $gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
    -                               $gps_lat = $gps_lat * (($gps_vars[4] == "N") ? 1 : -1);
    -                               $gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
    -                               $gps_lon = $gps_lon * (($gps_vars[6] == "E") ? 1 : -1);
    -                               $gps_lat_dir = $gps_vars[4];
    -                               $gps_lon_dir = $gps_vars[6];
    -                       } elseif (substr($tmp, 0, 6) == '$GPGGA') {
    -                               $gps_vars = explode(",", $tmp);
    -                               $gps_ok = $gps_vars[6];
    -                               $gps_lat_deg = substr($gps_vars[2], 0, 2);
    -                               $gps_lat_min = substr($gps_vars[2], 2);
    -                               $gps_lon_deg = substr($gps_vars[4], 0, 3);
    -                               $gps_lon_min = substr($gps_vars[4], 3);
    -                               $gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
    -                               $gps_lat = $gps_lat * (($gps_vars[3] == "N") ? 1 : -1);
    -                               $gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
    -                               $gps_lon = $gps_lon * (($gps_vars[5] == "E") ? 1 : -1);
    -                               $gps_alt = $gps_vars[9];
    -                               $gps_alt_unit = $gps_vars[10];
    -                               $gps_sat = (int)$gps_vars[7];
    -                               $gps_lat_dir = $gps_vars[3];
    -                               $gps_lon_dir = $gps_vars[5];
    -                       } elseif (substr($tmp, 0, 6) == '$GPGLL') {
    -                               $gps_vars = preg_split('/[,\*]+/', $tmp);
    -                               $gps_ok = ($gps_vars[6] == "A");
    -                               $gps_lat_deg = substr($gps_vars[1], 0, 2);
    -                               $gps_lat_min = substr($gps_vars[1], 2);
    -                               $gps_lon_deg = substr($gps_vars[3], 0, 3);
    -                               $gps_lon_min = substr($gps_vars[3], 3);
    -                               $gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
    -                               $gps_lat = $gps_lat * (($gps_vars[2] == "N") ? 1 : -1);
    -                               $gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
    -                               $gps_lon = $gps_lon * (($gps_vars[4] == "E") ? 1 : -1);
    -                               $gps_lat_dir = $gps_vars[2];
    -                               $gps_lon_dir = $gps_vars[4];
    -                       } elseif (substr($tmp, 0, 6) == '$PGRMF') {
    -                               $gps_vars = preg_split('/[,\*]+/', $tmp);
    -                               $gps_ok = $gps_vars[11];
    -                               $gps_lat_deg = substr($gps_vars[6], 0, 2);
    -                               $gps_lat_min = substr($gps_vars[6], 2);
    -                               $gps_lon_deg = substr($gps_vars[8], 0, 3);
    -                               $gps_lon_min = substr($gps_vars[8], 3);
    -                               $gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
    -                               $gps_lat = $gps_lat * (($gps_vars[7] == "N") ? 1 : -1);
    -                               $gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
    -                               $gps_lon = $gps_lon * (($gps_vars[9] == "E") ? 1 : -1);
    -                               $gps_lat_dir = $gps_vars[7];
    -                               $gps_lon_dir = $gps_vars[9];
    -                       }
    +       $ntpq_servers[] = $server;
    +}
    +
    +exec("/usr/local/sbin/ntpq -c clockvar $inet_version", $ntpq_clockvar_output);
    +foreach ($ntpq_clockvar_output as $line) {
    +       if (substr($line, 0, 9) == "timecode=") {
    +               $tmp = explode('"', $line);
    +               $tmp = $tmp[1];
    +               if (substr($tmp, 0, 6) == '$GPRMC') {
    +                       $gps_vars = explode(",", $tmp);
    +                       $gps_ok = ($gps_vars[2] == "A");
    +                       $gps_lat_deg = substr($gps_vars[3], 0, 2);
    +                       $gps_lat_min = substr($gps_vars[3], 2);
    +                       $gps_lon_deg = substr($gps_vars[5], 0, 3);
    +                       $gps_lon_min = substr($gps_vars[5], 3);
    +                       $gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
    +                       $gps_lat = $gps_lat * (($gps_vars[4] == "N") ? 1 : -1);
    +                       $gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
    +                       $gps_lon = $gps_lon * (($gps_vars[6] == "E") ? 1 : -1);
    +                       $gps_lat_dir = $gps_vars[4];
    +                       $gps_lon_dir = $gps_vars[6];
    +               } elseif (substr($tmp, 0, 6) == '$GPGGA') {
    +                       $gps_vars = explode(",", $tmp);
    +                       $gps_ok = $gps_vars[6];
    +                       $gps_lat_deg = substr($gps_vars[2], 0, 2);
    +                       $gps_lat_min = substr($gps_vars[2], 2);
    +                       $gps_lon_deg = substr($gps_vars[4], 0, 3);
    +                       $gps_lon_min = substr($gps_vars[4], 3);
    +                       $gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
    +                       $gps_lat = $gps_lat * (($gps_vars[3] == "N") ? 1 : -1);
    +                       $gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
    +                       $gps_lon = $gps_lon * (($gps_vars[5] == "E") ? 1 : -1);
    +                       $gps_alt = $gps_vars[9];
    +                       $gps_alt_unit = $gps_vars[10];
    +                       $gps_sat = (int)$gps_vars[7];
    +                       $gps_lat_dir = $gps_vars[3];
    +                       $gps_lon_dir = $gps_vars[5];
    +               } elseif (substr($tmp, 0, 6) == '$GPGLL') {
    +                       $gps_vars = preg_split('/[,\*]+/', $tmp);
    +                       $gps_ok = ($gps_vars[6] == "A");
    +                       $gps_lat_deg = substr($gps_vars[1], 0, 2);
    +                       $gps_lat_min = substr($gps_vars[1], 2);
    +                       $gps_lon_deg = substr($gps_vars[3], 0, 3);
    +                       $gps_lon_min = substr($gps_vars[3], 3);
    +                       $gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
    +                       $gps_lat = $gps_lat * (($gps_vars[2] == "N") ? 1 : -1);
    +                       $gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
    +                       $gps_lon = $gps_lon * (($gps_vars[4] == "E") ? 1 : -1);
    +                       $gps_lat_dir = $gps_vars[2];
    +                       $gps_lon_dir = $gps_vars[4];
    +               } elseif (substr($tmp, 0, 6) == '$PGRMF') {
    +                       $gps_vars = preg_split('/[,\*]+/', $tmp);
    +                       $gps_ok = $gps_vars[11];
    +                       $gps_lat_deg = substr($gps_vars[6], 0, 2);
    +                       $gps_lat_min = substr($gps_vars[6], 2);
    +                       $gps_lon_deg = substr($gps_vars[8], 0, 3);
    +                       $gps_lon_min = substr($gps_vars[8], 3);
    +                       $gps_lat = $gps_lat_deg + $gps_lat_min / 60.0;
    +                       $gps_lat = $gps_lat * (($gps_vars[7] == "N") ? 1 : -1);
    +                       $gps_lon = $gps_lon_deg + $gps_lon_min / 60.0;
    +                       $gps_lon = $gps_lon * (($gps_vars[9] == "E") ? 1 : -1);
    +                       $gps_lat_dir = $gps_vars[7];
    +                       $gps_lon_dir = $gps_vars[9];
                    }
            }
     }
    @@ -194,14 +193,14 @@
     function print_status() {
            global $config, $ntpq_servers;
    
    -       if (isset($config['ntpd']['noquery'])):
    +//     if (isset($config['ntpd']['noquery'])):
    
    -               print("\n");
    -               print('');
    -               printf(gettext('Statistics unavailable because ntpq and ntpdc queries are disabled in the %1$sNTP service settings%2$s'), '[', '](services_ntpd.php)');
    -               print("\n");
    -               print("\n");
    -       elseif (count($ntpq_servers) == 0):
    +//             print("\n");
    +//             print('');
    +//             printf(gettext('Statistics unavailable because ntpq and ntpdc queries are disabled in the %1$sNTP service settings%2$s'), '[', '](services_ntpd.php)');
    +//             print("\n");
    +//             print("\n");
    +       if (count($ntpq_servers) == 0):
                    print("\n");
                    print('');
                    printf(gettext('No peers found, %1$sis the ntp service running?%2$s'), '[', '](status_services.php)');
    


  • Same problem exists in 2.3.x.  I opened Bug 7609 https://redmine.pfsense.org/issues/7609 a few months back. See if you think it's the same problem.



  • yep thats the same problem.


Log in to reply