summaryrefslogtreecommitdiff
path: root/localwebstats
blob: a5ddbfadcec8e66809d253b7fd2a587a1ce64fb3 (plain)
  1. #!/bin/bash
  2. #
  3. # /usr/local/sbin/localwebstats
  4. # Copyright 2001-2002 Jonas Smedegaard <dr@jones.dk>
  5. #
  6. # $Id: localwebstats,v 1.27 2003-06-28 19:18:42 jonas Exp $
  7. #
  8. # Webstats maintenance script
  9. #
  10. # Example config file (/etc/local/webstats.conf).
  11. #
  12. # --- CUT --- CUT --- CUT ---
  13. # #!/bin/sh
  14. #
  15. # # * Websites are in /home/<uid>/websites/<fqdn>
  16. # # * Apache httpd.conf has this line added:
  17. # # Include /etc/apache/vhosts.d
  18. # # * Apache use /usr/local/bin/parselog into /var/log/apache-vhosts/
  19. # # * /usr/lib/apache/suexec is recompiled using /usr/local/bin/make-suexec-for-home
  20. # # * Each webhost has apache config in /etc/apache/vhosts.d/<fqdn>
  21. # # * /etc/apache/vhosts.d/<fqdn> has hints about host- and domain-part of fqdn:
  22. # # # webstats: hostname: <hostname>
  23. # # # webstats: domainname: <domainname>
  24. #
  25. # #WEBALIZER_OPTIONS="-Q"
  26. #
  27. # LOGROOT='/var/log/apache-vhosts'
  28. # WEBROOT='/home'
  29. #
  30. # function statsdir() { echo /home/jonas/websites/stats.$(dnsdomainname)/$3; }
  31. # function webdirs() { find /etc/apache/vhosts.d/ -type f -exec egrep '^#\W*webstats:' '{}' -l ';' | xargs basename; }
  32. # function host() { cat /etc/apache/vhosts.d/$3 | egrep '#\W*webstats:\W*hostname:\W*[\.[:alnum:]]+\W*$' | sed 's/^.*:\W\([\.[:alnum:]]\+\)\W*$/\1/'; }
  33. # function domain() { cat /etc/apache/vhosts.d/$3 | egrep '#\W*webstats:\W*domainname:\W*[\.[:alnum:]]+\W*$' | sed 's/^.*:\W\([\.[:alnum:]]\+\)\W*$/\1/'; }
  34. #
  35. # --- CUT --- CUT --- CUT ---
  36. #
  37. # TODO: Run as non-provoleged user
  38. #
  39. # halt on errors
  40. set -e
  41. function usage() {
  42. echo "Usage: $(basename $0) init|update|prelogrotate|postlogrotate|ignore <website> [<website>...]"
  43. echo " If no website is given, all are attempted"
  44. echo " Tip: Automagically runs when symlinked to /etc/cron.{daily,weekly,monthly}/"
  45. exit 1
  46. }
  47. function exit1() {
  48. echo "Error: $1"
  49. echo "Exiting..."
  50. exit 1
  51. }
  52. # automagically configure when run from cron dirs
  53. case $(dirname $0) in
  54. /etc/cron.daily)
  55. stamp=update
  56. ;;
  57. /etc/cron.weekly)
  58. stamp=ignore
  59. ;;
  60. /etc/cron.monthly)
  61. stamp=ignore
  62. ;;
  63. *)
  64. stamp=$1
  65. shift || usage
  66. ;;
  67. esac
  68. case "$stamp" in
  69. init|update|prelogrotate|postlogrotate|ignore)
  70. ;;
  71. *)
  72. usage
  73. ;;
  74. esac
  75. if [ "$stamp" = "ignore" ]; then
  76. [ $DEBUG ] && echo "Asked to ignore - exiting silently..."
  77. exit 0
  78. fi
  79. ROOT=1
  80. user=www-data
  81. group=www-data
  82. LOGROOT=/var/log/apache-vhosts
  83. WEBROOT=/var/www
  84. # Options: $1=LOGROOT, $2=WEBROOT, $3=WEBSITE
  85. function statsdir() { echo $2/VIRTUAL/stats.$(dnsdomainname)/www/$3; }
  86. function webdirs() { find $1 -type d -mindepth 1 -maxdepth 1 | grep '\.*\.' | sed 's!$1!!'; }
  87. #function logfiles() { $(ls -r $LOGDIR/*-access*.gz) $(ls -r $LOGDIR/access*.??.gz) $(ls -r $LOGDIR/access*.?.gz) $(ls -r $LOGDIR/access*.?); }
  88. function logcontentresolved() { for file in $(find $1/$3 -name '????.??.00.gz' -type f -mindepth 1 -maxdepth 1 -follow | sort); do zcat $file; done; for file in $(find $1/$3 -name '????.??.00' -type f -mindepth 1 -maxdepth 1 -follow | sort); do cat $file; done; }
  89. function logcontent() { for file in $(find $1/$3 -name '????.??.??.gz' ! -name '*00.gz' -type f -mindepth 1 -maxdepth 1 -follow | sort); do zcat $file; done; for file in $(find $1/$3 -name '????.??.??' ! -name '*00' -type f -mindepth 1 -maxdepth 1 -follow | sort); do cat $file; done; }
  90. function host() { cat $2/VIRTUAL/$3/hostname || exit1 "Unable to get hostname for virtual host."; }
  91. function domain() { cat $2/VIRTUAL/$3/domainname || exit1 "Unable to get domainname for virtual host."; }
  92. function analog_cfg() { echo /etc/analog_$3.conf; }
  93. function rmagic_cfg() { echo /etc/rmagic/rmagic_$3.conf; }
  94. function webalizer_cfg() { echo /etc/webalizer_$3.conf; }
  95. function modlogan_cfg() { echo /etc/modlogan/modlogan_$3.conf; }
  96. function pre_init() { true; }
  97. function post_init() { [ -f $2/COMMON/index.html ] && cp $2/COMMON/index.html `statsdir $1 $2 $3`/; }
  98. function pre_update() { true; }
  99. function post_update() { true; }
  100. # The above can be overridden
  101. LOCALCONFIG=/etc/local/webstats.conf
  102. . $LOCALCONFIG || echo "WARNING: Unable to read config file $LOCALCONFIG"
  103. # variables and functions too boring to be configurable
  104. JDRESOLVE_BIN="/usr/bin/jdresolve"
  105. JDRESOLVE_DB="/var/cache/jdresolve/hosts.db"
  106. #JDRESOLVE_OPTIONS="-r -t 5 --database=$JDRESOLVE_DB --dbfirst --expiredb=48"
  107. # DB access doesn't work currently (no output...)
  108. #JDRESOLVE_OPTIONS="-r --database=$JDRESOLVE_DB --dbfirst --expiredb=48"
  109. JDRESOLVE_OPTIONS="-r"
  110. JDRESOLVE_MERGE_OPTIONS="--mergedb --database=$JDRESOLVE_DB"
  111. LOGRESOLVE_BIN="/usr/sbin/logresolve"
  112. ANALOG_BIN="/usr/bin/analog"
  113. RMAGIC_BIN="/usr/bin/rmagic"
  114. WEBALIZER_BIN="/usr/bin/webalizer"
  115. MODLOGAN_BIN="/usr/bin/modlogan"
  116. AWSTATS_BIN="/usr/lib/cgi-bin/awstats.pl"
  117. function awstats_setlog() { sed -e "s!^\(LogFile=\).*\$!\\1$2!" $1 > $1.tmp; mv $1.tmp $1; }
  118. # Webiste/independent checks
  119. test -d $WEBROOT || exit1 "Webroot \"$WEBROOT\" doesn't exist"
  120. test -d $LOGROOT || exit1 "Logroot \"$LOGROOT\" doesn't exist"
  121. if [ -x $JDRESOLVE_BIN ]; then
  122. touch $JDRESOLVE_DB || exit1 "Couldn't touch JDRESOLVE_DB"
  123. fi
  124. # Generate stats for websites from stdin or all default sites
  125. WEBSITES=$@
  126. if [ "$WEBSITES" = "" ]; then
  127. WEBSITES=$(webdirs $LOGROOT $WEBROOT $WEBSITE)
  128. fi
  129. for WEBSITE in $WEBSITES; do
  130. STATSDIR=$(statsdir $LOGROOT $WEBROOT $WEBSITE) || exit1 "Unable to resolve STATSDIR."
  131. # FIXME test -d $STATSDIR/.. || exit1 "Directory above STATSDIR doesn't exist."
  132. ANALOG_CFG=$(analog_cfg $LOGROOT $WEBROOT $WEBSITE) || exit1 "Unable to resolve ANALOG_CFG."
  133. RMAGIC_CFG=$(rmagic_cfg $LOGROOT $WEBROOT $WEBSITE) || exit1 "Unable to resolve RMAGIC_CFG."
  134. WEBALIZER_CFG=$(webalizer_cfg $LOGROOT $WEBROOT $WEBSITE) || exit1 "Unable to resolve WEBALIZER_CFG."
  135. MODLOGAN_CFG=$(modlogan_cfg $LOGROOT $WEBROOT $WEBSITE) || exit1 "Unable to resolve MODLOGAN_CFG."
  136. if [ $stamp = "init" ]; then
  137. [ $DEBUG ] && echo "Execute $WEBSITE PRE_INIT"
  138. pre_init $LOGROOT $WEBROOT $WEBSITE || exit1 "Error executing PRE_INIT."
  139. fi
  140. if [ $stamp = "update" ]; then
  141. [ $DEBUG ] && echo "Execute $WEBSITE PRE_UPDATE"
  142. pre_update $LOGROOT $WEBROOT $WEBSITE || exit1 "Error executing PRE_UPDATE."
  143. fi
  144. HOST=$(host $LOGROOT $WEBROOT $WEBSITE) || exit1 "Unable to get hostname for virtual host."
  145. DOMAIN=$(domain $LOGROOT $WEBROOT $WEBSITE) || exit1 "Unable to get domainname for virtual host."
  146. ANALOG_OPTIONS="-G +g/etc/analog.conf +g$ANALOG_CFG +A -a"
  147. RMAGIC_OPTIONS=""
  148. WEBALIZER_OPTIONS="-c /etc/webalizer.conf -c $WEBALIZER_CFG -o $STATSDIR/webalizer -f"
  149. MODLOGAN_OPTIONS="-c $MODLOGAN_CFG"
  150. MODLOGAN_TAIL="2>&1 | egrep -v '^(modlogan [\.0-9]+|main\.c\.658 \(main\): startup - finished|[\. \[\]]*[0-9]*|.+: No such file or directory, first run \?)$' || true if [ $? \< 2 ]"
  151. AWSTATS_OPTIONS="-update"
  152. FQDN_ESC=`echo "$HOST.$DOMAIN" | sed -e 's/\./\\\./g'` # needed for awstats config
  153. if [ $DEBUG ]; then
  154. echo "Making stats for $WEBSITE in $STATSDIR:"
  155. JDRESOLVE_OPTIONS="$JDRESOLVE_OPTIONS -p"
  156. ANALOG_OPTIONS="$ANALOG_OPTIONS +q"
  157. RMAGIC_OPTIONS="$RMAGIC_OPTIONS"
  158. WEBALIZER_OPTIONS="$WEBALIZER_OPTIONS -T"
  159. MODLOGAN_OPTIONS="$MODLOGAN_OPTIONS"
  160. MODLOGAN_TAIL=""
  161. AWSTATS_OPTIONS="$AWSTATS_OPTIONS -showsteps"
  162. else
  163. JDRESOLVE_OPTIONS="$JDRESOLVE_DB -n"
  164. ANALOG_OPTIONS="$ANALOG_OPTIONS -q"
  165. RMAGIC_OPTIONS="$RMAGIC_OPTIONS -statistics_Verbose=NONE"
  166. WEBALIZER_OPTIONS="$WEBALIZER_OPTIONS -Q"
  167. MODLOGAN_OPTIONS="$MODLOGAN_OPTIONS"
  168. MODLOGAN_TAIL="$MODLOGAN_TAIL"
  169. AWSTATS_OPTIONS="$AWSTATS_OPTIONS"
  170. fi
  171. if [ $stamp = "init" ]; then
  172. [ $DEBUG ] && echo "$WEBSITE: Purge STATSDIR"
  173. rm -rf $STATSDIR
  174. mkdir $STATSDIR
  175. fi
  176. LOGDATARESOLVED="$STATSDIR/rawlog_old.txt"
  177. LOGDATA="$STATSDIR/rawlog_new.txt"
  178. LOGDATATMP="$STATSDIR/rawlog_incoming.txt"
  179. touch $LOGDATARESOLVED $LOGDATA $LOGDATATMP || exit1 "Couldn't touch LOGDATA files."
  180. #FIXME run init if folders doesn't exist
  181. if [ $stamp = "init" ]; then
  182. logcontentresolved $LOGROOT $WEBROOT $WEBSITE >> $LOGDATARESOLVED
  183. if [ -x $ANALOG_BIN ]; then
  184. [ $DEBUG ] && echo "$WEBSITE: Create/update analog config"
  185. echo "\
  186. # NB! This file is automatically generated. Do not edit directly!
  187. # Instead, put additions/overrides in $ANALOG_CFG.local
  188. HOSTNAME $HOST.$DOMAIN
  189. HOSTURL http://$HOST.$DOMAIN/
  190. BASEURL http://$HOST.$DOMAIN
  191. LANGUAGE DANISH
  192. "\
  193. > $ANALOG_CFG
  194. [ -s $ANALOG_CFG.local ] && cat $ANALOG_CFG.local >> $ANALOG_CFG
  195. [ -d $STATSDIR/analog ] || mkdir $STATSDIR/analog
  196. [ $DEBUG ] && echo "$WEBSITE: Create initial analog stats"
  197. rm -f $STATSDIR/analog/cache.data
  198. $ANALOG_BIN $ANALOG_OPTIONS -C"LOGFILE none" -C"LOGFILE $LOGDATARESOLVED" -C"CACHEOUTFILE $STATSDIR/analog/cache.data" -C"OUTFILE $STATSDIR/analog/index.html"
  199. fi
  200. if [ -x $RMAGIC_BIN -a -x $ANALOG_BIN ]; then
  201. [ $DEBUG ] && echo "$WEBSITE: Create/update Report Magic config"
  202. echo "\
  203. # NB! This file is automatically generated. Do not edit directly!
  204. # Instead, put additions/overrides in $RMAGIC_CFG.local
  205. [statistics]
  206. File_In = $STATSDIR/rmagic/report.dat
  207. Frame_File_Out = $STATSDIR/rmagic/index.html
  208. Language = en
  209. [reports]
  210. File_Out = $STATSDIR/rmagic/
  211. [QUICK]
  212. Rows = ALL
  213. [navigation]
  214. File_Out = navfile.html
  215. "\
  216. > $RMAGIC_CFG
  217. [ -s $RMAGIC_CFG.local ] && $RMAGIC_OPTIONS="$RMAGIC_OPTIONS -statistics_Include=$RMAGIC_CFG.local"
  218. [ -d $STATSDIR/rmagic ] || mkdir $STATSDIR/rmagic
  219. [ $DEBUG ] && echo "$WEBSITE: Create initial Report Magic stats"
  220. $ANALOG_BIN $ANALOG_OPTIONS -C"LOGFILE none" -C"CACHEFILE $STATSDIR/analog/cache.data" -C"LANGUAGE ENGLISH" -C"OUTPUT COMPUTER" -C"OUTFILE $STATSDIR/rmagic/report.dat"
  221. $RMAGIC_BIN $RMAGIC_OPTIONS $RMAGIC_CFG
  222. fi
  223. if [ -x $WEBALIZER_BIN ]; then
  224. [ $DEBUG ] && echo "$WEBSITE: Create/update Webalizer config"
  225. echo "\
  226. # NB! This file is automatically generated. Do not edit directly!
  227. # Instead, put additions/overrides in $WEBALIZER_CFG.local
  228. HostName $HOST.$DOMAIN
  229. HideSite *$DOMAIN
  230. HideReferrer $DOMAIN/
  231. "\
  232. > $WEBALIZER_CFG
  233. [ -s $WEBALIZER_CFG.local ] && cat $WEBALIZER_CFG.local >> $WEBALIZER_CFG
  234. [ -d $STATSDIR/webalizer ] || mkdir $STATSDIR/webalizer
  235. [ $DEBUG ] && echo "$WEBSITE: Create initial Webalizer stats"
  236. cat $LOGDATARESOLVED | $WEBALIZER_BIN $WEBALIZER_OPTIONS -N 0 - || true
  237. fi
  238. if [ -x $MODLOGAN_BIN ]; then
  239. [ $DEBUG ] && echo "$WEBSITE: Create/update ModLogAn config"
  240. echo "\
  241. # NB! This file is automatically generated. Do not edit directly!
  242. # Instead, put additions/overrides in $MODLOGAN_CFG.local
  243. [global]
  244. includepath = /etc/modlogan
  245. include = modlogan.def.conf,global
  246. loadplugin = input_clf
  247. loadplugin = processor_web
  248. loadplugin = output_modlogan
  249. loadplugin = output_template
  250. statedir=$STATSDIR/modlogan
  251. incremental = 0
  252. debug_level = 0
  253. enable_resolver = 0
  254. #read_ahead_limit = 1
  255. var(outputdir, \$statedir)
  256. [processor_web]
  257. include = group.url.conf,group_exploits
  258. include = modlogan.def.conf,processor_web
  259. debug_searchengines = 0
  260. debug_visits = 0
  261. hidereferrer = \"\.${DOMAIN//./\.}/\"
  262. [output_modlogan]
  263. include = modlogan.def.conf, output_modlogan
  264. hostname = $HOST.$DOMAIN
  265. outputdir=\$outputdir
  266. [output_template]
  267. include = modlogan.def.conf, output_template
  268. include = modlogan.def.conf, output_template_reports_web
  269. include = modlogan.def.conf, output_template_menu_web
  270. template_path = /usr/local/share/modlogan/themes/
  271. template_name = basic
  272. variable = HOSTNAME,$HOST.$DOMAIN
  273. variable = CHARSET,iso-8859-1
  274. variable = LANGUAGE,da
  275. hostname = $HOST.$DOMAIN
  276. outputdir=\$outputdir-test
  277. [input_clf]
  278. include = modlogan.def.conf,input_clf
  279. inputfile = -
  280. "\
  281. > $MODLOGAN_CFG
  282. [ -s $MODLOGAN_CFG.local ] && cat $MODLOGAN_CFG.local >> $MODLOGAN_CFG
  283. for dir in $STATSDIR/modlogan $STATSDIR/modlogan-test; do
  284. [ -d $dir ] || mkdir $dir
  285. [ $ROOT ] && chown $user:$group $dir
  286. done
  287. [ $DEBUG ] && echo "$WEBSITE: Create initial ModLogAn stats"
  288. if [ $ROOT ]; then
  289. cat $LOGDATARESOLVED | su $user -c "$MODLOGAN_BIN $MODLOGAN_OPTIONS $MODLOGAN_TAIL"
  290. else
  291. cat $LOGDATARESOLVED | $MODLOGAN_BIN $MODLOGAN_OPTIONS $MODLOGAN_TAIL
  292. fi
  293. fi
  294. if [ -x $AWSTATS_BIN ]; then
  295. [ $DEBUG ] && echo "$WEBSITE: Create/update AWStats config"
  296. echo "\
  297. # NB! This file is automatically generated. Do not edit directly!
  298. # Instead, put additions/overrides in $AWSTATS_CFG.local
  299. LogFile=\"$LOGDATATMP\"
  300. LogFormat=1
  301. DNSLookup=0
  302. DirData=\"$STATSDIR/awstats\"
  303. AllowToUpdateStatsFromBrowser=0
  304. DirCgi=\"http://cgi.jones.dk/cgi-bin\"
  305. DirIcons=\"http://stats.jones.dk/awstats-icon\"
  306. SiteDomain=\"$FQDN_ESC\"
  307. HostAliases=\"$FQDN_ESC\"
  308. Lang=\"dk\"
  309. DirLang=\"/usr/share/awstats/lang\"
  310. DefaultFile=\"index.html\"
  311. SkipHosts=\"\"
  312. SkipFiles=\"\"
  313. ShowLinksOnUrl=1
  314. ShowFlagLinks=0
  315. "\
  316. >/etc/awstats/awstats.$WEBSITE.conf
  317. [ -d $STATSDIR/awstats ] || mkdir $STATSDIR/awstats
  318. [ $DEBUG ] && echo "$WEBSITE: Create initial AWStats stats"
  319. awstats_setlog /etc/awstats/awstats.$WEBSITE.conf $LOGDATARESOLVED
  320. $AWSTATS_BIN -config=$WEBSITE $AWSTATS_OPTIONS -output > $STATSDIR/awstats/index.html
  321. awstats_setlog /etc/awstats/awstats.$WEBSITE.conf $LOGDATATMP
  322. fi
  323. [ $DEBUG ] && echo "$WEBSITE: Compress DNS-resolved logdata"
  324. gzip -9 $LOGDATARESOLVED
  325. fi
  326. if [ -x $JDRESOLVE_BIN ]; then
  327. [ $DEBUG ] && echo "$WEBSITE: DNS-resolve new logdata using jdresolve"
  328. # DB access doesn't work currently (no output...)
  329. # logcontent $LOGROOT $WEBROOT $WEBSITE | $JDRESOLVE_BIN $JDRESOLVE_OPTIONS - >> $LOGDATA
  330. # jdresolve $JDRESOLVE_MERGE_OPTIONS $LOGDATA
  331. logcontent $LOGROOT $WEBROOT $WEBSITE | $JDRESOLVE_BIN $JDRESOLVE_OPTIONS - >> $LOGDATA
  332. elif [ -x $LOGRESOLVE_BIN ]; then
  333. [ $DEBUG ] && echo "$WEBSITE: DNS-resolve new logdata using logresolve"
  334. logcontent $LOGROOT $WEBROOT $WEBSITE | $LOGRESOLVE_BIN >> $LOGDATA
  335. else
  336. [ $DEBUG ] && echo "$WEBSITE: Merging new logdata without DNS-resolving (no resolver found)"
  337. logcontent $LOGROOT $WEBROOT $WEBSITE >> $LOGDATA
  338. fi
  339. if [ -s $LOGDATA ]; then
  340. if [ -x $ANALOG_BIN ]; then
  341. [ $DEBUG ] && echo "$WEBSITE: Update analog stats"
  342. $ANALOG_BIN $ANALOG_OPTIONS -C"LOGFILE none" -C"CACHEFILE $STATSDIR/analog/cache.data" -C"LOGFILE $LOGDATA" -C"OUTFILE $STATSDIR/analog/index.html"
  343. fi
  344. if [ -x $RMAGIC_BIN -a -x $ANALOG_BIN ]; then
  345. [ $DEBUG ] && echo "$WEBSITE: Update Report Magic stats"
  346. $ANALOG_BIN $ANALOG_OPTIONS -C"LOGFILE none" -C"CACHEFILE $STATSDIR/analog/cache.data" -C"LOGFILE $LOGDATA" -C"LANGUAGE ENGLISH" -C"OUTPUT COMPUTER" -C"OUTFILE $STATSDIR/rmagic/report.dat"
  347. $RMAGIC_BIN $RMAGIC_OPTIONS $RMAGIC_CFG
  348. fi
  349. if [ -x $WEBALIZER_BIN ]; then
  350. [ $DEBUG ] && echo "$WEBSITE: Update Webalog stats"
  351. cat $LOGDATA | $WEBALIZER_BIN $WEBALIZER_OPTIONS -N 0 -
  352. fi
  353. if [ -x $MODLOGAN_BIN ]; then
  354. [ $DEBUG ] && echo "$WEBSITE: Update ModLogAn stats"
  355. if [ $ROOT ]; then
  356. cat $LOGDATA | su $user -c "$MODLOGAN_BIN $MODLOGAN_OPTIONS $MODLOGAN_TAIL"
  357. else
  358. cat $LOGDATA | $MODLOGAN_BIN $MODLOGAN_OPTIONS $MODLOGAN_TAIL
  359. fi
  360. fi
  361. if [ -x $AWSTATS_BIN ]; then
  362. [ $DEBUG ] && echo "$WEBSITE: Update AWStats stats"
  363. awstats_setlog /etc/awstats/awstats.$WEBSITE.conf $LOGDATA
  364. $AWSTATS_BIN -config=$WEBSITE $AWSTATS_OPTIONS -output > $STATSDIR/awstats/index.html
  365. awstats_setlog /etc/awstats/awstats.$WEBSITE.conf $LOGDATATMP
  366. fi
  367. gzip -f9 $LOGDATA
  368. fi
  369. if [ $stamp = "init" ]; then
  370. [ $DEBUG ] && echo "Execute $WEBSITE POST_INIT"
  371. post_init $LOGROOT $WEBROOT $WEBSITE || exit1 "Error executing POST_INIT."
  372. fi
  373. if [ $stamp = "update" ]; then
  374. [ $DEBUG ] && echo "Execute $WEBSITE POST_UPDATE"
  375. post_update $LOGROOT $WEBROOT $WEBSITE || exit1 "Error executing POST_UPDATE."
  376. fi
  377. done