curl -Ls https://gist.githubusercontent.com/mattrude/897cd9f6b26b80de03043f0e0f4bebbb/raw/ntpsec-updater.sh |bash
Once it's complete, run the below to confirm the timers are set.
systemctl list-timers --all
# /etc/ntpsec/ntp.conf, configuration for ntpd; see ntp.conf(5) for help | |
driftfile /var/lib/ntpsec/ntp.drift | |
leapfile /usr/share/zoneinfo/leap-seconds.list | |
# To enable Network Time Security support as a server, obtain a certificate | |
# (e.g. with Let's Encrypt), configure the paths below, and uncomment: | |
#nts cookie /var/lib/ntp/nts-keys | |
#nts cert /etc/ntpsec/nts/cert-chain.pem | |
#nts key /etc/ntpsec/nts/key.pem | |
#nts server time.theodin.network | |
#nts enable | |
# You must create /var/log/ntpsec (owned by ntpsec:ntpsec) to enable logging. | |
statsdir /var/log/ntpsec | |
statistics loopstats peerstats clockstats | |
filegen loopstats file loopstats type day enable | |
filegen peerstats file peerstats type day enable | |
filegen clockstats file clockstats type day enable | |
# Enables the calibrate feature for reference clocks. | |
#enable calibrate | |
# This should be maxclock 7, but the pool entries count towards maxclock. | |
tos maxclock 11 | |
# Comment this out if you have a refclock and want it to be able to discipline | |
# the clock by itself (e.g. if the system is not connected to the network). | |
#tos minclock 4 minsane 3 | |
# GPS PPS reference (NTP1) | |
#refclock shm unit 1 prefer refid PPS | |
# GPS Serial data reference (NTP0) | |
#refclock shm unit 0 refid GPS | |
# Specify one or more NTP servers. | |
server time.theodin.network prefer iburst nts | |
server time-b-g.nist.gov iburst | |
server time-b-b.nist.gov iburst | |
server time-b-wwv.nist.gov iburst | |
server time-c-g.nist.gov iburst | |
server time-c-b.nist.gov iburst | |
server time-c-wwv.nist.gov iburst | |
# Public NTP servers supporting Network Time Security: | |
#server time.cloudflare.com nts | |
# NTP symmetric key cryptography | |
keys /etc/ntpsec/ntp.keys | |
trustedkey 1 2 3 4 | |
controlkey 2 | |
# Access control configuration; see /usr/share/doc/ntpsec-doc/html/accopt.html | |
# for details. | |
# | |
# Note that "restrict" applies to both servers and clients, so a configuration | |
# that might be intended to block requests from certain clients could also end | |
# up blocking replies from your own upstream servers. | |
# By default, exchange time with everybody, but don't allow configuration. | |
restrict default kod nomodify nopeer noquery limited | |
restrict -6 default kod nomodify nopeer noquery limited | |
# Local users may interrogate the ntp server more closely. | |
restrict 127.0.0.1 | |
restrict ::1 |
[Unit] | |
Documentation=man:ntpleapfetch(1) | |
Description=Validate & update leap second definition file | |
Requisite=ntpd.service | |
[Service] | |
Type=simple | |
Nice=15 | |
IOSchedulingClass=idle | |
ExecStart=/usr/local/bin/ntpleapfetch -f /etc/ntpsec/ntp.conf -p 4 -l -s https://hpiers.obspm.fr/iers/bul/bulc/ntp/leap-seconds.list -e "30 days" |
[Unit] | |
Description=Run ntpleapfetch once a week | |
[Timer] | |
OnCalendar=Sun 00:03:00 | |
Persistent=true | |
[Install] | |
WantedBy=ntpd.service |
#!/bin/bash | |
URL='https://gist.githubusercontent.com/mattrude/897cd9f6b26b80de03043f0e0f4bebbb/raw' | |
NTPSECVER='1.2.3' | |
DIR='/var/src' | |
WEBDIR='/var/www/html' | |
WEBDIRc='\/var\/www\/html' | |
if [ ! -d /etc/ntpsec ]; then | |
sudo useradd -r -s /usr/sbin/nologin -U ntpsec | |
sudo mkdir -p /var/src /etc/ntpsec /etc/ntpviz /var/lib/ntpsec /var/log/ntpsec ${WEBDIR}/week ${WEBDIR}/month | |
sudo chown ntpsec:ntpsec /etc/ntpsec /var/lib/ntpsec /var/log/ntpsec | |
sudo chown ${USER}:${USER} /var/src | |
fi | |
curl -Ls https://ftp.ntpsec.org/pub/releases/ntpsec.gpg.pub.asc |gpg --import | |
for SIGNKEY in `gpg -k [email protected] |grep -B1 unknown |grep '^ ' |sed 's/ //g'` | |
do | |
echo -e "5\ny\n" | gpg --command-fd 0 --edit-key "${SIGNKEY}" trust | |
done | |
mkdir -p ${DIR} && cd ${DIR} && \ | |
wget -4c https://ftp.ntpsec.org/pub/releases/ntpsec-${NTPSECVER}.tar.gz.asc && \ | |
wget -4c https://ftp.ntpsec.org/pub/releases/ntpsec-${NTPSECVER}.tar.gz && \ | |
rm -rf ${DIR}/ntpsec-${NTPSECVER} && \ | |
gpg --verify ntpsec-${NTPSECVER}.tar.gz.asc && \ | |
tar -xzf ntpsec-${NTPSECVER}.tar.gz && \ | |
cd ntpsec-${NTPSECVER} && \ | |
sed -i 's/localhost\/htdocs/html/g' etc/ntpviz*.service && \ | |
sed -i 's/ExecStart=.*/ExecStart=\/usr\/local\/sbin\/ntpd -c \/etc\/ntpsec\/ntp.conf -p \/var\/run\/ntpd.pid -g -N -u ntpsec:ntpsec/g' etc/ntpd.service && \ | |
sed -i "s/ExecStart=.*/ExecStart=\/usr\/local\/bin\/ntpviz -p 1 -o ${WEBDIRc} @\/etc\/ntpviz\/options/g" etc/ntpviz-daily.service && \ | |
sed -i "s/ExecStart=.*/ExecStart=\/usr\/local\/bin\/ntpviz -p 7 -o ${WEBDIRc}\/week @\/etc\/ntpviz\/options/g" etc/ntpviz-weekly.service && \ | |
sed -i 's/ExecStart=.*/ExecStart=\/usr\/local\/bin\/ntplogtemp -o -l \/var\/log\/ntpsec\/temps/g' etc/ntplogtemp.service && \ | |
sed -i 's/ExecStart=.*/ExecStart=\/usr\/local\/bin\/ntploggps -o -l \/var\/log\/ntpsec\/gpsd/g' etc/ntploggps.service && \ | |
sed -i 's/wheel/root/g' ntpclients/ntpleapfetch && \ | |
sudo ./buildprep --ntpviz --update && \ | |
./waf configure --refclock=all && \ | |
./waf build && \ | |
sudo ./waf install && \ | |
sudo rm -rf /usr/local/bin/ntp && \ | |
sudo cp -R build/main/pylib /usr/local/bin/ntp && \ | |
if [ ! -f /etc/ntpsec/ntp.conf ]; then sudo curl -Ls ${URL}/ntp.conf -o /etc/ntpsec/ntp.conf; fi && \ | |
sudo systemctl daemon-reload && \ | |
sudo systemctl restart ntpd.service && \ | |
sudo cp /usr/lib/systemd/system/ntpviz-weekly.service /usr/lib/systemd/system/ntpviz-monthly.service && \ | |
sudo sed -i "s/ExecStart=.*/ExecStart=\/usr\/local\/bin\/ntpviz -p 30 -o ${WEBDIRc}\/month @\/etc\/ntpviz\/options/g" /usr/lib/systemd/system/ntpviz-monthly.service && \ | |
sudo cp /usr/lib/systemd/system/ntpviz-weekly.timer /usr/lib/systemd/system/ntpviz-monthly.timer && \ | |
sudo sed -i 's/OnCalendar=.*/OnCalendar=23:43:00/g' /usr/lib/systemd/system/ntpviz-monthly.timer && \ | |
sudo curl -Ls ${URL}/ntpleapfetch.timer -o /usr/lib/systemd/system/ntpleapfetch.timer && \ | |
sudo curl -Ls ${URL}/ntpleapfetch.service -o /usr/lib/systemd/system/ntpleapfetch.service && \ | |
sudo systemctl daemon-reload && \ | |
sudo systemctl unmask ntpviz-daily.timer ntpviz-weekly.timer ntpviz-monthly.timer ntplogtemp.timer ntpleapfetch.timer && \ | |
sudo systemctl enable ntpviz-daily.timer ntpviz-weekly.timer ntpviz-monthly.timer ntplogtemp.timer ntpleapfetch.timer && \ | |
sudo systemctl start ntpviz-daily.timer ntpviz-weekly.timer ntpviz-monthly.timer ntplogtemp.timer ntpleapfetch.timer && \ | |
sudo curl -Ls ${URL}/ntpviz-options -o /etc/ntpviz/options && \ | |
sudo sed -i "s/#--name/--name `hostname -f`/g" /etc/ntpviz/options && \ | |
sudo curl -Ls ${URL}/time-service-favicon.ico -o ${WEBDIR}/favicon.ico && \ | |
sudo curl -Ls ${URL}/ntpviz-header-day -o ${WEBDIR}/header && \ | |
sudo curl -Ls ${URL}/ntpviz-header-week -o ${WEBDIR}/week/header && \ | |
sudo curl -Ls ${URL}/ntpviz-header-month -o ${WEBDIR}/month/header && \ | |
sudo curl -Ls ${URL}/time-service-ntpviz.patch -o /usr/local/bin/time-service-ntpviz.patch && \ | |
sudo patch /usr/local/bin/ntpviz /usr/local/bin/time-service-ntpviz.patch && \ | |
echo "NTPSEC Install Complete!" |
<div id='navbar'> | |
Updated once per hour. | |
<div id="nav" style="padding-top:1em;"> | |
<b>Daily Stats</b> | | |
<a href="/week/" style='color:#000;'>Weekly Stats</a> | | |
<a href="/month/" style='color:#000;'>Monthly Stats</a> | | |
<a href="/time.txt" style='color:#000;'>Stats Report</a> | |
</div> | |
</div> |
<div id='navbar'> | |
Updated once per day. | |
<div id="nav" style="padding-top:1em;"> | |
<a href="/" style='color:#000;'>Daily Stats</a> | | |
<a href="/week/" style='color:#000;'>Weekly Stats</a> | | |
<b>Monthly Stats</b> | | |
<a href="/time.txt" style='color:#000;'>Stats Report</a> | |
</div> | |
</div> |
<div id='navbar'> | |
Updated twice per day. | |
<div id="nav" style="padding-top:1em;"> | |
<a href="/" style='color:#000;'>Daily Stats</a> | | |
<b>Weekly Stats</b> | | |
<a href="/month/" style='color:#000;'>Monthly Stats</a> | | |
<a href="/time.txt" style='color:#000;'>Stats Report</a> | |
</div> | |
</div> |
# The NTPVIZ config file | |
## This file should be stored at /etc/ntpviz/options | |
# The Name of the site that will be displayed on the top. | |
#--name | |
# The Log directory NTPsec sends its stats to. | |
--datadir /var/log/ntpsec | |
# Normally all the data is plotted. This option limits the range of the plots | |
# to the data between 1% and 99%. This is useful for ignoring a few spikes in | |
# the data. | |
#--clip | |
# Set the size of the output plots. SIZE can be one of s, m, or l. Use s for | |
# small screens (1024x768), m for medium screens (1388x768), or l for large | |
# screens (1920x1080). m is the default. | |
--width=m | |
# Run this process at the lowest priority. | |
--nice | |
# Set the Image type (png, svg) | |
--terminal png |
--- ntpviz.orig 2024-01-02 13:20:54.462381313 -0600 | |
+++ ntpviz 2024-01-07 01:47:52.183112486 -0600 | |
@@ -1534,7 +1534,7 @@ | |
if 's' == args.width: | |
# fit in 1024x768 browser | |
# in 2016 this is 22% of all browsers | |
- args.img_size = '1000,720' | |
+ args.img_size = '900,400' | |
elif 'l' == args.width: | |
# fit in 1920x1080 browser | |
args.img_size = '1850,1000' | |
@@ -1735,7 +1735,7 @@ | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
-<link rel="shortcut icon" href="favicon.ico"> | |
+<link rel="shortcut icon" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBmaWxsPSIjMzA3NmIxIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiI+PHBhdGggZD0iTTI1NiAxMDRjNDAuNjAxIDAgNzguNzcyIDE1LjgxMSAxMDcuNDgxIDQ0LjUyQzM5Mi4xODkgMTc3LjIzIDQwOCAyMTUuNCA0MDggMjU2YzAgNDAuNjAxLTE1LjgxIDc4Ljc3Mi00NC41MTkgMTA3LjQ4UzI5Ni42MDEgNDA4IDI1NiA0MDhjLTQwLjYgMC03OC43Ny0xNS44MS0xMDcuNDgtNDQuNTJDMTE5LjgxMiAzMzQuNzcxIDEwNCAyOTYuNiAxMDQgMjU2YzAtNDAuNiAxNS44MTEtNzguNzcgNDQuNTItMTA3LjQ4QzE3Ny4yMyAxMTkuODEyIDIxNS40IDEwNCAyNTYgMTA0bTAtNDBDMTQ5Ljk2NCA2NCA2NCAxNDkuOTYzIDY0IDI1NmMwIDEwNi4wNCA4NS45NjQgMTkyIDE5MiAxOTIgMTA2LjA0MSAwIDE5Mi04NS45NiAxOTItMTkyIDAtMTA2LjAzNy04NS45NTktMTkyLTE5Mi0xOTJ6Ij48L3BhdGg+PHBhdGggZD0iTTMzMiAyNDRoLTYwVjE0NGMwLTExLjA0Ni04Ljk1NC0yMC0yMC0yMHMtMjAgOC45NTQtMjAgMjB2MTIwYzAgMTEuMDQ2IDguOTU0IDIwIDIwIDIwaDgwYzExLjA0NiAwIDIwLTguOTU0IDIwLTIwcy04Ljk1NC0yMC0yMC0yMHoiPjwvcGF0aD48L3N2Zz4=" /> | |
<meta charset="UTF-8"> | |
<meta http-equiv="refresh" content="1800"> | |
<meta name="expires" content="0"> | |
@@ -1751,8 +1751,9 @@ | |
} | |
table { | |
text-align: right; | |
- width: 1300px; | |
border-collapse: collapse; | |
+ width: 100%%; | |
+ font-size: 0.7em; | |
} | |
thead { | |
font-weight: bold; | |
@@ -1765,6 +1766,21 @@ | |
tbody tr:nth-child(6n+6) { | |
background-color: rgba(0,255,0,0.2); | |
} | |
+#main { | |
+ max-width: 1300px; | |
+ margin: auto; | |
+ padding: 0 20px; | |
+} | |
+#header { | |
+ margin: auto; | |
+ max-width: 650px; | |
+} | |
+#head-img { | |
+ fill: #3076b1; | |
+} | |
+.graph-img { | |
+ width: 100%%; | |
+} | |
.section { | |
color: #000000; | |
text-decoration: none; | |
@@ -1772,14 +1788,18 @@ | |
.section .site-title:visited { | |
color: #000000; | |
} | |
+a { | |
+ color: #000000; | |
+} | |
</style> | |
</head> | |
<body> | |
-<div style="width:910px"> | |
-<a href='https://www.ntpsec.org/'> | |
-<img src="ntpsec-logo.png" alt="NTPsec" style="float:left;margin:20px 70px;"> | |
-</a> | |
-<div> | |
+<div id='main' class='main'> | |
+<div id='header'> | |
+<div id='head-img'> | |
+<a href='/'><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="140" height="140" style="float:left;margin:20px;fill:#3076b1;"><path d="M256 104c40.601 0 78.772 15.811 107.481 44.52C392.189 177.23 408 215.4 408 256c0 40.601-15.81 78.772-44.519 107.48S296.601 408 256 408c-40.6 0-78.77-15.81-107.48-44.52C119.812 334.771 104 296.6 104 256c0-40.6 15.811-78.77 44.52-107.48C177.23 119.812 215.4 104 256 104m0-40C149.964 64 64 149.963 64 256c0 106.04 85.964 192 192 192 106.041 0 192-85.96 192-192 0-106.037-85.959-192-192-192z"></path><path d="M332 244h-60V144c0-11.046-8.954-20-20-20s-20 8.954-20 20v120c0 11.046 8.954 20 20 20h80c11.046 0 20-8.954 20-20s-8.954-20-20-20z"></path></svg></a> | |
+</div> | |
+<div id='head-text'> | |
<h1 style="margin-bottom:10px;">%(title)s</h1> | |
<b>Report generated:</b> %(report_time)s <br> | |
''' % locals() | |
@@ -1809,7 +1829,7 @@ | |
<span style="color:red;font-weight:bold;">Warning: plots clipped</span><br> | |
""" | |
- index_header += '</div>\n<div style="clear:both;"></div>' | |
+ index_header += '</div></div>' | |
index_trailer = '''\ | |
<h2>Glossary:</h2> | |
@@ -1905,24 +1925,12 @@ | |
<a href="https://docs.ntpsec.org/latest/ntpviz.html"> | |
ntpviz</a>, part of the <a href="https://www.ntpsec.org/">NTPsec project</a> | |
</div> | |
-<div style="float:left;margin-left:350px;"> | |
- <a href="https://validator.w3.org/nu/"> | |
- <img src="https://www.w3.org/html/logo/downloads/HTML5_Logo_32.png" | |
- alt="html 5"> | |
- </a> | |
- | |
- <a href="https://jigsaw.w3.org/css-validator/check/referer"> | |
- <img style="border:0;width:88px;height:31px" | |
- src="https://jigsaw.w3.org/css-validator/images/vcss" | |
- alt="Valid CSS!" /> | |
- </a> | |
-</div> | |
-<div style="clear:both;"></div> | |
+<br> | |
</div> | |
</body> | |
</html> | |
''' | |
- imagewrapper = "<img src='%%s%s' alt='%%s plot'>\n" % args.img_ext | |
+ imagewrapper = "<img src='%%s%s' class='graph-img' alt='%%s plot'>\n" % args.img_ext | |
# buffer the index.html output so the index.html is not empty | |
# during the run | |
@@ -1933,7 +1941,7 @@ | |
try: | |
header_file = open(header, 'r', encoding='utf-8') | |
header_txt = header_file.read() | |
- index_buffer += '<br>\n' + header_txt + '\n' | |
+ index_buffer += '\n' + header_txt + '\n' | |
except IOError: | |
pass | |