############################################################################### ## ## Module library ## ## 2007-01-16 Andreas Vogel (omega) ## ############################################################################### modInstDir=/raid/data/tmp/module # temporary module directory during install modBaseDir=/raid/data/module # root of the module tree modCfgDir=$modBaseDir/cfg # config directory for all modules modBinDir=$modBaseDir/bin # directory for all module executables modShlibDir=$modBaseDir/shlib # directory for all module shared libraries modBackupDir=$modBaseDir/backup/$modName # directory holding backup data for each module modDir=$modBaseDir/$modName # home directory for this module modRC=$modCfgDir/module.rc/$modName.rc # system start/stop script for this module modDB=$modCfgDir/module.db # system module database modLogDir=$modBaseDir/log # directory for log files modLog=$modLogDir/$modName.log # install/uninstall/update log file for module ############################################################################### ## ## Include E-Mail library ## ############################################################################### shellDir="/raid/data/module/$modName/Shell" [ ! -d "$shellDir" -o ! -r "$shellDir/email.lib" ] && shellDir=/raid/data/tmp/module/Shell { [ -r "$shellDir/email.lib" ] && source "$shellDir/email.lib"; } || { echo fail; exit 1; } ############################################################################### ## ## Now ## ############################################################################### Now () { echo $(date '+%Y-%m-%d %H:%M:%S') } ############################################################################### ## ## ModVersion ## ############################################################################### ModVersion () { local version=$(awk '{print $2}' < "$modDir/VERSION") if [ -z $version ] ; then version="0.00.00" fi echo $version } ############################################################################### ## ## ModuleInit ## ############################################################################### ModuleInit () { [ -d $modBaseDir -a ! -d $modLogDir ] && mkdir $modLogDir &>/dev/null [ ! -d $modLogDir ] && modLog=/raid/data/$modName.log > $modLog } ############################################################################### ## ## ModuleStart ## ############################################################################### ModuleStart () { mode=$1 ModuleInit echo "START module $mode: $modName ($(Now))" >>$modLog echo "------------------------------------------------------------------------------" >>$modLog } ############################################################################### ## ## ModuleInstallStart ## ############################################################################### ModuleInstallStart () { ModuleStart install allDirs="$modCfgDir $modCfgDir/module.rc \ $modBaseDir/backup $modBackupDir \ $modShlibDir $modBinDir \ $modDir $modDir/Shell $modDir/system $modDir/system/etc $modDir/www" for dir in $allDirs ; do echo "Create standard directory: $dir" >>$modLog [ ! -d $dir ] && mkdir $dir >>$modLog 2>&1 FileAttr root root 755 $dir >>$modLog 2>&1 done ln -sf Shell $modDir/shell echo >>$modLog for dir in Shell system www ; do echo "Copy standard directory: $modInstDir/$dir -> $modDir/$dir" >>$modLog for file in $modInstDir/$dir/* ; do [ -e "$file" ] && cp -r $file $modDir/$dir/ >>$modLog 2>&1 done done echo >>$modLog echo "Copy license file: $modInstDir/Configure/license.txt -> $modDir/COPY" >>$modLog rm -f $modDir/COPY >>$modLog 2>&1 cp $modInstDir/Configure/license.txt $modDir/COPY >>$modLog 2>&1 FileAttr root root 644 $modDir/COPY >>$modLog 2>&1 echo "Create module.rc link: $modRC -> $modDir/Shell/module.rc" >>$modLog rm -f $modRC >>$modLog 2>&1 ln -s $modDir/Shell/module.rc $modRC >>$modLog 2>&1 modVersion="$(grep '.*' $modInstDir/Configure/install.rdf | tr '<' ' ' | tr '>' ' ' | awk '{print $2;exit}')" echo "$modName $modVersion $(Now)" > $modDir/VERSION FileAttr root root 644 $modDir/VERSION >>$modLog 2>&1 ## ## TODO: Patch the apache config file in order to allow .htaccess files in the module directory ## apacheCfg=/etc/httpd/conf/httpd.conf echo "Apache config: Saving apache config file $apacheCfg -> $apacheCfg.ORIG" >>$modLog [ ! -e "$apacheCfg.ORIG" ] && cp -p "$apacheCfg" "$apacheCfg.ORIG" >>$modLog 2>&1 grepLine='LoadModule access_module modules/mod_access.so' if grep "$grepLine" "$apacheCfg" &>/dev/null ; then echo "Apache config: add module_access to apache config file: $apacheCfg" >>$modLog echo "$grepLine" > $tmpfile cat "$apacheCfg" >> $tmpfile mv $tmpfile "$apacheCfg" fi grepLine='AllowOverride AuthConfig' if grep "$grepLine" "$apacheCfg" &>/dev/null ; then echo "Apache config: add 'AllowOverride Limit' apache config file: $apacheCfg" >>$modLog sed -i -e "s/$grepLine/ AllowOverride Limit AuthConfig/g" "$apacheCfg" >>$modLog 2>&1 fi ## ## TODO: Augment PATH variable and add LD_LIBRARY_PATH variable to /etc/profile ## profile=/etc/profile tmpfile=/tmp/profile.tmp echo "Backup SHELL profile settings: $profile -> $profile.ORIG" >>$modLog [ ! -e "$profile.ORIG" ] && cp -p "$profile" "$profile.ORIG" >>$modLog 2>&1 grepLine1='true && export PATH=' grepLine2='true && export LD_LIBRARY_PATH=' cat $profile | grep -v "$grepLine1" | grep -v "$grepLine2" > $tmpfile echo 'true && export PATH="/raid/data/module/bin:$PATH"' >> $tmpfile echo 'true && export LD_LIBRARY_PATH="/raid/data/module/lib:/opt/apache/lib:$LD_LIBRARY_PATH"' >> $tmpfile mv $tmpfile $profile ## ## TODO: This patching code can be removed after Thecus fixed their software ## rclocal=/app/cfg/rc.local if grep '/img/bin/rc/rc.module >/dev/null 2>&1 &' $rclocal &>/dev/null ; then echo "Patch $rclocal..." if [ ! -e $rclocal.ORIG ] ; then echo "Backup rc.local: $rclocal -> $rclocal.ORIG" >>$modLog cp $rclocal $rclocal.ORIG >>$modLog 2>&1 fi sed -i -e 's#/img/bin/rc/rc.module >/dev/null 2>&1 &#/img/bin/rc/rc.module start >/dev/null 2>\&1 \&#' \ $rclocal >>$modLog 2>&1 fi echo >>$modLog echo "---- Start module specific log -----------------------------------------------" >>$modLog echo >>$modLog } ############################################################################### ## ## ModuleUpdateStart ## ############################################################################### ModuleUpdateStart () { ModuleStart update if [ -r "$modDir/VERSION" ] ; then modVersion=$(awk '{print $2}' < "$modDir/VERSION") else modVersion="0.00.00" fi echo >>$modLog echo "---- Start module specific log -----------------------------------------------" >>$modLog echo >>$modLog } ############################################################################### ## ## ModuleUninstallStart ## ############################################################################### ModuleUninstallStart () { ModuleStart uninstall echo "Stop module: $modRC stop" >>$modLog 2>&1 $modRC stop >>$modLog 2>&1 if [ -r "$modDir/VERSION" ] ; then modVersion=$(awk '{print $2}' < "$modDir/VERSION") else modVersion="0.00.00" fi echo >>$modLog echo "---- Start module specific log -----------------------------------------------" >>$modLog echo >>$modLog } ############################################################################### ## ## ModuleEnd ## ############################################################################### ModuleEnd () { exitcode=$1 ; mode=$2 if [ "$exitcode" == "0" ] ; then echo "FINISH module $mode: $modName ($(Now))" >>$modLog exitMsg=pass else echo "ERROR($exitcode) module $mode: $modName ($(Now))" >>$modLog exitMsg=fail fi ## ## Append this log to the log file containing all logs. ## modLogAll=${modLog}-all echo >>$modLogAll echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" >>$modLogAll echo >>$modLogAll cat $modLog >>$modLogAll ## ## Mail the result ## if [ -f $modLog -a -r $modLog ] ; then case $mode in install) modeNoun=Installation ; modeVerb=installed ;; update) modeNoun=Update ; modeVerb=updated ;; uninstall) modeNoun=Uninstallation ; modeVerb=uninstalled ;; *) modeNoun=Unknown ; modeVerb=unknown ;; esac MailResult "$modName" "$modVersion" "$modLog" "$modeNoun" "$modeVerb" fi echo $exitMsg } ############################################################################### ## ## ModuleInstallEnd ## ############################################################################### ModuleInstallEnd () { exitcode=$1 echo >>$modLog echo "---- End module specific log -------------------------------------------------" >>$modLog echo >>$modLog ## ## Set file attributes for standard scripts ## for script in configtool ; do echo "Setting file attribs for: $modDir/system/$script" >>$modLog FileAttr root root 755 $modDir/system/$script >>$modLog 2>&1 done ## ## Restore saved config files if there are any ## echo "Restoring saved $modName configuration files (if any)" >>$modLog $modDir/system/configtool restore $modName nowarn >>$modLog 2>&1 ModuleEnd $exitcode install } ############################################################################### ## ## ModuleUpdateEnd ## ############################################################################### ModuleUpdateEnd () { exitcode=$1 echo >>$modLog echo "---- End module specific log -------------------------------------------------" >>$modLog echo >>$modLog ModuleEnd $exitcode update } ############################################################################### ## ## ModuleUninstallEnd ## ############################################################################### ModuleUninstallEnd () { exitcode=$1 echo >>$modLog echo "---- End module specific log -------------------------------------------------" >>$modLog echo >>$modLog ## ## Restore saved config files if there are any ## echo "Save $modName configuration files" >>$modLog $modDir/system/configtool backup $modName >>$modLog 2>&1 ## ## Delete module from config database ## echo "Delete module '$modName' from table 'module' in $modDB..." >>$modLog /opt/bin/sqlite $modDB "delete from module where name = '$modName'" >>$modLog 2>&1 echo "Delete module '$modName' from table 'mod' in $modDB..." >>$modLog /opt/bin/sqlite $modDB "delete from mod where module = '$modName'" >>$modLog 2>&1 echo "Remove start/stop script $modRC..." >>$modLog rm -f $modRC >>$modLog 2>&1 echo "Remove module directory $modDir..." >>$modLog rm -rf $modDir >>$modLog 2>&1 ModuleEnd $exitcode uninstall } ############################################################################### ## ## ProcsRunning ## ############################################################################### ProcsRunning () { searchPattern="$1" procs=$(ps w | grep -v grep | grep -E "$searchPattern" 2>/dev/null | wc -l 2>/dev/null) [ -z $procs ] && procs=0 echo $procs return $(expr $procs == 0) } ############################################################################### ## ## ProcKillall ## ############################################################################### ProcKillall () { procPattern="$1" ; signal=${2:-9} if [ -z "$procPattern" ] ; then return 0 fi loop=0 while true ; do pidlist=$(ps -w | grep -v grep | grep -E "$procPattern" 2>/dev/null | awk '{print $1}') for pid in $pidlist ; do kill -$signal $pid &>/dev/null done if ! ProcsRunning "$procPattern" &>/dev/null || test $loop -gt 10 ; then break fi sleep 1 let loop++ done if ProcsRunning "$procPattern" &>/dev/null ; then return 1 fi return 0 } ############################################################################### ## ## MailResult ## ############################################################################### MailResult() { modName=$1 ; modVers=$2 ; instLogFile=$3 ; modeNoun=${4:-Installation} ; modeVerb=${5:-installed} tmpmsgfile=/tmp/tmp.TestMail.$$ cat > $tmpmsgfile <<-EOF From: @mailEnvFrom@ To: @mailEnvTo@ Subject: $modeNoun finished for module $modName-$modVers Hello @mailEnvTo@, The module $modName-$modVers was $modeVerb on your Thecus N5200 device @hostname@. Please check the log output below for errors ($instLogFile): ======================================================================= EOF cat $instLogFile >> $tmpmsgfile cat >> $tmpmsgfile <<-EOF ======================================================================= ----------------------------------------------------------------------- This is a software generated mail message on @hostname@ at @now@. EOF MailSend "" "" $tmpmsgfile rm -f $tmpmsgfile } ############################################################################### ## ## FileAttr ## ############################################################################### FileAttr () { sOwner=$1 ; sGroup=$2 ; sMode=$3 ; shift ; shift ; shift if [ $# -le 0 ] ; then echo "FileAttr: WARNING: no files given" return 1 fi ret=0 for file in $* ; do chown $sOwner.$sGroup "$file" || ret=1 chmod $sMode "$file" || ret=1 done return $ret }