Programming and Scripting :: simple script to set system clock



Here's the background.... I have an old machine running DSL that I use as a server for various projects.  I reboot it every month or so to check the hard drives. I've noticed that after a few days the time starts go a little wonky. Just a little bit more each day.  

So I was looking for something that I could automatically run each day to set the time.  There were some good suggestions on the forum about installing an NTP client. I'm sure it's probably easy to do and works fine but I decided to try my hand at writing a script to do it.

It's not as acurate as an NTP client but it's close enough for what I need and it will work in native DSL.

Code Sample


#! /bin/bash
version="1.00"
scriptName="getTime.sh"
#
# This script gets time information from time.nist.gov in
# universal time format. It then rearranges it into
# the format that the date command uses MMDDhhmmCCYY.ss
# and issues the date command as super user.
#
# An internet connection must be available
#
#  sample of returned information follows
#54144 07-02-13 16:14:43 00 0 0  95.3 UTC(NIST) *
#0----0----1----1----2----2----3----3----4----4----5
#0----5----0----5----0----5----0----5----0----5----0
#
vFound=""
telnet time.nist.gov 13 > nistTime.txt
date
vFound=$(cat nistTime.txt | grep "UTC(NIST)")
if [ ! -z "$vFound" ]; then
    vDateTime=${vFound:9:2}${vFound:12:2}${vFound:15:2}${vFound:18:2}"20"${vFound:6:2}"."${vFound:21:2}
     sudo date -u "$vDateTime"
     #echo "$vDateTime"
fi
date



I thought about setting the hardware clock also but then that might mess people up who dual-boot to windows.

One thing that I wasn't able to solve was setting the telnet timeout.  How long the script waits trying to connect to time.nist.gov if my internet connection is down or if time.nist.gov is down?  I'd like to be able to set a timeout parameter of 15 seconds but I don't see how. Anyone know how to change it?

-Enjoy

You could kill that process if there's no easy timeout solution...

Or you could do something like a test ping of that site first, before you proceed with the rest of the script.

Reading this script and a request for how to handle timeout, made me think of such capability using Lua sockets.

So, just for fun, I cobbed together this little Lua socket program.

It is working well for me. I run it manually prefixed with sudo.
I did not call date using sudo as in newOldUser's original, as I call this lua program from /opt/bootlocal.sh

Now when I boot my machine, I have a much more accurate clock set.

You can see socket level programming is at a lower level than calling bash functions. But it does provide much more control.

Code Sample
#! /bin/lua
--[[
# This lua script based in part of the idea expressed in
# the bash script from newOldUser of the damnsmall linux forums
# by Robert Shingledecker - 2007/02/17
# This script gets time information from time.nist.gov in
# universal time format. It then rearranges it into
# the format that the date command uses MMDDhhmmCCYY.ss
# and issues the date command as super user.
#
# An internet connection must be available
#
#  sample of returned information follows
#54144 07-02-13 16:14:43 00 0 0  95.3 UTC(NIST) *
#1---0----1----1----2----2----3----3----4----4----5
#1---5----0----5----0----5----0----5----0----5----0
#
--]]
host = "time.nist.gov"
port = 13
target = {10,13,16,19,7,22}
date = ""

timeserver,err = socket.connect(host,port)
if err then
  print("Could not connect "..err)
  os.exit(1)
end
_,err = timeserver:send("anything\n")
if err then
  print("Error in sending "..err)
  os.exit(1)
end
timeserver:settimeout(0.10)
while 1 do
  line,err = timeserver:receive('*l')
  if err then
     print("Error in receiving "..err)
     os.exit(1)
  end
  if string.find(line,"UTC") then
     for i = 1, 6 do
        if i == 5 then date = date .. "20" end
        if i == 6 then date = date .. "." end
        date = date .. string.sub(line,target[i],target[i]+1)
     end
     os.execute("date -u "..date)
     os.exit(0)
  end
end



One idea inspires another.

Off-topic, but good to see you around Newolduser :=)  I thought you'd vanished off the forum!

^thehatsrule^, thanks for the suggestion... I hadn't thought about doing a ping first. It's funny how my mind gets locked into doing something one way and other solutions get blocked.

Roberts, neat stuff... One of these days I'm going to learn LUA.

WDef,  Sorry about being offtopic... I'm never sure where to put these things that I write.  I have one or two other scripts that I need to pretty-up so I can share them. I had been putting them in the blogs but there are problems putting code in the blog area.  

I was gone for a while, but still using DSL. I've come back to find that we're up to version 3.something and all my machines are at version 2.3 or below.  Since I usually do a frugal install I'm hoping that upgrading will not be too difficult. I'm sure there are plenty of forum entries that will help me. :)

Next Page...
original here.