summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-pbx/root/etc/init.d/pbx-asterisk
blob: d97854d7f83da7e3c6b29e1e2f668e29c871d839 (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
#!/bin/sh /etc/rc.common
#
# Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
#
#    This file is part of luci-pbx.
#
#    luci-pbx is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    luci-pbx is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with luci-pbx.  If not, see <http://www.gnu.org/licenses/>.

. /etc/functions.sh

START=60

# Some global variables
MODULENAME=pbx
USERAGENT="PBX"
DEFAULTOUTCNTXT=default-outgoing-call-context
HANGUPCNTXT=hangup
GTALKUNVL=unavailable

ASTUSER=nobody
ASTGROUP=nogroup
ASTDIRSRECURSIVE="/var/run/asterisk /var/log/asterisk /var/spool/asterisk"
ASTDIRS="/usr/lib/asterisk"

TEMPLATEDIR=/etc/${MODULENAME}-asterisk
ASTERISKDIR=/etc/asterisk
WORKDIR=/tmp/$MODULENAME.$$
MD5SUMSFILE=/tmp/$MODULENAME-sums.$$

TMPL_ASTERISK=$TEMPLATEDIR/asterisk.conf.TEMPLATE
TMPL_GTALK=$TEMPLATEDIR/gtalk.conf.TEMPLATE
TMPL_INDICATIONS=$TEMPLATEDIR/indications.conf.TEMPLATE
TMPL_LOGGER=$TEMPLATEDIR/logger.conf.TEMPLATE
TMPL_MANAGER=$TEMPLATEDIR/manager.conf.TEMPLATE
TMPL_MODULES=$TEMPLATEDIR/modules.conf.TEMPLATE
TMPL_RTP=$TEMPLATEDIR/rtp.conf.TEMPLATE

TMPL_EXTCTHRUCHECKHDR=$TEMPLATEDIR/extensions_disa-check_header.conf.TEMPLATE
TMPL_EXTCTHRUCHECK=$TEMPLATEDIR/extensions_disa-check.conf.TEMPLATE
TMPL_EXTCTHRUCHECKFTR=$TEMPLATEDIR/extensions_disa-check_footer.conf.TEMPLATE
TMPL_EXTCTHRUHDR=$TEMPLATEDIR/extensions_disa_header.conf.TEMPLATE
TMPL_EXTCTHRU=$TEMPLATEDIR/extensions_disa.conf.TEMPLATE

TMPL_EXTENSIONS=$TEMPLATEDIR/extensions.conf.TEMPLATE

TMPL_EXTBLKLIST=$TEMPLATEDIR/extensions_blacklist.conf.TEMPLATE
TMPL_EXTBLKLISTFTR=$TEMPLATEDIR/extensions_blacklist_footer.conf.TEMPLATE
TMPL_EXTBLKLISTHDR=$TEMPLATEDIR/extensions_blacklist_header.conf.TEMPLATE

TMPL_EXTINCNTXTSIP=$TEMPLATEDIR/extensions_incoming_context_sip.conf.TEMPLATE
TMPL_EXTINCNTXTGTALKHDR=$TEMPLATEDIR/extensions_incoming_context_gtalk_header.conf.TEMPLATE
TMPL_EXTINCNTXTGTALK=$TEMPLATEDIR/extensions_incoming_context_gtalk.conf.TEMPLATE

TMPL_EXTUSERCNTXT=$TEMPLATEDIR/extensions_user_context.conf.TEMPLATE
TMPL_EXTUSERCNTXTFTR=$TEMPLATEDIR/extensions_user_context_footer.conf.TEMPLATE
TMPL_EXTUSERCNTXTHDR=$TEMPLATEDIR/extensions_user_context_header.conf.TEMPLATE

TMPL_EXTOUTHDR=$TEMPLATEDIR/extensions_default_outgoing_header.conf.TEMPLATE
TMPL_EXTOUTGTALK=$TEMPLATEDIR/extensions_outgoing_gtalk.conf.TEMPLATE
TMPL_EXTOUTLOCAL=$TEMPLATEDIR/extensions_outgoing_dial_local_user.conf.TEMPLATE
TMPL_EXTOUTSIP=$TEMPLATEDIR/extensions_outgoing_sip.conf.TEMPLATE

TMPL_JABBER=$TEMPLATEDIR/jabber.conf.TEMPLATE
TMPL_JABBERUSER=$TEMPLATEDIR/jabber_users.conf.TEMPLATE
TMPL_SIP=$TEMPLATEDIR/sip.conf.TEMPLATE
TMPL_SIPPEER=$TEMPLATEDIR/sip_peer.TEMPLATE
TMPL_SIPREG=$TEMPLATEDIR/sip_registration.TEMPLATE
TMPL_SIPUSR=$TEMPLATEDIR/sip_user.TEMPLATE

INCLUDED_FILES="$WORKDIR/extensions_blacklist.conf $WORKDIR/extensions_callthrough.conf\
                $WORKDIR/extensions_incoming.conf  $WORKDIR/extensions_incoming_gtalk.conf\
                $WORKDIR/extensions_user.conf      $WORKDIR/jabber_users.conf\
                $WORKDIR/sip_peers.conf            $WORKDIR/sip_registrations.conf\
                $WORKDIR/sip_users.conf"


# In this string, we concatenate all local users enabled to receive calls
# readily formatted for the Dial command.
localusers_to_ring=""
# In this string, we keep a list of all users that are enabled for outgoing
# calls. It is used at the end to create the user contexts.
localusers_can_dial=""

# In this string, we put together a space-separated list of provider names
# (alphanumeric, with all non-alpha characters replaced with underscores),
# which will be used to dial out by default (whose outgoing contexts will
# be included in users' contexts by default.
outbound_providers=""

# Copies the template files which we don't edit.
copy_unedited_templates_over()
{
	cp $TMPL_ASTERISK    $WORKDIR/asterisk.conf
	cp $TMPL_GTALK       $WORKDIR/gtalk.conf
	cp $TMPL_INDICATIONS $WORKDIR/indications.conf
        cp $TMPL_LOGGER      $WORKDIR/logger.conf
	cp $TMPL_MANAGER     $WORKDIR/manager.conf
	cp $TMPL_MODULES     $WORKDIR/modules.conf
}

# Touches all the included files, to prevent asterisk from refusing to
# start if a config item is missing and an included config file isn't created.
create_included_files()
{
    touch $INCLUDED_FILES
}

# Puts together all the extensions.conf related configuration.
pbx_create_extensions_config()
{
	sed "s/|LOCALUSERS|/$localusers_to_ring/g" $TMPL_EXTENSIONS > $WORKDIR/extensions.conf
	mv  $WORKDIR/inext.TMP                         $WORKDIR/extensions_incoming.conf
	cp  $TMPL_EXTINCNTXTGTALKHDR                   $WORKDIR/extensions_incoming_gtalk.conf
	cat $WORKDIR/outextgtalk.TMP                >> $WORKDIR/extensions_incoming_gtalk.conf 2>/dev/null
	rm -f $WORKDIR/outextgtalk.TMP
	mv  $WORKDIR/blacklist.TMP                     $WORKDIR/extensions_blacklist.conf
	mv  $WORKDIR/userext.TMP                       $WORKDIR/extensions_user.conf
	cp  $TMPL_EXTCTHRUHDR                          $WORKDIR/extensions_callthrough.conf
	cat $WORKDIR/callthrough.TMP                >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
	rm -f $WORKDIR/callthrough.TMP
	cat $TMPL_EXTCTHRUCHECKHDR                  >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
	cat $WORKDIR/callthroughcheck.TMP           >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
	rm -f $WORKDIR/callthroughcheck.TMP
	cat $TMPL_EXTCTHRUCHECKFTR                  >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
	rm -f $WORKDIR/outext-*.TMP
	rm -f $WORKDIR/localext.TMP
}

# Puts together all the sip.conf related configuration.
pbx_create_sip_config()
{
	mv $WORKDIR/sip_regs.TMP    $WORKDIR/sip_registrations.conf
	mv $WORKDIR/sip_peers.TMP   $WORKDIR/sip_peers.conf
	mv $WORKDIR/sip_users.TMP   $WORKDIR/sip_users.conf
}

# Creates the jabber.conf related config
pbx_create_jabber_config()
{
	cp  $TMPL_JABBER        $WORKDIR/jabber.conf
	mv  $WORKDIR/jabber.TMP $WORKDIR/jabber_users.conf
}

# Gets rid of any config files from $ASTERISKDIR not found in $WORKDIR.
clean_up_asterisk_config_dir()
{
        for f in $ASTERISKDIR/* ; do
                basef="`basename $f`"
                if [ ! -e "$WORKDIR/$basef" ] ; then
                        rm -rf "$f"
                fi
        done
}

# Compares md5sums of the config files in $WORKDIR to those
# in $ASTERISKDIR, and copies only changed files over to reduce
# wear on flash in embedded devices.
compare_configs_and_copy_changed()
{
	# First, compute md5sums of the config files in $WORKDIR.
	cd $WORKDIR/
	md5sum * > $MD5SUMSFILE

	# Now, check the files in $ASTERISKDIR against the md5sums.
	cd $ASTERISKDIR/
	changed_files="`md5sum -c $MD5SUMSFILE 2>/dev/null | fgrep ": FAILED" | awk -F: '{print $1}'`"

	rm -f $MD5SUMSFILE

	[ -z "$changed_files" ] && return

	# Now copy over the changed files.
	for f in $changed_files ; do
		cp "$WORKDIR/$f" "$ASTERISKDIR/$f"
	done
}

# Calls the functions that create the final config files
# Calls the function which compares which files have changed
# Puts the final touches on $ASTERISKDIR
# Gets rid of $WORKDIR
pbx_assemble_and_copy_config()
{
	mkdir -p $ASTERISKDIR

	copy_unedited_templates_over
	create_included_files
	pbx_create_extensions_config
	pbx_create_sip_config
	pbx_create_jabber_config

	touch    $WORKDIR/features.conf

	# At this point, $WORKDIR should contain a complete, working config.
	clean_up_asterisk_config_dir

	compare_configs_and_copy_changed

	[ ! -d $ASTERISKDIR/manager.d ] && mkdir -p $ASTERISKDIR/manager.d/

	# Get rid of the working directory
	rm -rf $WORKDIR/
}

# Creates configuration for a user and adds it to the temporary file that holds
# all users configured so far.
pbx_add_user()
{
	local fullname
	local defaultuser
	local secret
	local ring
	local can_call

	config_get fullname $1 fullname
	config_get defaultuser $1 defaultuser
	config_get secret $1 secret
	config_get ring $1 ring
	config_get can_call $1 can_call

	[ -z "$defaultuser" -o -z "$secret" ] && return
	[ -z "$fullname" ] && fullname="$defaultuser"

	sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPUSR > $WORKDIR/sip_user.tmp

	if [ "$can_call" = "yes" ] ; then
		# Add user to list of all users that are allowed to make calls.
		localusers_can_dial="$localusers_can_dial $defaultuser"
		sed -i "s/|CONTEXTNAME|/$defaultuser/g"     $WORKDIR/sip_user.tmp
	else
		sed -i "s/|CONTEXTNAME|/$HANGUPCNTXT/g"     $WORKDIR/sip_user.tmp
	fi

	# Add this user's configuration to the temp file containing all user configs.
	sed "s/|FULLNAME|/$fullname/" $WORKDIR/sip_user.tmp |\
	     sed "s/|SECRET|/$secret/g"                  >> $WORKDIR/sip_users.TMP

	if [ "$ring" = "yes" ] ; then
		if [ -z "$localusers_to_ring" ] ; then
			localusers_to_ring="SIP\/$defaultuser"
		else
			localusers_to_ring="$localusers_to_ring\&SIP\/$defaultuser"
		fi
	fi

	# Add configuration which allows local users to call each other.
	sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_EXTOUTLOCAL >> $WORKDIR/localext.TMP

	rm -f $WORKDIR/sip_user.tmp
}

# Creates configuration for a Google account, and adds it to the temporary file that holds
# all accounts configured so far.
# Also creates the outgoing extensions which are used in users' outgoing contexts.
pbx_add_jabber()
{
	local username
	local secret
	local numprefix
	local register
	local make_outgoing_calls
	local name
	local users_to_ring
	local status
	local statusmessage

	config_get username $1 username
	config_get secret $1 secret
	config_get numprefix $1 numprefix
	config_get register $1 register
	config_get make_outgoing_calls $1 make_outgoing_calls
	config_get name $1 name
	config_get status $1 status
	config_get statusmessage $1 statusmessage

	[ -z "$username" -o -z "$secret" ] && return

	# Construct a jabber entry for this provider.
	sed     "s/|USERNAME|/$username/g" $TMPL_JABBERUSER |\
	    sed "s/|NAME|/$name/g"                            > $WORKDIR/jabber.tmp

	if [ "$register" = yes ] ; then
		# If this provider is enabled for incoming calls, we need to set the
		# status of the user to something other than unavailable in order to receive calls.
		sed -i "s/|STATUS|/$status/g"                   $WORKDIR/jabber.tmp
		sed -i "s/|STATUSMESSAGE|/\"$statusmessage\"/g" $WORKDIR/jabber.tmp

		users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
		# If no users have been specified to ring, we ring all users enabled for incoming calls.
		if [ -z "$users_to_ring" ] ; then
			users_to_ring=$localusers_to_ring
		else
		# Else, we cook up a string formatted for the Dial command
		# with the specified users (SIP/user1&SIP/user2&...). We do it
		# with set, shift and a loop in order to be more tolerant of ugly whitespace
		# messes entered by users.
			set $users_to_ring
			users_to_ring="SIP\/$1" && shift
			for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
		fi

		# Now, we add this account to the gtalk incoming context.
		sed    "s/|USERNAME|/$username/g" $TMPL_EXTINCNTXTGTALK |\
		   sed "s/|LOCALUSERS|/$users_to_ring/g"    >> $WORKDIR/outextgtalk.TMP
	else
		sed -i "s/|STATUS|/$GTALKUNVL/g"               $WORKDIR/jabber.tmp
		sed -i "s/|STATUSMESSAGE|/\"\"/g"              $WORKDIR/jabber.tmp
	fi

	# Add this account's configuration to the temp file containing all account configs.
	sed "s/|SECRET|/$secret/g" $WORKDIR/jabber.tmp      >> $WORKDIR/jabber.TMP

	# If this provider is enabled for outgoing calls.
	if [ "$make_outgoing_calls" = "yes" ] ; then

		numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"

		# If no prefixes are specified, then we use "X" which matches any prefix.
		[ -z "$numprefix" ]  && numprefix="X"

		for p in $numprefix ; do
			sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTGTALK |\
			    sed "s/|NAME|/$name/g"            >> $WORKDIR/outext-$name.TMP
		done

		# Add this provider to the list of enabled outbound providers.
		if [ -z "$outbound_providers" ] ; then
			outbound_providers="$name"
		else
			outbound_providers="$outbound_providers $name"
		fi
	fi

	rm -f $WORKDIR/jabber.tmp
}

# Creates configuration for a SIP provider account, and adds it to the temporary file that holds
# all accounts configured so far.
# Also creates the outgoing extensions which are used in users' outgoing contexts.
pbx_add_peer()
{
	local defaultuser
	local secret
	local host
	local fromdomain
	local register
	local numprefix
	local make_outgoing_calls
	local name
	local users_to_ring
	local port
	local outboundproxy

	config_get defaultuser $1 defaultuser
	config_get secret $1 secret
	config_get host $1 host
	config_get port $1 port
	config_get outbountproxy $1 outboundproxy
	config_get fromdomain $1 fromdomain
	config_get register $1 register
	config_get numprefix $1 numprefix
	config_get make_outgoing_calls $1 make_outgoing_calls
	config_get name $1 name

	[ -z "$defaultuser" -o -z "$secret" -o -z "$host" ] && return
	[ -z "$fromdomain" ]    && fromdomain=$host
	[ -n "$port" ]          && port="port=$port"
	[ -n "$outboundproxy" ] && outboundproxy="outboundproxy=$outboundproxy"

	# Construct a sip peer entry for this provider.
	sed    "s/|DEFAULTUSER|/$defaultuser/" $TMPL_SIPPEER  >  $WORKDIR/sip_peer.tmp
	sed -i "s/|NAME|/$name/"                                 $WORKDIR/sip_peer.tmp
	sed -i "s/|FROMUSER|/$defaultuser/"                      $WORKDIR/sip_peer.tmp
	sed -i "s/|SECRET|/$secret/"                             $WORKDIR/sip_peer.tmp
	sed -i "s/|HOST|/$host/"                                 $WORKDIR/sip_peer.tmp
	sed -i "s/|PORT|/$port/"                                 $WORKDIR/sip_peer.tmp
	sed -i "s/|OUTBOUNDPROXY|/$outboundproxy/"               $WORKDIR/sip_peer.tmp
	# Add this account's configuration to the temp file containing all account configs.
	sed    "s/|FROMDOMAIN|/$host/" $WORKDIR/sip_peer.tmp >>  $WORKDIR/sip_peers.TMP

	# If this provider is enabled for incoming calls.
        if [ "$register" = "yes" ] ; then
		# Then we create a registration string for this provider.
		sed    "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPREG         > $WORKDIR/sip_reg.tmp
		sed -i "s/|SECRET|/$secret/g"                                  $WORKDIR/sip_reg.tmp
		sed    "s/|NAME|/$name/g" $WORKDIR/sip_reg.tmp              >> $WORKDIR/sip_regs.TMP

		users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
		# If no users have been specified to ring, we ring all users enabled for incoming calls.
		if [ -z "$users_to_ring" ] ; then
			users_to_ring=$localusers_to_ring
		else
		# Else, we cook up a string formatted for the Dial command
		# with the specified users (SIP/user1&SIP/user2&...). We do it
		# with set, shift and a loop in order to be more tolerant of ugly whitespace
		# messes entered by users.
			set $users_to_ring
			users_to_ring="SIP\/$1" && shift
			for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
		fi

		# And we create an incoming calls context for this provider.
		sed    "s/|NAME|/$name/g"                          $TMPL_EXTINCNTXTSIP |\
		    sed "s/|LOCALUSERS|/$users_to_ring/g"       >> $WORKDIR/inext.TMP
	fi

	# If this provider is enabled for outgoing calls.
	if [ "$make_outgoing_calls" = "yes" ] ; then

		numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"
		# If no prefixes are specified, then we use "X" which matches any prefix.
		[ -z "$numprefix" ]  && numprefix="X"
		for p in $numprefix ; do
			sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTSIP |\
			    sed "s/|NAME|/$name/g"              >> $WORKDIR/outext-$name.TMP
		done

		# Add this provider to the list of enabled outbound providers.
		if [ -z "$outbound_providers" ] ; then
			outbound_providers="$name"
		else
			outbound_providers="$outbound_providers $name"
		fi
	fi

	rm -f $WORKDIR/sip_peer.tmp
	rm -f $WORKDIR/sip_reg.tmp
}

# For all local users enabled for outbound calls, creates a context
# containing the extensions for Google and SIP accounts this user is
# allowed to use.
pbx_create_user_contexts()
{
	local providers

	for u in $localusers_can_dial ; do
		sed "s/|DEFAULTUSER|/$u/g" $TMPL_EXTUSERCNTXTHDR                >> $WORKDIR/userext.TMP
		cat $WORKDIR/localext.TMP                                       >> $WORKDIR/userext.TMP
		providers="`uci -q get ${MODULENAME}-calls.providers_user_can_use.$u`"
		[ -z "$providers" ] && providers="$outbound_providers"

		# For each provider, cat the contents of outext-$name.TMP into the user's outgoing calls extension
		for p in $providers ; do
			[ -f $WORKDIR/outext-$p.TMP ] && cat $WORKDIR/outext-$p.TMP >> $WORKDIR/userext.TMP
		done
		cat $TMPL_EXTUSERCNTXTFTR                                       >> $WORKDIR/userext.TMP
	done
}

# Creates the blacklist context which hangs up on blacklisted numbers.
pbx_add_blacklist()
{
	local blacklist1
	local blacklist2

	config_get blacklist1 blacklisting blacklist1
	config_get blacklist2 blacklisting blacklist2

	# We create the blacklist context no matter whether the blacklist
	# actually contains entries or not, since the PBX will send calls
	# to the context for a check against the list anyway.
	cp $TMPL_EXTBLKLISTHDR                                   $WORKDIR/blacklist.TMP
	for n in $blacklist1 $blacklist2 ; do
		sed "s/|BLACKLISTITEM|/$n/g" $TMPL_EXTBLKLIST >> $WORKDIR/blacklist.TMP 
	done
	cat $TMPL_EXTBLKLISTFTR                               >> $WORKDIR/blacklist.TMP
}

# Creates the callthrough context which allows specified numbers to get
# into the PBX and dial out as the configured user.
pbx_add_callthrough()
{
	local callthrough_number_list
	local defaultuser
	local pin
	local enabled

	config_get callthrough_number_list $1 callthrough_number_list
	config_get defaultuser $1 defaultuser
	config_get pin $1 pin
	config_get enabled $1 enabled

	[ "$enabled" = "no" ]   && return
	[ "$defaultuser" = "" ] && return

	for callthrough_number in $callthrough_number_list ; do
		sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRUCHECK >> $WORKDIR/callthroughcheck.TMP

		sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRU |\
		    sed "s/|DEFAULTUSER|/$defaultuser/"               |\
		        sed "s/|PIN|/$pin/"                                >> $WORKDIR/callthrough.TMP
	done
}

# Creates sip.conf from its template.
pbx_cook_sip_template()
{
	local useragent
	local externhost
	local bindport

	config_get useragent advanced useragent
	config_get externhost advanced externhost
	config_get bindport advanced bindport

	[ -z "$useragent" ] && useragent="$USERAGENT"

	sed "s/|USERAGENT|/$useragent/g" $TMPL_SIP  > $WORKDIR/sip.conf

	if [ -z "$externhost" ] ; then
		sed -i "s/externhost=|EXTERNHOST|//g" $WORKDIR/sip.conf
	else
		sed -i "s/|EXTERNHOST|/$externhost/g" $WORKDIR/sip.conf
	fi

	if [ -z "$bindport" ] ; then
		sed -i "s/bindport=|BINDPORT|//g"     $WORKDIR/sip.conf
	else
		sed -i "s/|BINDPORT|/$bindport/g"     $WORKDIR/sip.conf
	fi


}

# Creates rtp.conf from its template.
pbx_cook_rtp_template()
{
	local rtpstart
	local rtpend

	config_get rtpstart advanced rtpstart
	config_get rtpend   advanced rtpend

	sed "s/|RTPSTART|/$rtpstart/" $TMPL_RTP |\
	    sed "s/|RTPEND|/$rtpend/"               > $WORKDIR/rtp.conf
}

# Makes sure the ownership of specified directories is proper.
pbx_fix_ownership()
{
	chown $ASTUSER:$ASTGROUP    $ASTDIRS
	chown $ASTUSER:$ASTGROUP -R $ASTDIRSRECURSIVE
}


start() {
	mkdir -p $WORKDIR

	# Create the users.
	config_load ${MODULENAME}-users
	config_foreach pbx_add_user local_user

	# Create configuration for each google account.
	config_unset
	config_load ${MODULENAME}-google
	config_foreach pbx_add_jabber gtalk_jabber

	# Create configuration for each voip provider.
	config_unset
	config_load ${MODULENAME}-voip
	config_foreach pbx_add_peer voip_provider

	# Create the user contexts, and phone blacklist.
	config_unset
	config_load ${MODULENAME}-calls
	pbx_create_user_contexts
	pbx_add_blacklist
	config_foreach pbx_add_callthrough callthrough_numbers

	# Prepare sip.conf using settings from the "advanced" section.
	config_unset
	config_load ${MODULENAME}-advanced
	pbx_cook_sip_template
	pbx_cook_rtp_template

	# Assemble the configuration, and copy changed files over.
	pbx_assemble_and_copy_config

	# Enforce ownership of specified files and directories.
	pbx_fix_ownership
}