You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.1 KiB
Tcl
117 lines
3.1 KiB
Tcl
20 years ago
|
#!/usr/bin/tclsh
|
||
|
#
|
||
|
# Copyright (c) 2000 by Alexander Belkin <adb@newmail.ru>
|
||
|
#
|
||
|
# $Id$
|
||
|
#
|
||
|
# Time syncronization utility
|
||
|
#
|
||
|
# This program is free software; you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License as published by
|
||
|
# the Free Software Foundation; either version 2 of the License, or
|
||
|
# (at your option) any later version.
|
||
|
|
||
|
##################
|
||
|
# Program settings
|
||
|
|
||
|
set bforce_log_file "/var/log/bforce/bf-log.ttyS0"
|
||
|
set sync_with_addr "2:450/102"
|
||
|
set max_time_diff 1800
|
||
|
set min_time_diff 20
|
||
|
set news_groups "local.robots"
|
||
|
set from_user "Time Robot <root@fido.xxx.local>"
|
||
|
set inews_cmd "/usr/bin/inews"
|
||
|
|
||
|
################################
|
||
|
# The program's body starts here
|
||
|
|
||
|
set sess_pid ""
|
||
|
set remote_times ""
|
||
|
set local_times ""
|
||
|
set TEXT ""
|
||
|
|
||
|
set INP [open $bforce_log_file "r"]
|
||
|
foreach line [split [read $INP] "\n"] {
|
||
|
|
||
|
set fields [split $line " "]
|
||
|
set pid [lindex $fields 3]
|
||
|
set time [join [lrange $fields 0 2]]
|
||
|
set data [join [lrange $fields 4 end]]
|
||
|
|
||
|
if { [string match "*Address : $sync_with_addr" $data] } {
|
||
|
set sess_pid $pid
|
||
|
set sess_time ""
|
||
|
} elseif { [string match "*Time :*" $data] } {
|
||
|
if { $sess_pid == $pid } {
|
||
|
regexp "Time : (.+)" $data {} timestr
|
||
|
if { $timestr != "" } {
|
||
|
set sess_time $timestr
|
||
|
}
|
||
|
}
|
||
|
} elseif { [string match "remote is*,protected" $data] } {
|
||
|
if { $sess_pid == $pid } {
|
||
|
if { $sess_time != "" && $time != "" } {
|
||
|
lappend remote_times $sess_time
|
||
|
lappend local_times $time
|
||
|
}
|
||
|
set sess_pid ""
|
||
|
set sess_time ""
|
||
|
}
|
||
|
} elseif { [string match "remote is*" $data] } {
|
||
|
if { $sess_pid == $pid } {
|
||
|
set sess_pid ""
|
||
|
set sess_time ""
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
close $INP
|
||
|
|
||
|
set last_rem_time [lindex $remote_times end]
|
||
|
set last_loc_time [lindex $local_times end]
|
||
|
|
||
|
if { $last_rem_time != "" && $last_loc_time != "" } {
|
||
|
|
||
|
regexp "(\[0-9]+):(\[0-9]+):(\[0-9]+)" $last_rem_time {} rh rm rs
|
||
|
regexp "(\[0-9]+):(\[0-9]+):(\[0-9]+)" $last_loc_time {} lh lm ls
|
||
|
set rem [expr "$rh*3600 + $rm*60 + $rs"]
|
||
|
set loc [expr "$lh*3600 + $lm*60 + $ls"]
|
||
|
set diff [expr "$rem - $loc"]
|
||
|
|
||
|
if { [expr abs($diff)] < $min_time_diff } {
|
||
|
# Do nothing
|
||
|
} elseif { [expr abs($diff)] <= $max_time_diff } {
|
||
|
set old_sec [clock seconds]
|
||
|
set new_sec [expr $old_sec + $diff]
|
||
|
|
||
|
exec /bin/date -s [clock format $new_sec -format "%d-%b-%Y %H:%M:%S"]
|
||
|
exec /sbin/clock -wu
|
||
|
|
||
|
append TEXT "The System time was synchronized with the node $sync_with_addr\n\n"
|
||
|
append TEXT "Old time : [clock format $old_sec]\n"
|
||
|
append TEXT "New time : [clock format $new_sec]\n"
|
||
|
append TEXT "Time difference : $diff second(s)\n"
|
||
|
} else {
|
||
|
set old_sec [clock seconds]
|
||
|
set new_sec [expr $old_sec + $diff]
|
||
|
|
||
|
append TEXT "The System time WAS NOT synchronized with the node $sync_with_addr\n\n"
|
||
|
append TEXT "Current time : [clock format $old_sec]\n"
|
||
|
append TEXT "Want set time : [clock format $new_sec]\n"
|
||
|
append TEXT "Time difference : $diff second(s) (must be lower $max_time_diff seconds)\n"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if { $TEXT != "" } {
|
||
|
|
||
|
set MSG "From: $from_user\n"
|
||
|
append MSG "Subject: Time synchronization\n"
|
||
|
append MSG "Newsgroups: $news_groups\n\n"
|
||
|
append MSG $TEXT
|
||
|
|
||
|
exec $inews_cmd -h << $MSG
|
||
|
}
|
||
|
|
||
|
exit 0
|
||
|
|