summaryrefslogtreecommitdiffstats
path: root/main/squid/squid.initd
blob: 488a45b527a97ee21c3bd212572d37aeea7d2b37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/sbin/runscript
# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/net-proxy/squid/files/squid.initd,v 1.14 2011/10/23 18:45:39 polynomial-c Exp $

extra_started_commands="reload rotate"

depend() {
	use dns
	need net
	after firewall
}

upprocval() {
	[ -f $1 ] || return 0
	if [ `cat $1` -lt $2 ]; then
		echo $2 > $1
	fi
}

# Try to increase the # of filedescriptors we can open.
maxfds() {
	[ -n "$SQUID_MAXFD" ] || return
	[ $SQUID_MAXFD -le 8192 ] || SQUID_MAXFD=8192
	local minimal_file_max=$(($SQUID_MAXFD + 4096))
	upprocval /proc/sys/fs/file-max $minimal_file_max
	if /usr/sbin/squid -v | grep -q "\--enable-epoll" ; then
		upprocval /proc/sys/fs/epoll/max_user_watches $minimal_file_max
	fi
	ulimit -n $SQUID_MAXFD
}

checkconfig() {
	if [ ! -f /etc/squid/${SVCNAME}.conf ]; then
		eerror "You need to create /etc/squid/${SVCNAME}.conf first."
		eerror "An example can be found in /etc/squid/squid.conf.default"
		return 1
	fi

	local PIDFILE=$(awk '/^[ \t]*pid_filename[ \t]+/ { print $2 }' < /etc/squid/${SVCNAME}.conf)
	[ -z ${PIDFILE} ] && PIDFILE=/var/run/squid.pid
	if [ /var/run/${SVCNAME}.pid != ${PIDFILE} ]; then
		eerror "/etc/squid/${SVCNAME}.conf must set pid_filename to"
		eerror "   /var/run/${SVCNAME}.pid"
		eerror "CAUTION: http_port, cache_dir and *_log parameters must be different than"
		eerror "         in any other instance of squid."
		return 1
	fi

	maxfds

	local CACHE_SWAP=$(awk '/^[ \t]*cache_dir[ \t]+/ { if ($2 == "coss" ) printf "%s/stripe ", $3 ; else printf "%s/00 ", $3; }' < /etc/squid/${SVCNAME}.conf)
	[ -z "$CACHE_SWAP" ] && CACHE_SWAP="/var/cache/squid/00"
	
	local x
	for x in $CACHE_SWAP ; do
		if [ ! -e $x ] ; then
			ebegin "Initializing cache directory ${x%/*}"
			local ORIG_UMASK=$(umask)
			umask 027

			if ! (mkdir -p ${x%/*} && chown squid ${x%/*}) ; then
				eend 1
				return 1
			fi

			local INIT_CACHE_RESPONSE="$(/usr/sbin/squid -z -N -f /etc/squid/${SVCNAME}.conf 2>&1)"
			if [ $? != 0 ] || echo "$INIT_CACHE_RESPONSE" | grep -q "erminated abnormally" ; then
				umask $ORIG_UMASK
				eend 1
				echo "$INIT_CACHE_RESPONSE"
				return 1
			fi

			umask $ORIG_UMASK
			eend 0
			break
		fi
	done
	
	return 0
}

start() {
	checkconfig || return 1
	ebegin "Starting ${SVCNAME}"
	KRB5_KTNAME="${SQUID_KEYTAB}" /usr/sbin/squid ${SQUID_OPTS} -f /etc/squid/${SVCNAME}.conf
	eend $? && sleep 1
}

stop() {
	ebegin "Stopping ${SVCNAME}"
	if /usr/sbin/squid -k shutdown -f /etc/squid/${SVCNAME}.conf ; then
		# Now we have to wait until squid has _really_ stopped.
		sleep 1
		if [ -f /var/run/${SVCNAME}.pid ] ; then
			einfon "Waiting for squid to shutdown ."
			cnt=0
			while [ -f /var/run/${SVCNAME}.pid ] ; do
				cnt=$(expr $cnt + 1)
				if [ $cnt -gt 60 ] ; then
					# Waited 120 seconds now. Fail.
					echo
					eend 1 "Failed."
					break
				fi
				sleep 2
				echo -n "."
			done
			echo
		fi
	else
		eerror "Squid shutdown failed, probably service is already down."
	fi
	eend 0
}

reload() {
	checkconfig || return 1
	ebegin "Reloading ${SVCNAME}"
	/usr/sbin/squid -k reconfigure -f /etc/squid/${SVCNAME}.conf
	eend $?
}

rotate() {
	service_started ${SVCNAME} || return 1
	ebegin "Rotating ${SVCNAME} logs"
	/usr/sbin/squid -k rotate -f /etc/squid/${SVCNAME}.conf
	eend $?
}