summaryrefslogtreecommitdiff
path: root/net-proxy/squid/files/squid.initd-r7
blob: 7215b774736deae151997e854dc1c1652609b5d4 (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
131
132
133
#!/sbin/openrc-run
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

SQUID_SVCNAME=$( echo "${RC_SVCNAME}" | tr -cd '[a-zA-Z0-9]' )

extra_started_commands="reload rotate"

depend() {
	use dns net
}

_getconfig() {
	# Make PIDFILE, CHROOTDIR, and CACHE_SWAP visible to other functions
	local CONFFILES="/etc/squid/${RC_SVCNAME}.conf /etc/squid/${RC_SVCNAME}.include /etc/squid/${RC_SVCNAME}.include.*"
	if [ ! -f /etc/squid/${RC_SVCNAME}.conf ]; then
		eerror "You need to create /etc/squid/${RC_SVCNAME}.conf first."
		eerror "The main configuration file and all included file names should have the following format:"
		eerror "${CONFFILES}"
		eerror "An example can be found in /etc/squid/squid.conf.default"
		return 1
	fi
	PIDFILE=$(cat ${CONFFILES} 2>/dev/null 3>/dev/null | awk '/^[ \t]*pid_filename[ \t]+/ { print $2 }')
	CHROOTDIR=$(cat ${CONFFILES} 2>/dev/null 3>/dev/null | awk '/^[ \t]*chroot[ \t]+/ { print $2 }')
	if [ -n "${CHROOTDIR}" ] && [ -n "${PIDFILE}" ]; then
		CHROOTDIR="${CHROOTDIR%/}"
		PIDFILE="${CHROOTDIR}${PIDFILE}"
	fi
	[ -z ${PIDFILE} ] && PIDFILE=/run/squid.pid
	if [ "${CHROOTDIR}/run/${RC_SVCNAME}.pid" != ${PIDFILE} ]; then
		eerror "/etc/squid/${RC_SVCNAME}.conf must set pid_filename to"
		eerror "   /run/${RC_SVCNAME}.pid"
		if [ -n "${CHROOTDIR}" ]; then
			eerror "with chrootdir ${CHROOTDIR} set."
		fi
		eerror "CAUTION: http_port, cache_dir and *_log parameters must be different than"
		eerror "         in any other instance of squid."
		eerror "Make sure the main configuration file and all included file names have the following format:"
		eerror "${CONFFILES}"
		return 1
	fi
	CACHE_SWAP=$(cat ${CONFFILES} 2>/dev/null 3>/dev/null | awk '/^[ \t]*cache_dir[ \t]+/ { if ( $2 == "rock" ) printf "%s/rock ", $3; else if ( $2 == "coss" ) printf "%s/stripe ", $3; else printf "%s/00 ", $3; }')
	[ -z "$CACHE_SWAP" ] && CACHE_SWAP="/var/cache/squid/00"

	return 0
}

checkconfig() {
	_getconfig || return 1
	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/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME} 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
	checkpath -d -q -m 0750 -o squid:squid /run/${RC_SVCNAME}

	# see https://wiki.squid-cache.org/MultipleInstances
	ebegin "Starting ${RC_SVCNAME} (service name ${SQUID_SVCNAME}) with KRB5_KTNAME=\"${SQUID_KEYTAB}\" /usr/sbin/squid ${SQUID_OPTS} -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}"
	KRB5_KTNAME="${SQUID_KEYTAB}" /usr/sbin/squid ${SQUID_OPTS} -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}
	eend $? && sleep 1
}

stop() {
	_getconfig || return 1
	ebegin "Stopping ${RC_SVCNAME} with /usr/sbin/squid -k shutdown -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}"
	if /usr/sbin/squid -k shutdown -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME} ; then
		if [ "x${SQUID_FAST_SHUTDOWN}" = "xyes" ]; then
			einfo "Attempting fast shutdown."
			/usr/sbin/squid -k shutdown -f /etc/squid/${RC_SVCNAME}.conf -n ${SQUID_SVCNAME}
		fi
		# Now we have to wait until squid has _really_ stopped.
		sleep 1
		if [ -f ${PIDFILE} ] ; then
			einfon "Waiting for squid to shutdown ."
			cnt=0
			while [ -f ${PIDFILE} ] ; do
				cnt=$(expr $cnt + 1)
				if [ $cnt -gt 90 ] ; then
					# Waited 180 seconds now. Fail.
					echo
					eend 1 "Failed."
					break
				fi
				sleep 2
				printf "."
			done
			echo
		fi
	else
		eerror "Squid shutdown failed, probably service is already down."
	fi
	eend 0
}

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

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