#!/bin/sh version=0.2.4-pre7.1 tk_version=menat-tk.sh-$version LANG=C user=menat user_h=/var/menat menat_h=$user_h/localhost/menat menat_h_t=$menat_h/tmp menat_log=$menat_h_t/menat.log menat_lock=$menat_h_t/lock.menat menat_tk=$menat_h_t/tk.offset tk_freq=$menat_h_t/tk.freq tk_delay=$menat_h_t/tk.delay ntp_host=192.168.45.99 delay=-4 delay=${delay:--3} if [ -f $menat_lock ]||[ -d $menat_lock ];then echo >>$menat_log echo "video server is capturing now at `date '+%Y-%m-%d %a %H:%M:%S'`." >>$menat_log echo "$tk_version: time keep process is aborted." >>$menat_log echo on_cap >>$menat_tk exit 0 elif [ -f $menat_h_t/shut_al ];then exit 0 else pre_date=`date '+%Y-%m-%d %a %H:%M:%S'` t=`/usr/sbin/ntpdate -q azami 2>/dev/null |sed -n 2p|cut -d',' -f3` adj_freq=`/sbin/adjtimex -p|grep freq|cut -d":" -f2` if [ -f $menat_h_t/tk.freq ];then pre_freq=`cat $menat_h_t/tk.freq` if [ $adj_freq != $pre_freq ];then adj_renewal=0 echo $adj_freq >$tk_freq else adj_renewal=0 fi else echo $adj_freq >$tk_freq adj_renewal=1 fi echo >>$menat_log echo "$tk_version: time keep process is executed at $pre_date." >>$menat_log fi tty >/dev/null 2>&1;tty_v=$? if [ $tty_v = 0 ];then debug=1 fi if [ "$t" ];then offset=${t#*offset } of_1=`echo $offset|cut -d'.' -f1` if [ $of_1 != $delay ];then i=0 while [ $of_1 != $delay ]&&[ $i -le 3 ];do echo "offset was $offset, need to adjust at $pre_date." >>$menat_log adj_delay=$(($of_1-$delay)) echo "date -s ${adj_delay}second '+%Y-%m-%d %a %H:%M:%S'" >>$menat_log set_date=`su date -s ${adj_delay}second '+%Y-%m-%d %a %H:%M:%S'`;tk_v=$? t_dd=`/usr/sbin/ntpdate -q azami 2>/dev/null |sed -n 2p|cut -d',' -f3` offset=${t_dd#*offset } of_1=`echo $offset|cut -d'.' -f1` if [ ! "$t_dd" ];then echo "error occured for ntpdate." >>$menat_log exit 1 elif [ $tk_v = 0 ];then if [ $of_1 = $delay ];then if [ -f $menat_tk ]&&[ `grep -vc on_cap $menat_tk` -gt 1 ];then old_adj_freq=`grep -v on_cap $menat_tk|head -n1|cut -d':' -f7` tk_adj_sS=`grep -v on_cap $menat_tk|head -n1|cut -d':' -f2` tk_adj_eS=`grep -v on_cap $menat_tk|tail -n1|cut -d':' -f2` dd_adj_SS=$(($tk_adj_eS-$tk_adj_sS)) tk_adj_minute=$(($dd_adj_SS/60)) if [ $tk_adj_minute = 0 ];then tk_adj_minute=1 else if [ $(($dd_adj_SS%60)) -ge 30 ];then tk_adj_minute=$(($tk_adj_minute+1)) fi fi if [ $tk_adj_minute = 1 ];then minute=minute else minute=minutes fi st_offset=`head -n1 $menat_tk|cut -d':' -f1` if [ ${st_offset:0:1} = - ];then st_mm="-" else st_mm="" fi r_st_offset=${st_offset#*.} r0_st_offset=${st_offset#*.} while [ ${r_st_offset:0:1} = 0 ]&&[ ${#r_st_offset} -gt 1 ];do r_st_offset=${r_st_offset:1} done end_offset=`grep -v on_cap $menat_tk|tail -n1|cut -d':' -f1` if [ ${end_offset:0:1} = - ];then end_mm="-" else end_mm="" fi r_end_offset=${end_offset#*.} while [ ${r_end_offset:0:1} = 0 ]&&[ ${#r_end_offset} -gt 1 ];do r_end_offset=${r_end_offset:1} done dd_adj=$(($end_mm$r_end_offset-$st_mm$r_st_offset)) if [ ${dd_adj:0:1} = - ];then mm=- dd_adj=${dd_adj:1} else mm="" fi rt_adj_pm=$(($dd_adj/$tk_adj_minute)) rt_adj_r=$(($dd_adj%$tk_adj_minute)) if [ $rt_adj_r -ge $(($tk_adj_minute/2)) ];then rt_adj_pm=$(($rt_adj_pm+1)) fi while [ ${#rt_adj_pm} -lt ${#r0_st_offset} ];do rt_adj_pm=0${rt_adj_pm} done p_rt_adj_pm=${mm}0.$rt_adj_pm tk_vv="$p_rt_adj_pm/m for ${tk_adj_minute}$minute in $old_adj_freq." echo "$tk_version: renewal, offset drifted $tk_vv" >>$menat_log if [ -f $menat_tk.1 ];then mv -f $menat_tk.1 $menat_tk.2 fi mv -f $menat_tk $menat_tk.1 fi adj_s=`date '+%s'` echo "$offset:$adj_s:$set_date:0m:${adj_freq# }" >$menat_tk echo "offset=$offset, delay for ${delay}second was clear." >>$menat_log echo "time was kept in set delay ${delay}second from $pre_date to $set_date." >>$menat_log echo $offset >$tk_delay exit 0 fi else echo "$0 failed to adjust ${delay}second delay from $pre_date." >>$menat_log exit 1 fi i=$(($i+1)) if [ $i -gt 3 ];then break else echo >>$menat_log pre_date=`date '+%Y-%m-%d %a %H:%M:%S'` fi done else adj_s=`date '+%s'` tk_ln=`grep -vc on_cap $menat_tk` if [ $adj_renewal = 1 ]||[ ${tk_ln:-0} = 0 ];then echo "$offset:$adj_s:$pre_date:0m:${adj_freq# }" >>$menat_tk elif [ -f $menat_tk ]&&[ ${tk_ln:-0} -ge 1 ];then tk_adj_sS=`grep -v on_cap $menat_tk|head -n1|cut -d':' -f2` tk_adj_eS=$adj_s dd_adj_SS=$(($tk_adj_eS-$tk_adj_sS)) tk_adj_minute=$(($dd_adj_SS/60)) if [ $tk_adj_minute = 0 ];then tk_adj_minute=1 else if [ $(($dd_adj_SS%60)) -ge 30 ];then tk_adj_minute=$(($tk_adj_minute+1)) fi fi if [ $tk_adj_minute = 1 ];then minute=minute else minute=minutes fi st_offset=`cat $tk_delay` if [ ! "$st_offset" ];then st_offset=`head -n1 $menat_tk|cut -d':' -f1` fi if [ ${st_offset:0:1} = - ];then st_mm="-" else st_mm="" fi r_st_offset=${st_offset#*.} r0_st_offset=${st_offset#*.} while [ ${r_st_offset:0:1} = 0 ]&&[ ${#r_st_offset} -gt 1 ];do r_st_offset=${r_st_offset:1} done end_offset=$offset if [ ${end_offset:0:1} = - ];then end_mm="-" else end_mm="" fi r_end_offset=${end_offset#*.} while [ ${r_end_offset:0:1} = 0 ]&&[ ${#r_end_offset} -gt 1 ];do r_end_offset=${r_end_offset:1} done dd_adj=$(($end_mm$r_end_offset-$st_mm$r_st_offset)) if [ ${dd_adj:0:1} = - ];then mm=- dd_adj=${dd_adj:1} else mm="" fi rt_adj_pm=$(($dd_adj/$tk_adj_minute)) rt_adj_r=$(($dd_adj%$tk_adj_minute)) if [ $rt_adj_r -ge $(($tk_adj_minute/2)) ];then rt_adj_pm=$(($rt_adj_pm+1)) fi while [ ${#rt_adj_pm} -lt ${#r0_st_offset} ];do rt_adj_pm=0${rt_adj_pm} done p_rt_adj_pm=${mm}0.$rt_adj_pm tk_vv="$p_rt_adj_pm/m for ${tk_adj_minute}$minute in$adj_freq:$offset." if [ "$debug" ];then echo "$tk_version: offset drift $tk_vv" echo "$tk_version: $r_end_offset - $r_st_offset: tk_adj_minute=$tk_adj_minute" fi echo "$tk_version: offset drift $tk_vv" >>$menat_log echo "$offset:$adj_s:$pre_date:${tk_adj_minute}m:${adj_freq# }:$p_rt_adj_pm/m" >>$menat_tk fi adj_dd=`grep -v on_cap $menat_tk` if [ `echo "$adj_dd"|wc -l` -ge 2 ];then start_mm=`echo "$adj_dd"|tail -n2|head -n1|cut -d':' -f6` #echo start_mm=$start_mm start_off=`echo "$adj_dd"|tail -n2|head -n1|cut -d':' -f1` #echo start_off=$start_off end_mm=`echo "$adj_dd"|tail -n1|cut -d':' -f6` #echo end_mm=$end_mm end_off=`echo "$adj_dd"|tail -n1|cut -d':' -f1` #echo end_off=$end_off end_frq=`echo "$adj_dd"|tail -n1|cut -d':' -f7` #echo end_frq=$end_frq span_m=$((${end_mm%m}-${start_mm%m})) if [ $span_m = 0 ];then span_m=1 fi #echo span_m=$span_m ns_1=`echo "$start_off"|sed 's/\.//'` #echo ns_1=$ns_1 ne_1=`echo "$end_off"|sed 's/\.//'` #echo ne_1=$ne_1 es_off=$(($ne_1-$ns_1)) es_off_ph=$(($(($es_off*60))/$span_m)) #echo es_off_ph=$es_off_ph new_frq=$(($end_frq+$(($(($es_off_ph*18199))/1000)))) #echo new_frq=$new_frq #echo sudo "/sbin/adjtimex -f $new_frq" sudo /sbin/adjtimex -f $new_frq fi echo "time was kept in offset $offset delay ${delay}second at $pre_date." >>$menat_log exit 0 fi else echo "ntpdate err occured at `date '+%Y-%m-%d %a %H:%M:%S'`." >>$menat_log exit 2 fi # 2004-12-04 Sat 21:10 first release 0.0.1a.