#!/bin/sh
#Execute at for menat.
#
version=0.1.3-pre3
wol_menat="menat-wol.sh-$version"
wol_version=$wol_menat
wol_exe_host=`hostname`
exe_user=`id -un`
ma_user=menat
LANG=C
user_h=/var/menat
menat_conf=/etc/menat/menat.conf
wol_conf=/etc/menat/wol.conf
wol_log=/var/menat/localhost/menat/tmp/wol.log
ma_wk="/sbin/ether-wake -i eth1"
menat_mail=/var/menat/bin/menat-mail.sh
wol_mail_txt=/var/menat/localhost/menat/tmp/wol.mesg
n_time=`date '+%Y%m%d%H%M'`
pn_time=`date '+%Y-%m-%d %a %H:%M'`
wol_span_v="30minute"
menat_wol_exe() {
ma_wol_exe_v=0
while [ "$1" ];do
case $1 in
-F )
ma_wol_force=1
shift
;;
-i )
shift
ma_wol_str=$1
shift
;;
* ) echo "$1, such option is not implemented." >&2
return 1
;;
esac
done
echo "ma_wol_str=$ma_wol_str"
if [ "$ma_wol_str" ];then
ma_wol_host=`echo $ma_wol_str|cut -d':' -f1`
ma_wol_addr=`echo $ma_wol_str|cut -d':' -f2`
ma_wol_mac=`echo $ma_wol_str|cut -d':' -f3-`
conf_db=$ma_wol_str
else
echo "wol_host or wol_mac is not specified." >&2
return 1
fi
menat_h=/var/menat/$ma_wol_host/menat
menat_h_t=$menat_h/tmp
if [ ! -f $wol_log ];then
echo "new wol.log started by $ma_user from $wol_exe_host at $pn_time." >>$wol_log
else
echo >>$wol_log
echo "$wol_menat was executed by $ma_user from $wol_exe_host at $pn_time." 2>&1 >>$wol_log
fi
dvn=`ping -q -w 1 -c 1 $ma_wol_host 2>&1 1>/dev/null`;vs_v=$?
if [ $vs_v = 0 ];then
if [ "$wol_debug" = 1 ];then
echo "$ma_wol_host is running now, not need to wake up."
else
echo "$ma_wol_host is running now, not need to wake up." >&2
echo "$ma_wol_host is running now, not need to wake up." >>$wol_log
fi
return 0
fi
if [ "$ma_wol_force" = 1 ];then
m_title="the video server $ma_wol_host was WOLed by $wol_user."
if [ "$wol_debug" = 1 ];then
echo "$wol_user forced to wake video server $ma_wol_host on lan from $wol_exe_host at at $pn_time.
"
echo "$ma_wk $ma_wol_mac;wol_exe_v=$?"
wol_exe_v=0
else
$ma_wk $ma_wol_mac;wol_exe_v=$?
wol_mesg="$wol_user forced to wake the video server $ma_wol_host on lan from $wol_exe_host at $pn_time.
$ma_wk $ma_wol_mac";wol_exe_v=$wol_exe_v
echo "$wol_mesg" >>$wol_log
echo "$wol_mesg" >$wol_mail_txt;msg_v=$?
if [ $msg_v != 0 ];then
wol_mail_txt=/tmp/wol.mesg
echo "$wol_mesg" >$wol_mail_txt
fi
fi
if [ $wol_exe_v = 0 ];then
echo "the video server $ma_wol_host is forced to wake on lan." >>$wol_log
pv=3
else
echo "failed to force to wake $ma_wol_host on lan." >>$wol_log
pv=4
fi
$menat_mail -vs ${wol_exe_host%%.*} -a $ma_user -p $pv -n $wol_mail_txt -T "$m_title"
return ${wol_exe_v:-0}
else
if [ ! -d /var/menat/$ma_wol_host/menat/ ];then
echo "wol_host is not found." >&2
return 1
fi
fi
for t in /var/menat/$ma_wol_host/menat/*.mtq ;do
if [ -d $t ];then
continue
fi
tt=${t##*/}
t_12=`echo $tt|cut -c 1-12`
dvn=`expr $t_12 + 0 2>/dev/null`;dvn_v=$?
if [ $dvn_v != 0 ]&&[ `echo $t_12|cut -c 1` != 0 ];then
continue
fi
ma_t_Y=`echo $t_12|cut -c 1-4`
ma_t_m=`echo $t_12|cut -c 5-6`
ma_t_d=`echo $t_12|cut -c 7-8`
ma_t_H=`echo $t_12|cut -c 9-10`
ma_t_M=`echo $t_12|cut -c 11-12`
ma_p_YmdHM="$ma_t_Y-$ma_t_m-$ma_t_d $ma_t_H:$ma_t_M"
p_nxt_YmdaHM=`date -d "$ma_p_YmdHM" '+%Y-%m-%d %a %H:%M'`
exp_prg_s=`date -d "$ma_t_Y-$ma_t_m-$ma_t_d $ma_t_H:$ma_t_M" '+%s'`
exp_wol_s=`date -d ${wol_span_v} '+%s'`
exp_wol_YmdHM=`date -d "-${wol_span_v} $ma_p_YmdHM" '+%Y-%m-%d %a %H:%M'`
if [ "$wol_debug" = 1 ];then
echo "next job $tt will be executed at $p_nxt_YmdaHM.
maybe the time will expire at $exp_wol_YmdHM."
else
echo "next job $tt will be executed at $p_nxt_YmdaHM.
maybe the time will expire at $exp_wol_YmdHM." >>$wol_log
fi
if [ $exp_wol_s -ge $exp_prg_s ];then
if [ "$wol_debug" = 1 ];then
echo "the time has come to wake on lan for the video server $ma_wol_host."
echo "$ma_wk $ma_wol_mac;wol_exe_v=$?"
wol_exe_v=0
else
$ma_wk $ma_wol_mac;wol_exe_v=$?
wol_mesg="the time has come to wake on lan for the video server $ma_wol_host.
**** $pn_time **** wol_span_v=$wol_span_v $wol_menat"
stn_ma_ex=`grep -n ^\#\!/ $t`
stn_n=${stn_ma_ex%%:*}
edn_ma_ex=`grep -n ^\$ $t`
for t1 in ${edn_ma_ex:-0} ;do
tt1=${t1%%:*}
if [ $tt1 -gt ${stn_n:-0} ];then
edn_n=$(($tt1-1))
break
fi
done
iepg_dd=`$t -c iepg_dd 2`
if [ ! "$iepg_dd" ];then
stn_iepg=`sed -n "${stn_n:-0},${edn_n}p" $t|grep -c ^\#station`
if [ "$stn_iepg" != 0 ];then
for t1 in `grep -n ^\#station $t` ;do
tt1=${t1%%:*}
if [ $edn_n -gt $tt1 ];then
stn_iepg_n=$(($tt1-1))
break
fi
done
iepg_dd=`sed -n "${stn_iepg_n},${edn_n}p" $t`
else
iepg_dd=`sed -n "${edn_n}p" $t`
fi
wol_org_id=`$t -c org_id`
wol_prs_id=`$t -c prs_id`
wol_sr_id=`$t -c sr_id`
wol_week_v=`$t -c week`
wol_auto_exe=`$t -c auto_exe`
wk_str="week=${wol_week_v:-0} ${wol_auto_exe:-0}"
wol_iepg_err=`$t -c iepg_err`
wol_iepg_err_v="iepg_err=${wol_iepg_err:--1}"
cr_version="menat-cr.sh-`$t -c version`"
iepg_dd="$iepg_dd
#org_id=$wol_org_id:prs_id=$wol_prs_id:sr_id=$wol_sr_id; $wk_str; $wol_iepg_err_v; $cr_version
"
fi
if [ $wol_exe_v = 0 ];then
pv=3
wol_mesg="$wol_mesg
$iepg_dd
"
else
pv=4
wol_mesg="$wol_mesg
but wol was faild.
$iepg_dd
$ma_wk $ma_wol_mac;wol_exe_v=$wol_exe_v
"
fi
echo "$wol_mesg" >>$wol_log
echo "$wol_mesg" >$menat_h_t/wol.mesg
if [ $wol_exe_v = 0 ];then
pv=3
m_title="Wake On LAN for $vs_hn."
else
pv=4
m_title="Wake On LAN for $vs_hn, failed."
fi
fi
$menat_mail -vs $vs_hn -a $ma_user -p $pv -i ${tt:-/dev/null} -n $menat_h_t/wol.mesg -T "$m_title"
if [ $wol_exe_v = 0 ];then
echo "the video server $ma_wol_host is waken on lan." >>$wol_log
else
echo "failed to wake $ma_wol_host on lan." >>$wol_log
fi
else
if [ "$wol_debug" = 1 ];then
echo "but the time has never come yet."
else
echo "but the time has never come yet." >>$wol_log
fi
ma_wol_exe_v=0
fi
ma_wol_exe_v=$((${ma_wol_exe_v:-0}+${wol_exe_v:-0}))
if [ `wc -l <$wol_log` -gt 4096 ];then
mv -f $wol_log $wol_log.1
echo "new wol.log started at `date '+%Y-%m-%d %a %H:%M'`." >>$wol_log
echo >>$wol_log
chmod -f 777 $wol_log
fi
break
done
return ${ma_wol_exe_v:-125}
}
if [ -f $menat_conf ];then
. $menat_conf
fi
while [ "$1" ];do
case $1 in
-F )
wol_force="-F"
shift
;;
-c )
shift
wol_conf=$1
shift
;;
-e )
shift
wol_span_v=$1
dvn=`date -d $1`;dvn_v=$?
if [ $dvn_v != 0 ];then
echo "maybe, $1 is invalid time span value." >&2
exit 1
fi
shift
;;
-a )
shift
wol_addr=$1
shift
;;
-h|-v|-vs )
shift
wol_host=$1
shift
;;
-m )
shift
wol_mac=$1
shift
;;
-u )
shift
wol_user=$1
shift
;;
-D )
wol_debug=1
shift
;;
-x ) shift
ma_wk=$1
shift
;;
-V )
echo $wol_version
exit 0
;;
* ) echo "$1, such option is not implemented." >&2
exit 1
;;
esac
done
conf_db=`cat $wol_conf|cut -d'#' -f1`
if [ ! "$conf_db" ];then
echo "$wol_conf is invalid." >&2
exit 1
fi
if [ -d ${ma_wk%% *} ];then
echo "$ma_wk is directory, not executable." >&2
exit 1
elif [ -f ${ma_wk%% *} ];then
if [ ! -x $${ma_wk%% *} ];then
echo "$ma_wk is not executable." >&2
exit 1
fi
else
echo "$ma_wk, such file is not found." >&2
exit 1
fi
wol_user=${wol_user:-$exe_user}
if [ "$wol_host" ]||[ "$wol_addr" ]||[ "$wol_mac" ];then
conf_ok=0
for t in $conf_db ;do
if [ "$wol_host" ];then
wol_t_h=`echo $t|grep -c ^$wol_host`
if [ $wol_t_h = 1 ];then
wol_host_ok=1
fi
else
wol_t_h=1
fi
if [ "$wol_addr" ];then
wol_t_a=`echo $t|grep -c $wol_addr`
if [ $wol_t_a = 1 ];then
wol_addr_ok=1
fi
else
wol_t_a=1
fi
if [ "$wol_mac" ];then
wol_t_m=`echo $t|grep -c $wol_mac`
if [ $wol_t_m = 1 ];then
wol_mac_ok=1
fi
else
wol_t_m=1
fi
if [ $(($wol_t_h+$wol_t_a+$wol_t_m)) = 3 ];then
tmp_wol_host=`echo $t|cut -d':' -f1`
tmp_wol_addr=`echo $t|cut -d':' -f2`
tmp_wol_mac=${t#*:}
tmp_wol_mac=${tmp_wol_mac#*:}
conf_wol_str=$t
conf_ok=1
break
else
continue
fi
done
if [ "$conf_ok" != 1 ];then
if [ "$wol_addr" ]&&[ "$wol_mac" ];then
tmp_wol_addr=$wol_addr
tmp_wol_mac=$wol_mac
conf_ok=0
else
if [ "$wol_host" ]&&[ "$wol_host_ok" != 1 ];then
echo "$wol_host, such host is not found." >&2
fi
if [ "$wol_mac" ];then
echo "mac_address is not specified." >&2
else
echo "wol_address is not specified." >&2
fi
exit 1
fi
else
conf_ok=1
fi
else
conf_ok=1
fi
if [ $conf_ok = 0 ];then
if [ "$wol_debug" = 1 ];then
echo "$ma_wk $tmp_wol_mac"
echo "executed menat_wol at $pn_time."
else
wol_exe_mesg=`$ma_wk $tmp_wol_mac`
if [ "$wol_exe_mesg" ];then
echo "$wol_exe_mesg
"
fi
echo "$ma_wk $tmp_wol_mac" >>$wol_log
echo "executed menat_wol at $pn_time." >>$wol_log
fi
else
if [ "$conf_wol_str" ];then
if [ "$wol_debug" = 1 ];then
echo "menat_wol_exe $wol_force -i $conf_wol_str"
fi
menat_wol_exe $wol_force -i $conf_wol_str
else
for t in $conf_db ;do
if [ "$wol_debug" = 1 ];then
echo "menat_wol_exe $wol_force -i $t"
fi
menat_wol_exe $wol_force -i $t
done
fi
fi
exit 0