Gentoo Archives: gentoo-commits

From: "Tony Vroon (chainsaw)" <chainsaw@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo-x86 commit in net-misc/asterisk/files/1.6.1: asterisk.initd3
Date: Tue, 02 Feb 2010 22:48:17
Message-Id: E1NcRXV-0000N0-OQ@stork.gentoo.org
1 chainsaw 10/02/02 22:48:09
2
3 Added: asterisk.initd3
4 Log:
5 Security update for AST-2010-001; remote T.38 over SIP crash by sitting FaxMaxDatagram to a negative or exceptionally large value. Init script update by Jaco Kroon closes bug #303265. Remove vulnerable 1.6.2 branch ebuilds.
6 (Portage version: 2.2_rc62/cvs/Linux x86_64)
7
8 Revision Changes Path
9 1.1 net-misc/asterisk/files/1.6.1/asterisk.initd3
10
11 file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/net-misc/asterisk/files/1.6.1/asterisk.initd3?rev=1.1&view=markup
12 plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/net-misc/asterisk/files/1.6.1/asterisk.initd3?rev=1.1&content-type=text/plain
13
14 Index: asterisk.initd3
15 ===================================================================
16 #!/sbin/runscript
17 # Copyright 1999-2009 Gentoo Foundation
18 # Distributed under the terms of the GNU General Public License v2
19 # $Header: /var/cvsroot/gentoo-x86/net-misc/asterisk/files/1.6.1/asterisk.initd3,v 1.1 2010/02/02 22:48:09 chainsaw Exp $
20
21 opts="${opts} forcestop reload"
22
23 depend() {
24 need net
25 use nscd dns dahdi mysql postgresql slapd capi
26 }
27
28 is_running() {
29 if [ -z "$(pidof asterisk)" ]; then
30 return 1
31 else
32 PID="$(cat /var/run/asterisk/asterisk.pid)"
33 for x in $(pidof asterisk); do
34 if [ "${x}" = "${PID}" ]; then
35 return 0
36 fi
37 done
38 fi
39
40 return 1
41 }
42
43 asterisk_run_loop() {
44 local OPTS ARGS MSG NICE=""
45 local result=0 signal=0
46
47 # default options
48 OPTS="-f" # don't fork / detach breaks wrapper script...
49
50 # filter (redundant) arguments
51 ARGS="$(echo "${@}" | sed -e "s:-c\|-f::g")"
52
53 # mangle yes/no options
54 ASTERISK_CONSOLE="$(echo ${ASTERISK_CONSOLE} | tr '[:lower:]' '[:upper:]')"
55
56 if [ -n "${ASTERISK_CORE_SIZE}" ] &&
57 [ "${ASTERISK_CORE_SIZE}" != "0" ]; then
58 ulimit -c ${ASTERISK_CORE_SIZE}
59
60 if [ -n "${ASTERISK_CORE_DIR}" ] && \
61 [ ! -d "${ASTERISK_CORE_DIR}" ]
62 then
63 mkdir -m750 -p "${ASTERISK_CORE_DIR}"
64
65 if [ -n "${ASTERISK_USER}" ]; then
66 chown -R "${ASTERISK_USER}" "${ASTERISK_CORE_DIR}"
67 fi
68 fi
69 ASTERISK_CORE_DIR="${ASTERISK_CORE_DIR:-/tmp}"
70
71 cd "${ASTERISK_CORE_DIR}"
72 echo " Core dump size : ${ASTERISK_CORE_SIZE}"
73 echo " Core dump location : ${ASTERISK_CORE_DIR}"
74 fi
75
76 if [ -n "${ASTERISK_MAX_FD}" ]; then
77 ulimit -n ${ASTERISK_MAX_FD}
78 echo " Max open filedescriptors : ${ASTERISK_MAX_FD}"
79 fi
80
81 if [ -n "${ASTERISK_NICE}" ]; then
82 echo " Nice level : ${ASTERISK_NICE}"
83 NICE="nice -n ${ASTERISK_NICE} --"
84 fi
85
86 if [ -n "${ASTERISK_NOTIFY_EMAIL}" ]; then
87 if [ -x /usr/sbin/sendmail ]; then
88 echo " Email notifications go to : ${ASTERISK_NOTIFY_EMAIL}"
89 else
90 echo " Notifications disabled, /usr/sbin/sendmail doesn't exist or is not executable!"
91 unset ASTERISK_NOTIFY_EMAIL
92 fi
93 fi
94
95 if [ -n "${ASTERISK_TTY}" ]; then
96 for x in ${ASTERISK_TTY} \
97 /dev/tty${ASTERISK_TTY} \
98 /dev/vc/${ASTERISK_TTY}
99 do
100 if [ -c "${x}" ]; then
101 TTY="${x}"
102 fi
103 done
104 [ -n "${TTY}" ] && \
105 echo " Messages are sent to : ${TTY}"
106 fi
107
108 if [ "${ASTERISK_CONSOLE}" = "YES" ] && [ -n "${TTY}" ]; then
109 echo " Starting Asterisk console : ${ASTERISK_CONSOLE}"
110 OPTS="${OPTS} -c"
111 fi
112
113 OPTS="${OPTS} ${ARGS}"
114
115 trap "rm /var/run/asterisk/wrapper_loop.pid" EXIT
116 cut -f4 -d' ' < /proc/self/stat > /var/run/asterisk/wrapper_loop.pid
117
118 while :; do
119 if [ -n "${TTY}" ]; then
120 /usr/bin/stty -F ${TTY} sane
121 ${NICE} /usr/sbin/asterisk ${OPTS} >${TTY} 2>&1 <${TTY}
122 result=$?
123 else
124 ${NICE} /usr/sbin/asterisk ${OPTS} &>/dev/null
125 result=$?
126 fi
127
128 if [ $result -eq 0 ]; then
129 logger -t asterisk_wrapper "Asterisk terminated normally"
130 break
131 else
132 if [ $result -gt 128 ]; then
133 signal=$((result - 128))
134 MSG="Asterisk terminated with Signal: $signal"
135
136 CORE_TARGET="core-$(date "+%Y%m%d-%h%M%s")"
137
138 local CORE_DUMPED=0
139 if [ -f "${ASTERISK_CORE_DIR}/core" ]; then
140 mv "${ASTERISK_CORE_DIR}/core" \
141 "${ASTERISK_CORE_DIR}/${CORE_TARGET}"
142 CORE_DUMPED=1
143
144 elif [ -f "${ASTERISK_CORE_DIR}/core.${PID}" ]; then
145 mv "${ASTERISK_CORE_DIR}/core.${PID}" \
146 "${ASTERISK_CORE_DIR}/${CORE_TARGET}"
147 CORE_DUMPED=1
148
149 fi
150
151 [ $CORE_DUMPED -eq 1 ] && \
152 MSG="${MSG}\n\rCore dumped: ${ASTERISK_CORE_DIR}/${CORE_TARGET}"
153 else
154 MSG="Asterisk terminated with return code: $result"
155 fi
156
157 # kill left-over tasks
158 for X in ${ASTERISK_CLEANUP_ON_CRASH}; do
159 kill -9 $(pidof ${X});
160 done
161 fi
162
163 [ -n "${TTY}" ] \
164 && echo "${MSG}" >${TTY} \
165 || logger -t asterisk_wrapper "${MSG}"
166
167
168 if [ -n "${ASTERISK_NOTIFY_EMAIL}" ] && \
169 [ -x /usr/sbin/sendmail ]; then
170 echo -e -n "Subject: Asterisk crashed\n\r${MSG}\n\r" |\
171 /usr/sbin/sendmail "${ASTERISK_NOTIFY_EMAIL}"
172 fi
173 sleep 5
174 logger -t asterisk_wrapper "Restarting Asterisk..."
175 done
176 return 0
177 }
178
179 start() {
180 local OPTS USER GROUP PID
181 local tmp x
182
183 if [ -n "${ASTERISK_NICE}" ]; then
184 if [ ${ASTERISK_NICE} -ge -20 ] && \
185 [ ${ASTERISK_NICE} -le 19 ]; then
186 OPTS="--nicelevel ${ASTERISK_NICE}"
187 else
188 eerror "Nice value must be between -20 and 19"
189 return 1
190 fi
191 fi
192
193 if [ -n "${ASTERISK_USER}" ]; then
194 USER=$(echo $ASTERISK_USER | sed 's/:.*//')
195 GROUP=$(echo $ASTERISK_USER | awk -F: '/.*:.*/ { print $2 }')
196 if [ -n "${USER}" ]; then
197 ASTERISK_OPTS="${ASTERISK_OPTS} -U ${USER}"
198 fi
199 if [ -n "${GROUP}" ]; then
200 ASTERISK_OPTS="${ASTERISK_OPTS} -G ${GROUP}"
201 GROUP=":${GROUP}" # make it look nice...
202 fi
203 for element in $(find /var/{log,run}/asterisk); do
204 if [ $(stat -c %U $element) != ${USER} ]; then
205 ewarn "${USER} is not the owner of $element, fixing."
206 chown -R ${USER} /var/{log,run}/asterisk
207 chmod -R u+r /var/{log,run}/asterisk
208 chmod u+x /var/{log,run}/asterisk
209 fi;
210 done;
211 ebegin "Starting asterisk PBX (as ${USER}${GROUP})"
212 else
213 ebegin "Starting asterisk PBX (as root)"
214 fi
215
216 if [ "$(echo ${ASTERISK_WRAPPER} | tr '[:upper:]' '[:lower:]')" != "yes" ]; then
217 start-stop-daemon --start --exec /usr/sbin/asterisk \
218 ${OPTS} -- ${ASTERISK_OPTS}
219 result=$?
220 else
221 asterisk_run_loop ${ASTERISK_OPTS} 2>/dev/null &
222 result=$?
223 fi
224
225 if [ $result -eq 0 ]; then
226 # 2 seconds should be enough for asterisk to start
227 sleep 2
228 is_running
229 result=$?
230 fi
231
232 eend $result
233 }
234
235 forcestop() {
236 ebegin "Stopping asterisk PBX"
237 start-stop-daemon --stop --pidfile /var/run/asterisk/asterisk.pid
238 eend $?
239 }
240
241 stop() {
242 if ! is_running; then
243 eerror "Asterisk is not running!"
244 return 0
245 fi
246
247 if [ -r /var/run/asterisk/wrapper_loop.pid ]; then
248 ebegin "Killing wrapper script"
249 kill $(</var/run/asterisk/wrapper_loop.pid)
250 eend $?
251 fi
252
253 ebegin "Stopping asterisk PBX gracefully"
254 /usr/sbin/asterisk -r -x "core stop gracefully" &>/dev/null
255 # Now we have to wait until asterisk has _really_ stopped.
256 sleep 1
257 if is_running; then
258 einfon "Waiting for asterisk to shutdown ."
259 local cnt=0
260 while is_running; do
261 cnt=`expr $cnt + 1`
262 if [ $cnt -gt 60 ] ; then
263 # Waited 120 seconds now. Fail.
264 echo
265 eend 1 "Failed."
266 return
267 fi
268 sleep 2
269 echo -n "."
270 done
271 echo
272 fi
273 eend 0
274 }
275
276 reload() {
277 if is_running; then
278 ebegin "Forcing asterisk to reload configuration"
279 /usr/sbin/asterisk -r -x "reload" &>/dev/null
280 eend $?
281 else
282 eerror "Asterisk is not running!"
283 fi
284 }