Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Getting ntp status page to work without globally allowing queries

    Scheduled Pinned Locked Moved 2.4 Development Snapshots
    3 Posts 2 Posters 754 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      chrcoluk
      last edited by

      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)');
      

      pfSense CE 2.8.0

      1 Reply Last reply Reply Quote 0
      • J
        jclear
        last edited by

        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.

        1 Reply Last reply Reply Quote 0
        • C
          chrcoluk
          last edited by

          yep thats the same problem.

          pfSense CE 2.8.0

          1 Reply Last reply Reply Quote 0
          • First post
            Last post
          Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.