Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # A Gentoo script that performs self world update tasks, customizable to your commands.
- # See https://code.google.com/p/updateworld for more information.
- # Written by Chris Frye (rootprogramming@gmail.com)
- # set default vars, then load custom conf.
- tmpfile='/tmp/updateworld.txt'
- logfile='/var/log/portage/updateworld.log'
- esfile='/tmp/updateworld.es'
- stamp=`date +%m%d%y`
- f_sync='yes'
- sync_cmd='emerge --sync'
- f_emerge='yes'
- em_cmd='emerge -vuDN world'
- f_revdep='yes'
- revdep_cmd='revdep-rebuild -i'
- f_etc='yes'
- etc_cmd='etc-update -q'
- f_lock='yes'
- lockfile='/tmp/updateworld.lock'
- watch_cmd="watch -t -n0.1 tail -82 ${logfile}"
- pre_cmd=''
- post_cmd=''
- fail_cmd=''
- exitstatus='0'
- f_verbose='no'
- . /etc/conf.d/updateworld.conf
- function prepwork() {
- $pre_cmd
- checkLock ${f_lock}
- cpf=`set -o |awk '/pipefail/{ print $2 }'`
- if [ "$cpf" = "off" ]
- then
- set -o pipefail
- fi
- touch $tmpfile;tmpvar=`echo $?`
- if [ "$tmpvar" -eq "0" ]
- then
- if [ -e ${logfile} ]
- then
- mv ${logfile} ${logfile}_old
- fi
- touch ${logfile};tmpvar2=`echo $?`
- if [ "$tmpvar2" -eq "0" ]
- then
- if [ "$f_verbose" = "yes" ]
- then
- f_ss='1'
- #script --quiet ${logfile}
- fi
- mainupdate
- else
- error_msg='\nFAILED TO TOUCH LOGFILE - CHECK PERMS'
- dirtyexit
- fi
- else
- error_msg='\nFAILED TO TOUCH TMPFILE - CHECK PERMS'
- dirtyexit
- fi
- }
- function cleanexit() {
- rm -f $tmpfile
- echo -e '\nWORLD UPDATE COMPLETE!\n'
- set -o pipefail
- echo -e '\n*** WORLD UPDATE COMPLETE! ***\n' >>${logfile}
- if [ "$f_lock" = 'yes' ]
- then
- rm -rf $lockfile
- fi
- killWatch
- $post_cmd
- if [ "${f_ss}" = '1' ]
- then
- exit
- fi
- exit 0
- }
- function dirtyexit() {
- echo -e $error_msg
- echo -e "\007"
- echo -e '\n*** PREMATURE EXIT - SEEK HELP ***\n'
- set -o pipefail
- if [ "$f_lock" = 'yes' ] && [ "${1}" != 'locked' ]
- then
- rm -rf $lockfile
- fi
- echo -e "\n\n*** DIRTY EXIT ***\n${error_msg}\n\n" >>${logfile}
- killWatch
- $fail_cmd
- if [ "${f_ss}" = '1' ]
- then
- exit
- fi
- exit 1
- }
- function abortme() {
- rm -f $tmpfile
- echo -e "\007"
- echo -e '\n*** ABORTING CHILDREN ***\n'
- if [ "$f_lock" == "yes" ]
- then
- rm -rf $lockfile
- fi
- killWatch
- echo -e "\n\n${error_msg}\n\n" >>${logfile}
- if [ "${f_ss}" = '1' ]
- then
- exit
- fi
- exit 2
- }
- function worldsync() {
- exitstatus=''
- echo '0' >${esfile}
- echo -e '\nSYNCING WITH LATEST PORTAGE BRANCH'
- if [ "$f_verbose" = "yes" ]
- then
- script -a --quiet --command "${sync_cmd} 2>&1; echo $? >${esfile}" ${logfile}
- else
- ${sync_cmd} 2>&1 | tee >>${logfile}; echo $? >${esfile}
- fi
- exitstatus=`cat ${esfile}`
- if [ "$exitstatus" -ne "0" ]
- then
- error_msg='\nWORLD SYNC FAILURE - CHECK LOGS'
- dirtyexit
- fi
- }
- function worldupd() {
- exitstatus=''
- echo '2' >${esfile}
- echo -e '\nEMERGING NEW WORLD'
- if [ "$f_kg" = "yes" ]
- then
- em_cmd="${em_cmd} --keep-going"
- fi
- if [ "$f_pretend" = "yes" ]
- then
- if [ "$f_verbose" = "yes" ]
- then
- em_cmd="${em_cmd} --pretend"
- script -a --quiet --command "${em_cmd} 2>&1; echo '0' >${esfile}" ${logfile}
- else
- em_cmd="${em_cmd} --pretend"
- ${em_cmd} 2>&1 | tee >>${logfile}; echo '0' >${esfile}
- fi
- else
- if [ "$f_verbose" = "yes" ]
- then
- script -a --quiet --command "${em_cmd} 2>&1; echo $? >${esfile}" ${logfile}
- else
- ${em_cmd} 2>&1 | tee >>${logfile}; echo $? >${esfile}
- fi
- fi
- exitstatus=`cat ${esfile}`
- if [ "$exitstatus" -ne "0" ]
- then
- error_msg='\nFAILED TO EMERGE WORLD - CHECK LOGS'
- dirtyexit
- fi
- }
- function revdep() {
- exitstatus=''
- echo '0' >${esfile}
- echo -e '\nREBUILDING REVERSE DEPENDENCIES CHECK'
- if [ "$f_verbose" = "yes" ]
- then
- script -a --quiet --command "${revdep_cmd} 2>&1; echo $? >${esfile}"
- else
- ${revdep_cmd} 2>&1 | tee >>${logfile}; echo $? >${esfile}
- fi
- exitstatus=`cat ${esfile}`
- if [ "$exitstatus" -ne "0" ]
- then
- error_msg="\nFAILED TO REBUILD REVERSE DEPENDENCIES - CHECK LOGS"
- dirtyexit
- fi
- }
- function etcupd() {
- exitstatus=''
- echo '0' >${esfile}
- echo -e '\nCHECKING /etc FOR CONFIG FILE UPDATES'
- if [ "$f_verbose" = "yes" ]
- then
- script -a --quiet --command "${etc_cmd};echo $? >${esfile}"
- else
- ${etc_cmd}; echo $? >${esfile}
- fi
- exitstatus=`cat ${esfile}`
- if [ "$exitstatus" -ne "0" ]
- then
- error_msg='\nFAILED TO UPDATE ETC FILES - CHECK LOGS'
- dirtyexit
- fi
- }
- function mainupdate() {
- if [ "$f_sync" = "yes" ]
- then
- worldsync
- fi
- if [ "$f_emerge" = "yes" ]
- then
- worldupd
- fi
- if [ "$f_revdep" = "yes" ]
- then
- revdep
- fi
- if [ "$f_etc" = "yes" ]
- then
- etcupd
- fi
- if [ "$exitstatus" -eq "0" ]
- then
- cleanexit
- fi
- }
- function parseOpts() {
- oo2=`echo $* |sed "s/${1} //"`
- oo3=`echo $* |sed "s/${1} //" |tr -d '\-\-'`
- oo4=`echo "$* --nolock" |sed "s/--verbose //" |sed "s/--verbose//" |sed "s/--lock //" |sed "s/--lock//" |sed "s/fullupd //" |sed "s/fullupd//"`
- go_check='0'
- #echo -e "oo3=(${oo3})\noo2=(${oo3})\noo4=(${oo4})"
- for each in ${*}
- do
- case "$each" in
- --verbose2)
- #checkLock ${*}
- f_verbose='1'
- #go_check='1'
- #lcmd="${0} --go ${oo4}"
- #$lcmd 2>&1 |tee >/dev/null &
- #sleep 1
- #$watch_cmd
- #cat ${logfile}
- #checkLock remove
- #exit
- ;;
- --full)
- go_check='1'
- updateParse fullupd
- ;;
- esac
- done
- if [ "$go_check" -eq '0' ]
- then
- updateParse ${oo3}
- fi
- }
- function killWatch() {
- sleep 2
- if [ -s ${lockfile} ]
- then
- mypid=`cat $lockfile`
- wpid=`ps -ef |egrep "${mypid}"|awk '/watch/{ print \$2 }'`
- wpid_c=`ps -ef |egrep "${mypid}"|awk '/watch/{ print \$2 }' |wc -l`
- if [ "${wpid_c}" = "1" ]
- then
- kill ${wpid}
- fi
- fi
- }
- function checkLock() {
- for each in ${*}
- do
- case ${each} in
- --lock)
- f_lock='yes'
- ;;
- --nolock)
- f_lock='no'
- ;;
- remove)
- if [ ${f_lock} = 'yes' ] && [ -e ${lockfile} ]
- then
- rm -rf ${lockfile}
- f_lock='no'
- fi
- ;;
- esac
- done
- if [ "$f_lock" = 'yes' ]
- then
- if [ -s $lockfile ]
- then
- error_msg="\nLOCKFILE EXISTS - CHECK FOR DUPLICATE PROCCESSES"
- dirtyexit locked
- fi
- fi
- if [ "$f_lock" = 'yes' ]
- then
- echo $$ >$lockfile;tmpvar3=`echo $?`
- if [ "$tmpvar3" -ne "0" ]
- then
- error_msg='\nFAILED TO ACQUIRE LOCK - CHECK PERMS'
- dirrtyexit
- fi
- fi
- }
- function updateParse() {
- go_check='1'
- error_opt=''
- for each in ${*}
- do
- case "$each" in
- fullupd)
- #prepwork
- go_check='0'
- ;;
- nosync)
- f_sync='no'
- go_check='0'
- ;;
- noemerge)
- f_emerge='no'
- go_check='0'
- ;;
- norevdep)
- f_revdep='no'
- go_check='0'
- ;;
- noetc)
- f_etc='no'
- go_check='0'
- ;;
- sync)
- f_sync='yes'
- go_check='0'
- ;;
- emerge)
- f_emerge='yes'
- go_check='0'
- ;;
- revdep)
- f_revdep='yes'
- go_check='0'
- ;;
- etc)
- f_etc='yes'
- go_check='0'
- ;;
- lock)
- f_lock='yes'
- go_check='0'
- ;;
- nolock)
- f_lock='no'
- go_check='0'
- ;;
- pretend)
- f_pretend='yes'
- f_revdep='no'
- f_etc='no'
- go_check='0'
- ;;
- keepgoing)
- f_kg='yes'
- go_check='0'
- ;;
- forcesync)
- mv /usr/portage/metadata/timestamp.chk /usr/portage/metadata/timestamp.chk_force
- rm /usr/portage/metadata/timestamp.chk
- go_check='0'
- ;;
- verbose)
- f_verbose='yes'
- go_check='0'
- ;;
- noverbose)
- f_verbose='no'
- go_check='0'
- ;;
- help)
- go_check='1'
- if [ "${error_opt}" = '' ]
- then
- error_opt='HELP'
- fi
- ;;
- *)
- error_opt="${error_opt} ${each}"
- go_check='1'
- ;;
- esac
- done
- if [ "$go_check" = "0" ]
- then
- prepwork
- else
- helpme $error_opt
- fi
- }
- function helpme() {
- error_opt="${error_opt} "
- echo -e $"\nMain Function:\n { --go | --full | --fullupd | --clearlock | --help }\n\nOptions:"
- echo -e " { --verbose | --noverbose | --lock | --nolock }"
- echo -e " { --nosync | --noemerge | --norevdep | --noetc }"
- echo -e " { --sync | --emerge | --revdep | --etc }"
- echo -e " { --pretend | --keepgoing | --forcesync }\n"
- echo -e "EX: '${0} --go --nosync --lock --verbose'\n will run a full update without syncing and output progress logs"
- echo -e "EX: '${0} --full'\n will run a full update all functions and options defined in config file\n"
- echo -e "Further help and configuration available in '/etc/conf.d/updateworld.conf' and the included README file\n"
- if [ "${1}" != 'HELP' ]
- then
- echo -e "UNKWNON OPTION: ( ${error_opt} )\n"
- fi
- exit 1
- }
- trap abortme SIGINT
- oo=`echo $* |sed "s/${1} //"`
- case "$1" in
- --full)
- parseOpts fullupd
- ;;
- --go)
- parseOpts fullupd $oo
- ;;
- --fullupd)
- updateParse fullupd
- ;;
- --killwatch)
- killWatch
- ;;
- --help)
- error_opt='HELP'
- helpme $error_opt
- ;;
- --clearlock)
- if [ -e ${lockfile} ]
- then
- rm -rf ${lockfile}
- fi
- ;;
- *)
- error_opt=${1}
- helpme $error_opt
- ;;
- esac
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement