Advertisement
theroot

updateworld.sh

Feb 8th, 2013
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 11.93 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # A Gentoo script that performs self world update tasks, customizable to your commands.
  4. # See https://code.google.com/p/updateworld for more information.
  5. # Written by Chris Frye (rootprogramming@gmail.com)
  6.  
  7. # set default vars, then load custom conf.
  8. tmpfile='/tmp/updateworld.txt'
  9. logfile='/var/log/portage/updateworld.log'
  10. esfile='/tmp/updateworld.es'
  11. stamp=`date +%m%d%y`
  12. f_sync='yes'
  13. sync_cmd='emerge --sync'
  14. f_emerge='yes'
  15. em_cmd='emerge -vuDN world'
  16. f_revdep='yes'
  17. revdep_cmd='revdep-rebuild -i'
  18. f_etc='yes'
  19. etc_cmd='etc-update -q'
  20. f_lock='yes'
  21. lockfile='/tmp/updateworld.lock'
  22. watch_cmd="watch -t -n0.1 tail -82 ${logfile}"
  23. pre_cmd=''
  24. post_cmd=''
  25. fail_cmd=''
  26. exitstatus='0'
  27. f_verbose='no'
  28.  
  29. . /etc/conf.d/updateworld.conf
  30.  
  31. function prepwork() {
  32.  
  33. $pre_cmd
  34.  
  35. checkLock ${f_lock}
  36.  
  37. cpf=`set -o |awk '/pipefail/{ print $2 }'`
  38. if [ "$cpf" = "off" ]
  39. then
  40.         set -o pipefail
  41. fi
  42.  
  43. touch $tmpfile;tmpvar=`echo $?`
  44. if [ "$tmpvar" -eq "0" ]
  45. then
  46.         if [ -e ${logfile} ]
  47.         then
  48.                 mv ${logfile} ${logfile}_old
  49.         fi
  50.  
  51.         touch ${logfile};tmpvar2=`echo $?`
  52.         if [ "$tmpvar2" -eq "0" ]
  53.         then
  54.                 if [ "$f_verbose" = "yes" ]
  55.                 then
  56.                         f_ss='1'
  57.                         #script --quiet ${logfile}
  58.                 fi
  59.                 mainupdate
  60.         else
  61.                 error_msg='\nFAILED TO TOUCH LOGFILE - CHECK PERMS'
  62.                 dirtyexit
  63.         fi
  64. else
  65.         error_msg='\nFAILED TO TOUCH TMPFILE - CHECK PERMS'
  66.         dirtyexit
  67. fi
  68.  
  69. }
  70.  
  71. function cleanexit() {
  72.  
  73. rm -f $tmpfile
  74. echo -e '\nWORLD UPDATE COMPLETE!\n'
  75. set -o pipefail
  76.  
  77. echo -e '\n*** WORLD UPDATE COMPLETE! ***\n' >>${logfile}
  78.  
  79. if [ "$f_lock" = 'yes' ]
  80. then
  81.         rm -rf $lockfile
  82. fi
  83.  
  84. killWatch
  85.  
  86. $post_cmd
  87.  
  88. if [ "${f_ss}" = '1' ]
  89. then
  90.         exit
  91. fi
  92.  
  93. exit 0
  94.  
  95. }
  96.  
  97. function dirtyexit() {
  98.  
  99. echo -e $error_msg
  100. echo -e "\007"
  101. echo -e '\n*** PREMATURE EXIT - SEEK HELP ***\n'
  102. set -o pipefail
  103.  
  104. if [ "$f_lock" = 'yes' ] && [ "${1}" != 'locked' ]
  105. then
  106.         rm -rf $lockfile
  107. fi
  108.  
  109. echo -e "\n\n*** DIRTY EXIT ***\n${error_msg}\n\n" >>${logfile}
  110.  
  111. killWatch
  112.  
  113. $fail_cmd
  114.  
  115. if [ "${f_ss}" = '1' ]
  116. then
  117.         exit
  118. fi
  119.  
  120. exit 1
  121.  
  122. }
  123.  
  124. function abortme() {
  125.  
  126. rm -f $tmpfile
  127. echo -e "\007"
  128. echo -e '\n*** ABORTING CHILDREN ***\n'
  129.  
  130. if [ "$f_lock" == "yes" ]
  131. then
  132.         rm -rf $lockfile
  133. fi
  134.  
  135. killWatch
  136.  
  137. echo -e "\n\n${error_msg}\n\n" >>${logfile}
  138.  
  139. if [ "${f_ss}" = '1' ]
  140. then
  141.         exit
  142. fi
  143.  
  144. exit 2
  145.  
  146. }
  147.  
  148. function worldsync() {
  149.  
  150. exitstatus=''
  151. echo '0' >${esfile}
  152.  
  153. echo -e '\nSYNCING WITH LATEST PORTAGE BRANCH'
  154.  
  155. if [ "$f_verbose" = "yes" ]
  156. then
  157.         script -a --quiet --command "${sync_cmd} 2>&1; echo $? >${esfile}" ${logfile}
  158. else
  159.         ${sync_cmd} 2>&1 | tee >>${logfile}; echo $? >${esfile}
  160. fi
  161.  
  162. exitstatus=`cat ${esfile}`
  163.  
  164. if [ "$exitstatus" -ne "0" ]
  165. then
  166.         error_msg='\nWORLD SYNC FAILURE - CHECK LOGS'
  167.         dirtyexit
  168. fi
  169.  
  170. }
  171.  
  172. function worldupd() {
  173.  
  174. exitstatus=''
  175. echo '2' >${esfile}
  176.  
  177. echo -e '\nEMERGING NEW WORLD'
  178.  
  179. if [ "$f_kg" = "yes" ]
  180. then
  181.         em_cmd="${em_cmd} --keep-going"
  182. fi
  183.  
  184. if [ "$f_pretend" = "yes" ]
  185. then
  186.         if [ "$f_verbose" = "yes" ]
  187.         then
  188.                 em_cmd="${em_cmd} --pretend"
  189.                 script -a --quiet --command "${em_cmd} 2>&1; echo '0' >${esfile}" ${logfile}
  190.         else
  191.                 em_cmd="${em_cmd} --pretend"
  192.                 ${em_cmd} 2>&1 | tee >>${logfile}; echo '0' >${esfile}
  193.         fi
  194. else
  195.         if [ "$f_verbose" = "yes" ]
  196.         then
  197.                 script -a --quiet --command "${em_cmd} 2>&1; echo $? >${esfile}" ${logfile}
  198.         else
  199.                 ${em_cmd} 2>&1 | tee >>${logfile}; echo $? >${esfile}
  200.         fi
  201. fi
  202.  
  203. exitstatus=`cat ${esfile}`
  204.  
  205. if [ "$exitstatus" -ne "0" ]
  206. then
  207.         error_msg='\nFAILED TO EMERGE WORLD - CHECK LOGS'
  208.         dirtyexit
  209. fi
  210.  
  211. }
  212.  
  213. function revdep() {
  214.  
  215. exitstatus=''
  216. echo '0' >${esfile}
  217.  
  218. echo -e '\nREBUILDING REVERSE DEPENDENCIES CHECK'
  219.  
  220. if [ "$f_verbose" = "yes" ]
  221. then
  222.         script -a --quiet --command "${revdep_cmd} 2>&1; echo $? >${esfile}"
  223. else
  224.         ${revdep_cmd} 2>&1 | tee >>${logfile}; echo $? >${esfile}
  225. fi
  226.  
  227. exitstatus=`cat ${esfile}`
  228.  
  229. if [ "$exitstatus" -ne "0" ]
  230. then
  231.         error_msg="\nFAILED TO REBUILD REVERSE DEPENDENCIES - CHECK LOGS"
  232.         dirtyexit
  233. fi
  234.  
  235. }
  236.  
  237. function etcupd() {
  238.  
  239. exitstatus=''
  240. echo '0' >${esfile}
  241.  
  242. echo -e '\nCHECKING /etc FOR CONFIG FILE UPDATES'
  243.  
  244. if [ "$f_verbose" = "yes" ]
  245. then
  246.         script -a --quiet --command "${etc_cmd};echo $? >${esfile}"
  247. else
  248.         ${etc_cmd}; echo $? >${esfile}
  249. fi
  250.  
  251. exitstatus=`cat ${esfile}`
  252.  
  253. if [ "$exitstatus" -ne "0" ]
  254. then
  255.         error_msg='\nFAILED TO UPDATE ETC FILES - CHECK LOGS'
  256.         dirtyexit
  257. fi
  258.  
  259. }
  260.  
  261. function mainupdate() {
  262.  
  263. if [ "$f_sync" = "yes" ]
  264. then
  265.         worldsync
  266. fi
  267.  
  268. if [ "$f_emerge" = "yes" ]
  269. then
  270.         worldupd
  271. fi
  272.  
  273. if [ "$f_revdep" = "yes" ]
  274. then
  275.         revdep
  276. fi
  277.  
  278. if [ "$f_etc" = "yes" ]
  279. then
  280.         etcupd
  281. fi
  282.  
  283. if [ "$exitstatus" -eq "0" ]
  284. then
  285.         cleanexit
  286. fi
  287.  
  288. }
  289.  
  290. function parseOpts() {
  291.  
  292. oo2=`echo $* |sed "s/${1} //"`
  293. oo3=`echo $* |sed "s/${1} //" |tr -d '\-\-'`
  294. oo4=`echo "$* --nolock" |sed "s/--verbose //" |sed "s/--verbose//" |sed "s/--lock //" |sed "s/--lock//" |sed "s/fullupd //" |sed "s/fullupd//"`
  295.  
  296. go_check='0'
  297.  
  298. #echo -e "oo3=(${oo3})\noo2=(${oo3})\noo4=(${oo4})"
  299.  
  300. for each in ${*}
  301. do
  302.         case "$each" in
  303.                 --verbose2)
  304.                         #checkLock ${*}
  305.                         f_verbose='1'
  306.                         #go_check='1'
  307.                         #lcmd="${0} --go ${oo4}"
  308.                         #$lcmd 2>&1 |tee >/dev/null &
  309.                         #sleep 1
  310.                         #$watch_cmd
  311.                         #cat ${logfile}
  312.                         #checkLock remove
  313.                         #exit
  314.                 ;;
  315.                 --full)
  316.                         go_check='1'
  317.                         updateParse fullupd
  318.                 ;;
  319.         esac
  320. done
  321.  
  322. if [ "$go_check" -eq '0' ]
  323. then
  324.         updateParse ${oo3}
  325. fi
  326.  
  327. }
  328.  
  329. function killWatch() {
  330.  
  331. sleep 2
  332. if [ -s ${lockfile} ]
  333. then
  334.         mypid=`cat $lockfile`
  335.         wpid=`ps -ef |egrep "${mypid}"|awk '/watch/{ print \$2 }'`
  336.         wpid_c=`ps -ef |egrep "${mypid}"|awk '/watch/{ print \$2 }' |wc -l`
  337.         if [ "${wpid_c}" = "1" ]
  338.         then
  339.                 kill ${wpid}
  340.         fi
  341. fi
  342.  
  343. }
  344.  
  345. function checkLock() {
  346.  
  347. for each in ${*}
  348. do
  349.         case ${each} in
  350.                         --lock)
  351.                                 f_lock='yes'
  352.                         ;;
  353.                         --nolock)
  354.                                 f_lock='no'
  355.                         ;;
  356.                         remove)
  357.                                 if [ ${f_lock} = 'yes' ] && [ -e ${lockfile} ]
  358.                                 then
  359.                                         rm -rf ${lockfile}
  360.                                         f_lock='no'
  361.                                 fi
  362.                         ;;
  363.         esac
  364. done
  365.  
  366. if [ "$f_lock" = 'yes' ]
  367. then
  368.         if [ -s $lockfile ]
  369.         then
  370.                 error_msg="\nLOCKFILE EXISTS - CHECK FOR DUPLICATE PROCCESSES"
  371.                 dirtyexit locked
  372.         fi
  373. fi
  374.  
  375. if [ "$f_lock" = 'yes' ]
  376. then
  377.         echo $$ >$lockfile;tmpvar3=`echo $?`
  378.  
  379.         if [ "$tmpvar3" -ne "0" ]
  380.         then
  381.                 error_msg='\nFAILED TO ACQUIRE LOCK - CHECK PERMS'
  382.                 dirrtyexit
  383.         fi
  384. fi
  385.  
  386. }
  387.  
  388. function updateParse() {
  389.  
  390. go_check='1'
  391. error_opt=''
  392.  
  393. for each in ${*}
  394. do
  395.  
  396.         case "$each" in
  397.                 fullupd)
  398.                         #prepwork
  399.                         go_check='0'
  400.                 ;;
  401.                 nosync)
  402.                         f_sync='no'
  403.                         go_check='0'
  404.                 ;;
  405.                 noemerge)
  406.                         f_emerge='no'
  407.                         go_check='0'
  408.                 ;;
  409.                 norevdep)
  410.                         f_revdep='no'
  411.                         go_check='0'
  412.                 ;;
  413.                 noetc)
  414.                         f_etc='no'
  415.                         go_check='0'
  416.                 ;;
  417.                 sync)
  418.                         f_sync='yes'
  419.                         go_check='0'
  420.                 ;;
  421.                 emerge)
  422.                         f_emerge='yes'
  423.                         go_check='0'
  424.                 ;;
  425.                 revdep)
  426.                         f_revdep='yes'
  427.                         go_check='0'
  428.                 ;;
  429.                 etc)
  430.                         f_etc='yes'
  431.                         go_check='0'
  432.                 ;;
  433.                 lock)
  434.                         f_lock='yes'
  435.                         go_check='0'
  436.                 ;;
  437.                 nolock)
  438.                         f_lock='no'
  439.                         go_check='0'
  440.                 ;;
  441.                 pretend)
  442.                         f_pretend='yes'
  443.                         f_revdep='no'
  444.                         f_etc='no'
  445.                         go_check='0'
  446.                 ;;
  447.                 keepgoing)
  448.                         f_kg='yes'
  449.                         go_check='0'
  450.                 ;;
  451.                 forcesync)
  452.                         mv /usr/portage/metadata/timestamp.chk /usr/portage/metadata/timestamp.chk_force
  453.                         rm /usr/portage/metadata/timestamp.chk
  454.                         go_check='0'
  455.                 ;;
  456.                 verbose)
  457.                         f_verbose='yes'
  458.                         go_check='0'
  459.                 ;;
  460.                 noverbose)
  461.                         f_verbose='no'
  462.                         go_check='0'
  463.                 ;;
  464.                 help)
  465.                         go_check='1'
  466.                         if [ "${error_opt}" = '' ]
  467.                         then
  468.                                 error_opt='HELP'
  469.                         fi
  470.                 ;;
  471.                 *)
  472.                         error_opt="${error_opt} ${each}"
  473.                         go_check='1'
  474.                 ;;
  475.         esac
  476.  
  477. done
  478.  
  479. if [ "$go_check" = "0" ]
  480. then
  481.         prepwork
  482. else
  483.         helpme $error_opt
  484. fi
  485.  
  486. }
  487.  
  488. function helpme() {
  489.  
  490. error_opt="${error_opt} "
  491. echo -e $"\nMain Function:\n   { --go | --full | --fullupd | --clearlock | --help }\n\nOptions:"
  492. echo -e "   { --verbose | --noverbose | --lock | --nolock }"
  493. echo -e "   { --nosync | --noemerge | --norevdep | --noetc }"
  494. echo -e "   { --sync | --emerge | --revdep | --etc }"
  495. echo -e "   { --pretend | --keepgoing | --forcesync }\n"
  496. echo -e "EX: '${0} --go --nosync --lock --verbose'\n        will run a full update without syncing and output progress logs"
  497. echo -e "EX: '${0} --full'\n        will run a full update all functions and options defined in config file\n"
  498. echo -e "Further help and configuration available in '/etc/conf.d/updateworld.conf' and the included README file\n"
  499.  
  500. if [ "${1}" != 'HELP' ]
  501. then
  502. echo -e "UNKWNON OPTION: ( ${error_opt} )\n"
  503. fi
  504.  
  505. exit 1
  506.  
  507. }
  508.  
  509. trap abortme SIGINT
  510.  
  511. oo=`echo $* |sed "s/${1} //"`
  512.  
  513. case "$1" in
  514.                 --full)
  515.                         parseOpts fullupd
  516.                 ;;
  517.                 --go)
  518.                         parseOpts fullupd $oo
  519.                 ;;
  520.                 --fullupd)
  521.                         updateParse fullupd
  522.                 ;;
  523.                 --killwatch)
  524.                         killWatch
  525.                 ;;
  526.                 --help)
  527.                         error_opt='HELP'
  528.                         helpme $error_opt
  529.                 ;;
  530.                 --clearlock)
  531.                         if [ -e ${lockfile} ]
  532.                         then
  533.                                 rm -rf ${lockfile}
  534.                         fi
  535.                 ;;
  536.                 *)
  537.                         error_opt=${1}
  538.                         helpme $error_opt
  539.                 ;;
  540. esac
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement