Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ExtremeFiretop/153cf1e1aab74a7e9010079da575c9b4 to your computer and use it in GitHub Desktop.
Save ExtremeFiretop/153cf1e1aab74a7e9010079da575c9b4 to your computer and use it in GitHub Desktop.
/jffs/scripts/ntpmerlin generate
Admin@GT-BE98_Pro:/tmp/home/root# /jffs/scripts/ntpmerlin generate
+ readonly SCRIPT_NAME=ntpMerlin
+ echo ntpMerlin
+ + trsed A-Z s/d// a-z
+ readonly SCRIPT_NAME_LOWER=ntpmerlin
+ readonly SCRIPT_VERSION=v3.4.7
+ readonly SCRIPT_VERSTAG=25052712
+ SCRIPT_BRANCH=master
+ SCRIPT_REPO=https://raw.githubusercontent.com/AMTM-OSR/ntpMerlin/master
+ readonly SCRIPT_DIR=/jffs/addons/ntpmerlin.d
+ readlink -f /www/user
+ readonly SCRIPT_WEBPAGE_DIR=/tmp/var/wwwext
+ readonly SCRIPT_WEB_DIR=/tmp/var/wwwext/ntpmerlin
+ readonly SHARED_DIR=/jffs/addons/shared-jy
+ readonly SHARED_REPO=https://raw.githubusercontent.com/AMTM-OSR/shared-jy/master
+ readonly SHARED_WEB_DIR=/tmp/var/wwwext/shared-jy
+ readonly TEMP_MENU_TREE=/tmp/menuTree.js
+ nvram get odmpid
+ [ -z GT-BE98_Pro ]
+ nvram get odmpid
+ ROUTER_MODEL=GT-BE98_Pro
+ [ -f /opt/bin/sqlite3 ]
+ SQLITE3_PATH=/opt/bin/sqlite3
+ readonly scriptVersRegExp=v[0-9]{1,2}([.][0-9]{1,2})([.][0-9]{1,2})
+ readonly webPageMenuAddons=menuName: "Addons",
+ readonly webPageHelpSupprt=tabName: "Help & Support"},
+ readonly webPageFileRegExp=user([1-9]|[1-2][0-9])[.]asp
+ readonly webPageLineTabExp=\{url: "user([1-9]|[1-2][0-9])[.]asp", tabName:
+ readonly webPageLineRegExp=\{url: "user([1-9]|[1-2][0-9])[.]asp", tabName: "ntpMerlin"\},
+ readonly BEGIN_MenuAddOnsTag=/\*\*BEGIN:_AddOns_\*\*/
+ readonly ENDIN_MenuAddOnsTag=/\*\*ENDIN:_AddOns_\*\*/
+ readonly scriptVERINFO=[v3.4.7_25052712, Branch: master]
+ readonly defTrimDB_Hour=3
+ readonly defTrimDB_Mins=7
+ readonly oneHrSec=3600
+ readonly _12Hours=43200
+ readonly _24Hours=86400
+ readonly _36Hours=129600
+ readonly oneKByte=1024
+ readonly oneMByte=1048576
+ readonly ei8MByte=8388608
+ readonly ni9MByte=9437184
+ readonly tenMByte=10485760
+ readonly oneGByte=1073741824
+ readonly SHARE_TEMP_DIR=/opt/share/tmp
+ readonly CRIT=\e[41m
+ readonly ERR=\e[31m
+ readonly WARN=\e[33m
+ readonly PASS=\e[32m
+ readonly BOLD=\e[1m
+ readonly SETTING=\e[1m\e[36m
+ readonly CLEARFORMAT=\e[0m
+ readonly CLRct=\e[0m
+ readonly REDct=\e[1;31m
+ readonly GRNct=\e[1;32m
+ readonly CritIREDct=\e[41m
+ readonly CritBREDct=\e[30;101m
+ readonly PassBGRNct=\e[30;102m
+ readonly WarnBYLWct=\e[30;103m
+ readonly WarnIMGNct=\e[45m
+ readonly WarnBMGNct=\e[30;105m
+ export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/opt/bin:/opt/sbin:/bin:/usr/bin:/sbin:/usr/sbin:/rom/scripts:/home/Admin:/mmc/sbin:/mmc/bin:/mmc/usr/sbin:/mmc/usr/bin:/opt/sbin:/opt/bin:/opt/usr/sbin:/opt/usr/bin
+ TMPDIR=/opt/share/tmp
+ SQLITE_TMPDIR=/opt/share/tmp
+ export SQLITE_TMPDIR TMPDIR
+ [ -f /opt/share/ntpmerlin.d/config ]
+ SCRIPT_STORAGE_DIR=/jffs/addons/ntpmerlin.d
+ SCRIPT_CONF=/jffs/addons/ntpmerlin.d/config
+ NTPDSTATS_DB=/jffs/addons/ntpmerlin.d/ntpdstats.db
+ CSV_OUTPUT_DIR=/jffs/addons/ntpmerlin.d/csv
+ JFFS_LowFreeSpaceStatus=OK
+ [ master != develop ]
+ SCRIPT_VERS_INFO=
+ [ 1 -eq 0 ]
+ [ -z generate ]
+ NTP_Ready
+ local theSleepDelay=15 ntpMaxWaitSecs=600 ntpWaitSecs
+ nvram get ntp_ready
+ [ 1 -eq 0 ]
+ Entware_Ready
+ local theSleepDelay=5 maxSleepTimer=120 sleepTimerSecs
+ [ ! -f /opt/bin/opkg ]
+ Check_Lock
+ [ -f /tmp/ntpMerlin.lock ]
+ echo 2708
+ return 0
+ Get_TimeServer_Stats
+ [ ! -f /opt/bin/xargs ]
+ [ -n 15879 ]
+ ps
+ grep -v grep
+ grep -v 2708
+ xargs kill -9
+ + grepgrep generate -v
15879
+ awk+ grep -i ntpMerlin
{print $1}
+ Create_Dirs
+ [ ! -d /jffs/addons/ntpmerlin.d ]
+ [ ! -d /jffs/addons/ntpmerlin.d ]
+ [ ! -d /jffs/addons/ntpmerlin.d/csv ]
+ [ ! -d /jffs/addons/shared-jy ]
+ [ ! -d /tmp/var/wwwext ]
+ [ ! -d /tmp/var/wwwext/ntpmerlin ]
+ [ ! -d /opt/share/tmp ]
+ Conf_Exists
+ [ -f /jffs/addons/ntpmerlin.d/config ]
+ dos2unix /jffs/addons/ntpmerlin.d/config
+ chmod 0644 /jffs/addons/ntpmerlin.d/config
+ sed -i -e s/"//g /jffs/addons/ntpmerlin.d/config
+ grep -q OUTPUTDATAMODE /jffs/addons/ntpmerlin.d/config
+ grep -q ^OUTPUTTIMEMODE= /jffs/addons/ntpmerlin.d/config
+ grep -q ^DAYSTOKEEP= /jffs/addons/ntpmerlin.d/config
+ grep -q ^LASTXRESULTS= /jffs/addons/ntpmerlin.d/config
+ grep -q ^STORAGELOCATION= /jffs/addons/ntpmerlin.d/config
+ grep -q ^JFFS_MSGLOGTIME= /jffs/addons/ntpmerlin.d/config
+ grep -q ^TIMESERVER= /jffs/addons/ntpmerlin.d/config
+ return 0
+ Auto_Startup create
+ Auto_Cron create
+ Auto_ServiceEvent create
+ NTP_Firmware_Check
+ nvram get ntpd_enable
+ ENABLED_NTPD=0
+ Validate_Number 0
+ [ 0 -eq 0 ]
+ return 0
+ [ 0 -eq 1 ]
+ return 0
+ ScriptStorageLocation load
+ ScriptStorageLocation check
+ grep ^STORAGELOCATION= /jffs/addons/ntpmerlin.d/config
+ cut -f2 -d=
+ STORAGELOCATION=jffs
+ echo jffs
+ STORAGELOCATION=jffs
+ [ jffs = usb ]
+ [ jffs = jffs ]
+ SCRIPT_STORAGE_DIR=/jffs/addons/ntpmerlin.d
+ chmod 777 /jffs/addons/ntpmerlin.d
+ NTPDSTATS_DB=/jffs/addons/ntpmerlin.d/ntpdstats.db
+ CSV_OUTPUT_DIR=/jffs/addons/ntpmerlin.d/csv
+ [ 1 -gt 1 ]
+ Create_Symlinks
+ rm -rf /tmp/var/wwwext/ntpmerlin/config.htm /tmp/var/wwwext/ntpmerlin/csv /tmp/var/wwwext/ntpmerlin/detect_ntpmerlin.js /tmp/var/wwwext/ntpmerlin/lastx.htm /tmp/var/wwwext/ntpmerlin/ntpstatstext.js
+ ln -s /tmp/detect_ntpmerlin.js /tmp/var/wwwext/ntpmerlin/detect_ntpmerlin.js
+ ln -s /jffs/addons/ntpmerlin.d/ntpstatstext.js /tmp/var/wwwext/ntpmerlin/ntpstatstext.js
+ ln -s /jffs/addons/ntpmerlin.d/lastx.csv /tmp/var/wwwext/ntpmerlin/lastx.htm
+ ln -s /jffs/addons/ntpmerlin.d/config /tmp/var/wwwext/ntpmerlin/config.htm
+ ln -s /jffs/addons/ntpmerlin.d/csv /tmp/var/wwwext/ntpmerlin/csv
+ [ ! -d /tmp/var/wwwext/shared-jy ]
+ echo var ntpstatus = "InProgress";
+ killall ntp
+ TimeServer check
+ grep ^TIMESERVER= /jffs/addons/ntpmerlin.d/config
+ cut -f2 -d=
+ TIMESERVER=ntpd
+ echo ntpd
+ TIMESERVER=ntpd
+ [ ntpd = ntpd ]
+ tmpfile=/tmp/ntp-stats.2708
+ ntpq -4 -c rv
+ awk BEGIN{ RS=","}{ print }
+ grep offset /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ [ -n +7.995672 ]
+ grep offset /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ NOFFSET=+7.995672
+ grep frequency /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ [ -n +0.000 ]
+ grep frequency /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ NFREQ=+0.000
+ grep sys_jitter /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ [ -n 2.068067 ]
+ grep sys_jitter /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ NSJIT=2.068067
+ grep clk_jitter /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ [ -n 3.798 ]
+ grep clk_jitter /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ NCJIT=3.798
+ grep clk_wander /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ [ -n 0.000 ]
+ grep clk_wander /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ NWANDER=0.000
+ grep rootdisp /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ [ -n 207.738 ]
+ grep rootdisp /tmp/ntp-stats.2708
+ awk BEGIN{FS="="}{print $2}
+ NDISPER=207.738
+ rm -f /tmp/ntp-stats.2708
+ cat /etc/TZ
+ TZ=EST5DST,M3.2.0/2,M11.1.0/2
+ export TZ
+ date +%s
+ timenow=1749046051
+ date +%c
+ timenowfriendly=Wed Jun 4 10:07:31 2025
+ Process_Upgrade
+ local foundError foundLocked resultStr doUpdateDB=false
+ rm -f /jffs/addons/ntpmerlin.d/.tableupgraded
+ [ ! -f /jffs/addons/ntpmerlin.d/.chronyugraded ]
+ TimeServer check
+ grep ^TIMESERVER= /jffs/addons/ntpmerlin.d/config
+ cut -f2 -d=
+ TIMESERVER=ntpd
+ echo ntpd
+ [ ntpd = chronyd ]
+ [ ! -f /jffs/addons/ntpmerlin.d/.indexcreated ]
+ [ ! -f /jffs/addons/ntpmerlin.d/lastx.csv ]
+ [ ! -f /jffs/addons/ntpmerlin.d/ntpstatstext.js ]
+ false
+ echo PRAGMA temp_store=1;
+ echo PRAGMA journal_mode=TRUNCATE;
+ echo CREATE TABLE IF NOT EXISTS [ntpstats] ([StatID] INTEGER PRIMARY KEY NOT NULL,[Timestamp] NUMERIC NOT NULL,[Offset] REAL NOT NULL,[Frequency] REAL NOT NULL,[Sys_Jitter] REAL NOT NULL,[Clk_Jitter] REAL NOT NULL,[Clk_Wander] REAL NOT NULL,[Rootdisp] REAL NOT NULL);
+ echo INSERT INTO ntpstats ([Timestamp],[Offset],[Frequency],[Sys_Jitter],[Clk_Jitter],[Clk_Wander],[Rootdisp]) values(1749046051,+7.995672,+0.000,2.068067,3.798,0.000,207.738);
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql tme1
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n tme1 ]
+ callFlag=tme1
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ rm -f /tmp/ntpMerlin-stats.sql
+ echo var ntpstatus = "GenerateCSV";
+ Generate_CSVs
+ Process_Upgrade
+ local foundError foundLocked resultStr doUpdateDB=false
+ rm -f /jffs/addons/ntpmerlin.d/.tableupgraded
+ [ ! -f /jffs/addons/ntpmerlin.d/.chronyugraded ]
+ TimeServer check
+ grep ^TIMESERVER= /jffs/addons/ntpmerlin.d/config
+ cut -f2 -d=
+ TIMESERVER=ntpd
+ echo ntpd
+ [ ntpd = chronyd ]
+ [ ! -f /jffs/addons/ntpmerlin.d/.indexcreated ]
+ [ ! -f /jffs/addons/ntpmerlin.d/lastx.csv ]
+ [ ! -f /jffs/addons/ntpmerlin.d/ntpstatstext.js ]
+ false
+ renice 15 2708
+ OutputTimeMode check
+ grep ^OUTPUTTIMEMODE= /jffs/addons/ntpmerlin.d/config
+ cut -f2 -d=
+ OUTPUTTIMEMODE=unix
+ echo unix
+ OUTPUTTIMEMODE=unix
+ cat /etc/TZ
+ TZ=EST5DST,M3.2.0/2,M11.1.0/2
+ export TZ
+ date +%s
+ timenow=1749046051
+ date +%c
+ timenowfriendly=Wed Jun 4 10:07:31 2025
+ metriclist=Offset Frequency
+ FILENAME=Offset
+ [ Offset = Frequency ]
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_raw_daily.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,[Timestamp] Time,printf('%f', Offset) Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-1 day'))) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr1
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr1 ]
+ callFlag=gnr1
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_raw_weekly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,[Timestamp] Time,printf('%f', Offset) Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-7 day'))) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr2
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr2 ]
+ callFlag=gnr2
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_raw_monthly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,[Timestamp] Time,printf('%f', Offset) Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-30 day'))) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr3
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr3 ]
+ callFlag=gnr3
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Offset ntpstats 1 1 /jffs/addons/ntpmerlin.d/csv/Offset_hour daily /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 1 1
+ awk {printf ((24*$2)/$1)}
+ maxcount=24
+ echo /jffs/addons/ntpmerlin.d/csv/Offset_hour
+ grep -q day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_hour_daily.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,Min(strftime('%s',datetime(strftime('%Y-%m-%d %H:00:00',datetime([Timestamp],'unixepoch'))))) Time,IFNULL(printf('%f',Avg(Offset)),'NaN') Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-24 hour'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch')),strftime('%d',datetime([Timestamp],'unixepoch')),strftime('%H',datetime([Timestamp],'unixepoch')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr4
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr4 ]
+ callFlag=gnr4
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Offset ntpstats 1 7 /jffs/addons/ntpmerlin.d/csv/Offset_hour weekly /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 1 7
+ awk {printf ((24*$2)/$1)}
+ maxcount=168
+ echo /jffs/addons/ntpmerlin.d/csv/Offset_hour
+ grep -q day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_hour_weekly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,Min(strftime('%s',datetime(strftime('%Y-%m-%d %H:00:00',datetime([Timestamp],'unixepoch'))))) Time,IFNULL(printf('%f',Avg(Offset)),'NaN') Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-168 hour'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch')),strftime('%d',datetime([Timestamp],'unixepoch')),strftime('%H',datetime([Timestamp],'unixepoch')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr5
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr5 ]
+ callFlag=gnr5
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Offset ntpstats 1 30 /jffs/addons/ntpmerlin.d/csv/Offset_hour monthly /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 1 30
+ awk {printf ((24*$2)/$1)}
+ maxcount=720
+ echo /jffs/addons/ntpmerlin.d/csv/Offset_hour
+ grep -q day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_hour_monthly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,Min(strftime('%s',datetime(strftime('%Y-%m-%d %H:00:00',datetime([Timestamp],'unixepoch'))))) Time,IFNULL(printf('%f',Avg(Offset)),'NaN') Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-720 hour'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch')),strftime('%d',datetime([Timestamp],'unixepoch')),strftime('%H',datetime([Timestamp],'unixepoch')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr6
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr6 ]
+ callFlag=gnr6
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Offset ntpstats 24 1 /jffs/addons/ntpmerlin.d/csv/Offset_day daily /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 24 1
+ awk {printf ((24*$2)/$1)}
+ maxcount=1
+ echo /jffs/addons/ntpmerlin.d/csv/Offset_day
+ grep -q day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_day_daily.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,Max(strftime('%s',datetime([Timestamp],'unixepoch','localtime','start of day','utc'))) Time,IFNULL(printf('%f',Avg(Offset)),'NaN') Value FROM ntpstats WHERE ([Timestamp] > strftime('%s',datetime(1749046051,'unixepoch','localtime','start of day','utc','+1 day','-1 day'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch','localtime')),strftime('%d',datetime([Timestamp],'unixepoch','localtime')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr7
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr7 ]
+ callFlag=gnr7
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Offset ntpstats 24 7 /jffs/addons/ntpmerlin.d/csv/Offset_day weekly /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 24 7
+ awk {printf ((24*$2)/$1)}
+ maxcount=7
+ echo /jffs/addons/ntpmerlin.d/csv/Offset_day
+ grep -q day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_day_weekly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,Max(strftime('%s',datetime([Timestamp],'unixepoch','localtime','start of day','utc'))) Time,IFNULL(printf('%f',Avg(Offset)),'NaN') Value FROM ntpstats WHERE ([Timestamp] > strftime('%s',datetime(1749046051,'unixepoch','localtime','start of day','utc','+1 day','-7 day'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch','localtime')),strftime('%d',datetime([Timestamp],'unixepoch','localtime')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr8
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr8 ]
+ callFlag=gnr8
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Offset ntpstats 24 30 /jffs/addons/ntpmerlin.d/csv/Offset_day monthly /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 24 30
+ awk {printf ((24*$2)/$1)}
+ maxcount=30
+ + grepecho -q /jffs/addons/ntpmerlin.d/csv/Offset_day day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Offset_day_monthly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Offset' Metric,Max(strftime('%s',datetime([Timestamp],'unixepoch','localtime','start of day','utc'))) Time,IFNULL(printf('%f',Avg(Offset)),'NaN') Value FROM ntpstats WHERE ([Timestamp] > strftime('%s',datetime(1749046051,'unixepoch','localtime','start of day','utc','+1 day','-30 day'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch','localtime')),strftime('%d',datetime([Timestamp],'unixepoch','localtime')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr9
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr9 ]
+ callFlag=gnr9
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ rm -f /jffs/addons/ntpmerlin.d/csv/Offsetdaily.htm
+ rm -f /jffs/addons/ntpmerlin.d/csv/Offsetweekly.htm
+ rm -f /jffs/addons/ntpmerlin.d/csv/Offsetmonthly.htm
+ FILENAME=Frequency
+ [ Frequency = Frequency ]
+ FILENAME=Drift
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_raw_daily.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,[Timestamp] Time,printf('%f', Frequency) Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-1 day'))) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr1
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr1 ]
+ callFlag=gnr1
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_raw_weekly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,[Timestamp] Time,printf('%f', Frequency) Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-7 day'))) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr2
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr2 ]
+ callFlag=gnr2
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_raw_monthly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,[Timestamp] Time,printf('%f', Frequency) Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-30 day'))) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr3
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr3 ]
+ callFlag=gnr3
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Frequency ntpstats 1 1 /jffs/addons/ntpmerlin.d/csv/Drift_hour daily /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 1 1
+ awk {printf ((24*$2)/$1)}
+ maxcount=24
+ + echo /jffs/addons/ntpmerlin.d/csv/Drift_hour
grep -q day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_hour_daily.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,Min(strftime('%s',datetime(strftime('%Y-%m-%d %H:00:00',datetime([Timestamp],'unixepoch'))))) Time,IFNULL(printf('%f',Avg(Frequency)),'NaN') Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-24 hour'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch')),strftime('%d',datetime([Timestamp],'unixepoch')),strftime('%H',datetime([Timestamp],'unixepoch')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr4
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr4 ]
+ callFlag=gnr4
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Frequency ntpstats 1 7 /jffs/addons/ntpmerlin.d/csv/Drift_hour weekly /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 1 7
+ awk {printf ((24*$2)/$1)}
+ maxcount=168
+ echo /jffs/addons/ntpmerlin.d/csv/Drift_hour
+ grep -q day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_hour_weekly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,Min(strftime('%s',datetime(strftime('%Y-%m-%d %H:00:00',datetime([Timestamp],'unixepoch'))))) Time,IFNULL(printf('%f',Avg(Frequency)),'NaN') Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-168 hour'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch')),strftime('%d',datetime([Timestamp],'unixepoch')),strftime('%H',datetime([Timestamp],'unixepoch')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr5
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr5 ]
+ callFlag=gnr5
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Frequency ntpstats 1 30 /jffs/addons/ntpmerlin.d/csv/Drift_hour monthly /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 1 30
+ awk {printf ((24*$2)/$1)}
+ maxcount=720
+ + grepecho -q /jffs/addons/ntpmerlin.d/csv/Drift_hour
day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_hour_monthly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,Min(strftime('%s',datetime(strftime('%Y-%m-%d %H:00:00',datetime([Timestamp],'unixepoch'))))) Time,IFNULL(printf('%f',Avg(Frequency)),'NaN') Value FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-720 hour'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch')),strftime('%d',datetime([Timestamp],'unixepoch')),strftime('%H',datetime([Timestamp],'unixepoch')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr6
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr6 ]
+ callFlag=gnr6
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Frequency ntpstats 24 1 /jffs/addons/ntpmerlin.d/csv/Drift_day daily /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 24 1
+ awk {printf ((24*$2)/$1)}
+ maxcount=1
+ + grepecho -q /jffs/addons/ntpmerlin.d/csv/Drift_day
day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_day_daily.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,Max(strftime('%s',datetime([Timestamp],'unixepoch','localtime','start of day','utc'))) Time,IFNULL(printf('%f',Avg(Frequency)),'NaN') Value FROM ntpstats WHERE ([Timestamp] > strftime('%s',datetime(1749046051,'unixepoch','localtime','start of day','utc','+1 day','-1 day'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch','localtime')),strftime('%d',datetime([Timestamp],'unixepoch','localtime')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr7
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr7 ]
+ callFlag=gnr7
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Frequency ntpstats 24 7 /jffs/addons/ntpmerlin.d/csv/Drift_day weekly /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ echo 24 7
+ awk {printf ((24*$2)/$1)}
+ maxcount=7
+ + grepecho -q /jffs/addons/ntpmerlin.d/csv/Drift_day
day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_day_weekly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,Max(strftime('%s',datetime([Timestamp],'unixepoch','localtime','start of day','utc'))) Time,IFNULL(printf('%f',Avg(Frequency)),'NaN') Value FROM ntpstats WHERE ([Timestamp] > strftime('%s',datetime(1749046051,'unixepoch','localtime','start of day','utc','+1 day','-7 day'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch','localtime')),strftime('%d',datetime([Timestamp],'unixepoch','localtime')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr8
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr8 ]
+ callFlag=gnr8
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ WriteSql_ToFile Frequency ntpstats 24 30 /jffs/addons/ntpmerlin.d/csv/Drift_day monthly /tmp/ntpMerlin-stats.sql 1749046051
+ timenow=1749046051
+ + awkecho {printf ((24*$2)/$1)}
24 30
+ maxcount=30
+ grep -q day
+ echo /jffs/addons/ntpmerlin.d/csv/Drift_day
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/Drift_day_monthly.htm
+ echo PRAGMA temp_store=1;
+ echo SELECT 'Frequency' Metric,Max(strftime('%s',datetime([Timestamp],'unixepoch','localtime','start of day','utc'))) Time,IFNULL(printf('%f',Avg(Frequency)),'NaN') Value FROM ntpstats WHERE ([Timestamp] > strftime('%s',datetime(1749046051,'unixepoch','localtime','start of day','utc','+1 day','-30 day'))) GROUP BY strftime('%m',datetime([Timestamp],'unixepoch','localtime')),strftime('%d',datetime([Timestamp],'unixepoch','localtime')) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-stats.sql gnr9
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr9 ]
+ callFlag=gnr9
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ rm -f /jffs/addons/ntpmerlin.d/csv/Driftdaily.htm
+ rm -f /jffs/addons/ntpmerlin.d/csv/Driftweekly.htm
+ rm -f /jffs/addons/ntpmerlin.d/csv/Driftmonthly.htm
+ rm -f /tmp/ntpMerlin-stats.sql
+ Generate_LastXResults
+ rm -f /jffs/addons/ntpmerlin.d/lastx.htm
+ echo .mode csv
+ echo .output /tmp/ntpMerlin-lastx.csv
+ echo PRAGMA temp_store=1;
+ LastXResults check
+ local MINvalue=5 MAXvalue=100
+ grep ^LASTXRESULTS= /jffs/addons/ntpmerlin.d/config
+ cut -f2 -d=
+ LASTXRESULTS=10
+ echo 10
+ echo SELECT [Timestamp],[Offset],[Frequency] FROM ntpstats ORDER BY [Timestamp] DESC LIMIT 10;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-lastx.sql glx1
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n glx1 ]
+ callFlag=glx1
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ rm -f /tmp/ntpMerlin-lastx.sql
+ sed -i s/"//g /tmp/ntpMerlin-lastx.csv
+ mv -f /tmp/ntpMerlin-lastx.csv /jffs/addons/ntpmerlin.d/lastx.csv
+ echo .mode csv
+ echo .headers on
+ echo .output /jffs/addons/ntpmerlin.d/csv/CompleteResults.htm
+ echo PRAGMA temp_store=1;
+ DaysToKeep check
+ local MINvalue=15 MAXvalue=365
+ cut -f2 -d=
+ grep ^DAYSTOKEEP= /jffs/addons/ntpmerlin.d/config
+ DAYSTOKEEP=30
+ echo 30
+ echo SELECT [Timestamp],[Offset],[Frequency],[Sys_Jitter],[Clk_Jitter],[Clk_Wander],[Rootdisp] FROM ntpstats WHERE ([Timestamp] >= strftime('%s',datetime(1749046051,'unixepoch','-30 day'))) ORDER BY [Timestamp] DESC;
+ _ApplyDatabaseSQLCmds_ /tmp/ntpMerlin-complete.sql gnr10
+ local errorCount=0 maxErrorCount=5 callFlag
+ local triesCount=0 maxTriesCount=25 sqlErrorMsg
+ local tempLogFilePath=/tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 2 -gt 1 ]
+ [ -n gnr10 ]
+ callFlag=gnr10
+ resultStr=
+ foundError=false
+ foundLocked=false
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ [ 0 -lt 5 ]
+ [ 0 -lt 25 ]
+ /opt/bin/sqlite3 /jffs/addons/ntpmerlin.d/ntpdstats.db
+ foundError=false
+ foundLocked=false
+ break
+ rm -f /tmp/ntpMerlinStats_TMP_2708.LOG
+ false
+ false
+ resultStr=completed successfully.
+ false
+ false
+ rm -f /tmp/ntpMerlin-complete.sql
+ dos2unix /jffs/addons/ntpmerlin.d/csv/CompleteResults.htm /jffs/addons/ntpmerlin.d/csv/Drift_day_daily.htm /jffs/addons/ntpmerlin.d/csv/Drift_day_monthly.htm /jffs/addons/ntpmerlin.d/csv/Drift_day_weekly.htm /jffs/addons/ntpmerlin.d/csv/Drift_hour_daily.htm /jffs/addons/ntpmerlin.d/csv/Drift_hour_monthly.htm /jffs/addons/ntpmerlin.d/csv/Drift_hour_weekly.htm /jffs/addons/ntpmerlin.d/csv/Drift_raw_daily.htm /jffs/addons/ntpmerlin.d/csv/Drift_raw_monthly.htm /jffs/addons/ntpmerlin.d/csv/Drift_raw_weekly.htm /jffs/addons/ntpmerlin.d/csv/Offset_day_daily.htm /jffs/addons/ntpmerlin.d/csv/Offset_day_monthly.htm /jffs/addons/ntpmerlin.d/csv/Offset_day_weekly.htm /jffs/addons/ntpmerlin.d/csv/Offset_hour_daily.htm /jffs/addons/ntpmerlin.d/csv/Offset_hour_monthly.htm /jffs/addons/ntpmerlin.d/csv/Offset_hour_weekly.htm /jffs/addons/ntpmerlin.d/csv/Offset_raw_daily.htm /jffs/addons/ntpmerlin.d/csv/Offset_raw_monthly.htm /jffs/addons/ntpmerlin.d/csv/Offset_raw_weekly.htm
+ tmpoutputdir=/tmp/ntpmerlinresults
+ mkdir -p /tmp/ntpmerlinresults
+ mv /jffs/addons/ntpmerlin.d/csv/CompleteResults.htm /tmp/ntpmerlinresults/CompleteResults.htm
+ [ unix = unix ]
+ find /tmp/ntpmerlinresults/ -name *.htm -exec sh -c i="$1"; mv -- "$i" "${i%.htm}.csv" _ {} ;
+ mv /tmp/ntpmerlinresults/CompleteResults.csv /jffs/addons/ntpmerlin.d/csv/CompleteResults.htm
+ rm -f /jffs/addons/ntpmerlin.d/csv/ntpmerlindata.zip
+ rm -rf /tmp/ntpmerlinresults
+ renice 0 2708
+ _UpdateDatabaseFileSizeInfo_
+ local databaseFileSize
+ [ ! -d /jffs/addons/ntpmerlin.d ]
+ _UpdateJFFS_FreeSpaceInfo_
+ local jffsFreeSpaceHR jffsFreeSpace jffsMinxSpace
+ [ ! -d /jffs/addons/ntpmerlin.d ]
+ _Get_JFFS_Space_ FREE HRx
+ local typex total usedx freex totalx
+ local sizeUnits sizeType sizeInfo sizeNum
+ local jffsMountStr jffsUsageStr percentNum percentStr
+ [ 2 -lt 1 ]
+ [ -z FREE ]
+ echo FREE
+ grep -qE ^(ALL|USED|FREE)$
+ sizeType=FREE
+ [ 2 -lt 2 ]
+ [ -z HRx ]
+ echo HRx
+ grep -qE ^(KB|KBP|MBP|GBP|HR|HRx)$
+ sizeUnits=HRx
+ + grep /jffs
mount
+ jffsMountStr=ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13)
+ df -kT /jffs
+ grep -E .*[[:blank:]]+/jffs$
+ jffsUsageStr=ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ [ -z ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13) ]
+ [ -z ubi:jffs2 ubifs 45528 13692 29476 32% /jffs ]
+ echo ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13)
+ grep -qE [[:blank:]]+[(]?ro[[:blank:],]
+ + awk -Fecho ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
{print $2}
+ typex=ubifs
+ echo ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ awk -F {print $3}
+ total=45528
+ echo ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ awk -F {print $4}
+ usedx=13692
+ echo ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ awk -F {print $5}
+ freex=29476
+ totalx=45528
+ [ ubifs = ubifs ]
+ [ 43168 -ne 45528 ]
+ totalx=43168
+ [ FREE = ALL ]
+ df -hT /jffs
+ grep -E .*[[:blank:]]+/jffs$
+ jffsUsageStr=ubi:jffs2 ubifs 44.5M 13.4M 28.8M 32% /jffs
+ echo ubi:jffs2 ubifs 44.5M 13.4M 28.8M 32% /jffs
+ awk -F {print $5}
+ freex=28.8M
+ sizeInfo=28.8MB
+ [ HRx = HR ]
+ echo 28.8MB
+ tr -d .0-9
+ sizeUnits=MB
+ _Get_JFFS_Space_ FREE MBP
+ local typex total usedx freex totalx
+ local sizeUnits sizeType sizeInfo sizeNum
+ local jffsMountStr jffsUsageStr percentNum percentStr
+ [ 2 -lt 1 ]
+ [ -z FREE ]
+ echo FREE
+ grep -qE ^(ALL|USED|FREE)$
+ sizeType=FREE
+ [ 2 -lt 2 ]
+ [ -z MBP ]
+ echo MBP
+ grep -qE ^(KB|KBP|MBP|GBP|HR|HRx)$
+ sizeUnits=MBP
+ mount
+ grep /jffs
+ jffsMountStr=ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13)
+ df+ -kTgrep -E .*[[:blank:]]+/jffs$
/jffs
+ jffsUsageStr=ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ [ -z ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13) ]
+ [ -z ubi:jffs2 ubifs 45528 13692 29476 32% /jffs ]
+ + grep -qE [[:blank:]]+[(]?ro[[:blank:],]
echo ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13)
+ + awk -F {print $2}
echo ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ typex=ubifs
+ echo ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ awk -F {print $3}
+ total=45528
+ echo ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ awk -F {print $4}
+ usedx=13692
+ echo ubi:jffs2 ubifs 45528 13692 29476 32% /jffs
+ awk -F {print $5}
+ freex=29476
+ totalx=45528
+ [ ubifs = ubifs ]
+ [ 43168 -ne 45528 ]
+ totalx=43168
+ [ FREE = ALL ]
+ sizeNum=29476
+ _GetNum_ (29476 * 100 / 43168)
+ echo (29476 * 100 / 43168)
+ awk {print (29476 * 100 / 43168)}
+ printf %.2f 68.2821
+ printf %.1f 68.28
+ percentNum=68.3
+ percentStr=[68.3%]
+ _GetNum_ (29476 / 1024)
+ echo+ (29476 / 1024)awk
{print (29476 / 1024)}
+ printf %.2f 28.7852
+ sizeNum=28.79
+ sizeInfo=28.79MB [68.3%]
+ echo 28.79MB [68.3%]
+ return 0
+ sizeInfo=28.79MB [68.3%]
+ echo 28.79MB [68.3%]
+ return 0
+ jffsFreeSpaceHR=28.79MB [68.3%]
+ _DelVarDefFromJSFile_ jffsAvailableSpace
+ [ 1 -eq 0 ]
+ [ -z jffsAvailableSpace ]
+ local targetJSfile=/jffs/addons/ntpmerlin.d/ntpstatstext.js
+ [ -s /jffs/addons/ntpmerlin.d/ntpstatstext.js ]
+ grep -q ^var jffsAvailableSpace =.* /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ _WriteVarDefToJSFile_ jffsAvailableSpaceStr 28.79MB [68.3%]
+ [ 2 -lt 2 ]
+ [ -z jffsAvailableSpaceStr ]
+ [ -z 28.79MB [68.3%] ]
+ local varValue
+ [ 2 -eq 3 ]
+ varValue='28.79MB [68.3%]'
+ local targetJSfile=/jffs/addons/ntpmerlin.d/ntpstatstext.js
+ [ ! -s /jffs/addons/ntpmerlin.d/ntpstatstext.js ]
+ grep -q ^var jffsAvailableSpaceStr =.* /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ grep -q ^var jffsAvailableSpaceStr = '28.79MB [68.3%]'; /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ sed -i s/^var jffsAvailableSpaceStr =.*/var jffsAvailableSpaceStr = '28.79MB [68.3%]';/ /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ _Get_JFFS_Space_ FREE KB
+ local typex total usedx freex totalx
+ local sizeUnits sizeType sizeInfo sizeNum
+ local jffsMountStr jffsUsageStr percentNum percentStr
+ [ 2 -lt 1 ]
+ [ -z FREE ]
+ echo FREE
+ grep -qE ^(ALL|USED|FREE)$
+ sizeType=FREE
+ [ 2 -lt 2 ]
+ [ -z KB ]
+ echo KB
+ grep -qE ^(KB|KBP|MBP|GBP|HR|HRx)$
+ sizeUnits=KB
+ mount
+ grep /jffs
+ jffsMountStr=ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13)
+ df -kT /jffs
+ grep -E .*[[:blank:]]+/jffs$
+ jffsUsageStr=ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ [ -z ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13) ]
+ [ -z ubi:jffs2 ubifs 45528 13696 29472 32% /jffs ]
+ echo ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13)
+ grep -qE [[:blank:]]+[(]?ro[[:blank:],]
+ echo ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ awk -F {print $2}
+ typex=ubifs
+ echo ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ awk -F {print $3}
+ total=45528
+ echo ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ awk -F {print $4}
+ usedx=13696
+ echo ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ awk -F {print $5}
+ freex=29472
+ totalx=45528
+ [ ubifs = ubifs ]
+ [ 43168 -ne 45528 ]
+ totalx=43168
+ [ FREE = ALL ]
+ sizeNum=29472
+ _GetNum_ (29472 * 100 / 43168)
+ echo (29472 * 100 / 43168)
+ awk {print (29472 * 100 / 43168)}
+ printf %.2f 68.2728
+ printf %.1f 68.27
+ percentNum=68.3
+ percentStr=[68.3%]
+ sizeInfo=29472
+ echo 29472
+ return 0
+ jffsFreeSpace=29472
+ _JFFS_MinReservedFreeSpace_
+ local jffsAllxSpace jffsMinxSpace
+ _Get_JFFS_Space_ ALL KB
+ local typex total usedx freex totalx
+ local sizeUnits sizeType sizeInfo sizeNum
+ local jffsMountStr jffsUsageStr percentNum percentStr
+ [ 2 -lt 1 ]
+ [ -z ALL ]
+ echo ALL
+ grep -qE ^(ALL|USED|FREE)$
+ sizeType=ALL
+ [ 2 -lt 2 ]
+ [ -z KB ]
+ echo KB
+ grep -qE ^(KB|KBP|MBP|GBP|HR|HRx)$
+ sizeUnits=KB
+ + grep /jffs
mount
+ jffsMountStr=ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13)
+ df -kT /jffs
+ grep -E .*[[:blank:]]+/jffs$
+ jffsUsageStr=ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ [ -z ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13) ]
+ [ -z ubi:jffs2 ubifs 45528 13696 29472 32% /jffs ]
+ echo ubi:jffs2 on /jffs type ubifs (rw,relatime,assert=read-only,ubi=0,vol=13)
+ grep -qE [[:blank:]]+[(]?ro[[:blank:],]
+ echo ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ awk -F {print $2}
+ typex=ubifs
+ echo ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ awk -F {print $3}
+ total=45528
+ echo ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ awk -F {print $4}
+ usedx=13696
+ echo ubi:jffs2 ubifs 45528 13696 29472 32% /jffs
+ awk -F {print $5}
+ freex=29472
+ totalx=45528
+ [ ubifs = ubifs ]
+ [ 43168 -ne 45528 ]
+ totalx=43168
+ [ ALL = ALL ]
+ echo 43168
+ return 0
+ jffsAllxSpace=43168
+ echo 43168
+ awk {printf("%s", $1 * 1024);}
+ jffsAllxSpace=44204032
+ echo 44204032
+ awk {printf("%d", $1 * 20 / 100);}
+ jffsMinxSpace=8840806
+ + awk -F {print ($1 < $2)}
echo 8840806 9437184
+ [ 1 -eq 1 ]
+ jffsMinxSpace=9437184
+ echo 9437184
+ return 0
+ jffsMinxSpace=9437184
+ echo 29472
+ awk {printf("%s", $1 * 1024);}
+ jffsFreeSpace=30179328
+ JFFS_LowFreeSpaceStatus=OK
+ awk -F {print ($1 < $2)}
+ echo 30179328 9437184
+ [ 0 -eq 1 ]
+ _WriteVarDefToJSFile_ jffsAvailableSpaceLow OK
+ [ 2 -lt 2 ]
+ [ -z jffsAvailableSpaceLow ]
+ [ -z OK ]
+ local varValue
+ [ 2 -eq 3 ]
+ varValue='OK'
+ local targetJSfile=/jffs/addons/ntpmerlin.d/ntpstatstext.js
+ [ ! -s /jffs/addons/ntpmerlin.d/ntpstatstext.js ]
+ grep -q ^var jffsAvailableSpaceLow =.* /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ grep -q ^var jffsAvailableSpaceLow = 'OK'; /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ _GetFileSize_ /jffs/addons/ntpmerlin.d/ntpdstats.db HRx
+ local sizeUnits sizeInfo fileSize
+ [ 2 -eq 0 ]
+ [ -z /jffs/addons/ntpmerlin.d/ntpdstats.db ]
+ [ ! -s /jffs/addons/ntpmerlin.d/ntpdstats.db ]
+ [ 2 -lt 2 ]
+ [ -z HRx ]
+ echo HRx
+ grep -qE ^(B|KB|MB|GB|HR|HRx)$
+ sizeUnits=HRx
+ + awk -F {print $3}
ls -1lh /jffs/addons/ntpmerlin.d/ntpdstats.db
+ fileSize=16.0K
+ sizeInfo=16.0KB
+ [ HRx = HR ]
+ echo+ 16.0KBtr
-d .0-9
+ sizeUnits=KB
+ echo 16.0KB
+ return 0
+ databaseFileSize=16.0KB
+ _WriteVarDefToJSFile_ sqlDatabaseFileSize 16.0KB
+ [ 2 -lt 2 ]
+ [ -z sqlDatabaseFileSize ]
+ [ -z 16.0KB ]
+ local varValue
+ [ 2 -eq 3 ]
+ varValue='16.0KB'
+ local targetJSfile=/jffs/addons/ntpmerlin.d/ntpstatstext.js
+ [ ! -s /jffs/addons/ntpmerlin.d/ntpstatstext.js ]
+ grep -q ^var sqlDatabaseFileSize =.* /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ grep -q ^var sqlDatabaseFileSize = '16.0KB'; /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ echo Stats last updated: Wed Jun 4 10:07:31 2025
+ WriteStats_ToJS /tmp/ntpstatstitle.txt /jffs/addons/ntpmerlin.d/ntpstatstext.js SetNTPDStatsTitle statstitle
+ [ 4 -lt 4 ]
+ [ -f /jffs/addons/ntpmerlin.d/ntpstatstext.js ]
+ sed -i -e /^}/d;/^function/d;/^document.getElementById/d;/^databaseResetDone/d; /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ awk NF /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ mv -f /jffs/addons/ntpmerlin.d/ntpstatstext.js.tmp /jffs/addons/ntpmerlin.d/ntpstatstext.js
+ printf \nfunction %s(){\n SetNTPDStatsTitle
+ html=document.getElementById("statstitle").innerHTML="
+ IFS= read -r line
+ html=document.getElementById("statstitle").innerHTML="Stats last updated: Wed Jun 4 10:07:31 2025
+ IFS= read -r line
+ [ -n ]
+ html=document.getElementById("statstitle").innerHTML="Stats last updated: Wed Jun 4 10:07:31 2025"
+ [ 4 -lt 5 ]
+ printf %s\n}\n document.getElementById("statstitle").innerHTML="Stats last updated: Wed Jun 4 10:07:31 2025"
+ rm -f /tmp/ntpstatstitle.txt
+ echo var ntpstatus = "Done";
+ Clear_Lock
+ rm -f /tmp/ntpMerlin.lock
+ return 0
+ exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment