#!/bin/bash # squid This shell script takes care of starting and stopping # Squid Internet Object Cache # #################################################################################### # Downloaded from http://www.techyouruniverse.com/squid-init-script/ # #################################################################################### # # Version 0.1 01/03/2008 # I took the existing CentOS init script (unknown origin) and improved the following: # ) Added clearcache method for clearing cache # ) Added configtest method for checking syntax of config file # ) Optimized restart/stop for minimum downtime # ) Cleaned up config variables # ) Cleaned up formatting of output # #################################################################################### # Please send improvements/comments to nick at sullivanflock.com # #################################################################################### # # # chkconfig: - 90 25 # description: Squid - Internet Object Cache. Internet object caching is \ # a way to store requested Internet objects (i.e., data available \ # via the HTTP, FTP, and gopher protocols) on a system closer to the \ # requesting site than to the source. Web browsers can then use the \ # local Squid cache as a proxy HTTP server, reducing access time as \ # well as bandwidth consumption. # pidfile: /var/run/squid.pid # config: /etc/squid/squid.conf PATH=/usr/bin:/sbin:/bin:/usr/sbin export PATH # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 # locations of files SQUID_OUT_FILE=/var/log/squid/squid.out SQUID_CONF_FILE=/etc/squid/squid.conf # check if the squid conf file is present [ -f $SQUID_CONF_FILE ] || exit 0 if [ -f /etc/sysconfig/squid ]; then . /etc/sysconfig/squid fi # don't raise an error if the config file is incomplete # set defaults instead: SQUID_OPTS=${SQUID_OPTS:-"-D"} SQUID_PIDFILE_TIMEOUT=${SQUID_PIDFILE_TIMEOUT:-20} SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100} # determine the name of the squid binary [ -f /usr/sbin/squid ] && SQUID=squid [ -z "$SQUID" ] && exit 0 prog="$SQUID" # determine which one is the cache_swap directory CACHE_SWAP=`sed -e 's/#.*//g' $SQUID_CONF_FILE | \ grep cache_dir | awk '{ print $3 }'` [ -z "$CACHE_SWAP" ] && CACHE_SWAP=/var/spool/squid RETVAL=0 start() { for adir in $CACHE_SWAP; do if [ ! -d $adir/00 ]; then echo -n "init_cache_dir $adir... " $SQUID -z -F -D >> $SQUID_OUT_FILE 2>&1 fi done echo -n $"Starting $prog: " $SQUID $SQUID_OPTS >> $SQUID_OUT_FILE 2>&1 RETVAL=$? if [ $RETVAL -eq 0 ]; then timeout=0; while : ; do [ ! -f /var/run/squid.pid ] || break if [ $timeout -ge $SQUID_PIDFILE_TIMEOUT ]; then RETVAL=1 break fi sleep 1 && echo -n "." timeout=$((timeout+1)) done fi [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SQUID [ $RETVAL -eq 0 ] && echo_success [ $RETVAL -ne 0 ] && echo_failure echo return $RETVAL } stop() { echo -n $"Stopping $prog: " $SQUID -k check >> $SQUID_OUT_FILE 2>&1 RETVAL=$? if [ $RETVAL -eq 0 ] ; then # "-k interrupt" sends an INT signal, which causes Squid to shutdown immediately, # without waiting for current connections to die. You can use "-k shutdown" to # be more gentle to existing connections, but this causes squid to take # 10+ seconds to shut down. I prefer a quicker shutdown. # $SQUID -k shutdown & $SQUID -k interrupt & rm -f /var/lock/subsys/$SQUID timeout=0 while : ; do [ -f /var/run/squid.pid ] || break if [ $timeout -ge $SQUID_SHUTDOWN_TIMEOUT ]; then echo return 1 fi sleep 1 && echo -n "." timeout=$((timeout+1)) done echo_success echo else $SQUID -k check echo_failure echo fi return $RETVAL } reload() { $SQUID $SQUID_OPTS -k reconfigure [ $? -eq 0 ] && echo_success [ $RETVAL -ne 0 ] && echo_failure echo } restart() { stop start } condrestart() { [ -e /var/lock/subsys/squid ] && restart || : } rhstatus() { status $SQUID $SQUID -k check } configtest() { echo -n "Checking syntax of $SQUID_CONF_FILE:" $SQUID $SQUID_OPTS -k parse [ $? -eq 0 ] && echo_success [ $RETVAL -ne 0 ] && echo_failure echo } # Wipe all the squid cache. Note that not all squid cache is stored in memory, # some is stored on disk. So a simple restart of squid is insufficient. # This process is optimized for high availability at the cost of some elegance. # This used to simply "rm" the directory, but this was very slow (60+ seconds) # for a large cache, so I changed to a "mv" instead. # Steps are: # 1. Stop squid. # 2. Rename squid cache dir # 3. Recreate squid cache dir # 4. Start squid # 5. Remove old cache dir clearcache() { stop echo -n $"Renaming $CACHE_SWAP to: $CACHE_SWAP.bad" mv $CACHE_SWAP/ $CACHE_SWAP.bad [ $? -eq 0 ] && echo_success [ $RETVAL -ne 0 ] && echo_failure echo echo -n $"Recreating $prog cache directories: " # Recreating empty directory with same owner/permissions chown=`stat -c%U:%G $CACHE_SWAP.bad` mkdir $CACHE_SWAP chown $chown $CACHE_SWAP # Fill the directory with squids cache sub directories $SQUID -z >> $SQUID_OUT_FILE 2>&1 [ $? -eq 0 ] && echo_success [ $RETVAL -ne 0 ] && echo_failure echo start echo -n $"Squid is up, removing $CACHE_SWAP.bad" rm -rf $CACHE_SWAP.bad [ $? -eq 0 ] && echo_success [ $RETVAL -ne 0 ] && echo_failure echo } case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) restart ;; condrestart) condrestart ;; status) rhstatus ;; configtest) configtest ;; clearcache) clearcache ;; *) echo $"Usage: $0 {start|stop|status|reload|restart|condrestart|configtest|clearcache}" exit 1 esac exit $?