#!/bin/bash ##### -*- mode:shell-script; indent-tabs-mode:nil; sh-basic-offset:2 -*- ##### Author: Travis Cross mod_dir="../src/mod" conf_dir="../conf" fs_description="FreeSWITCH is a scalable open source cross-platform telephony platform designed to route and interconnect popular communication protocols using audio, video, text or any other form of media." mod_build_depends="." avoid_mods=( applications/mod_fax applications/mod_ladspa applications/mod_limit applications/mod_mongo applications/mod_mp4 applications/mod_osp applications/mod_rad_auth applications/mod_skel asr_tts/mod_cepstral codecs/mod_com_g729 codecs/mod_sangoma_codec codecs/mod_skel_codec codecs/mod_voipcodecs endpoints/mod_gsmopen endpoints/mod_h323 endpoints/mod_khomp endpoints/mod_opal endpoints/mod_portaudio endpoints/mod_reference endpoints/mod_unicall event_handlers/mod_snmp formats/mod_portaudio_stream formats/mod_shout formats/mod_vlc languages/mod_java languages/mod_managed languages/mod_spidermonkey languages/mod_yaml sdk/autotools xml_int/mod_xml_ldap ) err () { echo "$0 error: $1" >&2 exit 1 } xread () { local xIFS="$IFS" IFS='' read $@ local ret=$? IFS="$xIFS" return $ret } avoid_mod_filter () { for x in "${avoid_mods[@]}"; do [ "$1" = "$x" ] && return 1 done return 0 } modconf_filter () { while xread line; do [ "$1" = "$line" ] && return 0 done < modules.conf return 1 } mod_filter () { if test -f modules.conf; then modconf_filter $@ else avoid_mod_filter $@ fi } map_fs_modules () { local filterfn="$1" percatfns="$2" permodfns="$3" for x in $mod_dir/*; do if test -d $x; then category=${x##*/} category_path=$x for f in $percatfns; do $f; done for y in $x/*; do module_name=${y##*/} module_path=$y module=$category/$module_name if $filterfn $category/$module; then [ -f ${y}/module ] && . ${y}/module for f in $permodfns; do $f; done fi unset module_name module_path module done unset category category_path fi done } map_modules () { local filterfn="$1" percatfns="$2" permodfns="$3" for x in $parse_dir/*; do test -d $x || continue category=${x##*/} category_path=$x for f in $percatfns; do $f; done for y in $x/*; do test -f $y || continue module=${y##*/} module_path=$y $filterfn $category/$module || continue module="" category="" module_name="" description="" long_description="" build_depends="" depends="" recommends="" suggests="" distro_conflicts="" . $y [ -n "$description" ] || description="$module_name" [ -n "$long_description" ] || description="Adds ${module_name}." for f in $permodfns; do $f; done unset \ module module_name module_path \ description long_description \ build_depends depends recommends suggests \ distro_conflicts done unset category category_path done } map_confs () { local fs="$1" for x in $conf_dir/*; do test ! -d $x && continue conf=${x##*/} conf_dir=$x for f in $fs; do $f; done unset conf conf_dir done } print_source_control () { cat < Build-Depends: # for debian debhelper (>= 8.0.0), # bootstrapping automake (>= 1.9), autoconf, libtool, # core build dpkg-dev (>= 1.15.8.12), gcc (>= 4:4.4.5) , g++ (>= 4:4.4.5), libc6-dev (>= 2.11.3), make (>= 3.81), wget, pkg-config, # configure options libssl-dev, unixodbc-dev, libncurses5-dev, libjpeg8-dev, python-dev, erlang-dev, # documentation doxygen, # for APR (not essential for build) uuid-dev, libexpat1-dev, libgdbm-dev, libdb-dev, # used by many modules bison, zlib1g-dev, # module build-depends $(debian_wrap "${mod_build_depends}") Standards-Version: 3.9.3 Homepage: http://freeswitch.org/ Vcs-Git: git://git.freeswitch.org/freeswitch Vcs-Browser: http://git.freeswitch.org/git/freeswitch/ EOF } print_core_control () { cat <= 3.0-6) Description: FreeSWITCH SysV init script $(debian_wrap "${fs_description}") . This package contains the SysV init script for FreeSWITCH. Package: freeswitch-systemd Architecture: all Depends: \${misc:Depends} Description: FreeSWITCH systemd configuration $(debian_wrap "${fs_description}") . This package contains the systemd configuration for FreeSWITCH. ## misc Package: freeswitch-htdocs-slim Architecture: all Depends: \${misc:Depends} Description: FreeSWITCH htdocs slim player $(debian_wrap "${fs_description}") . This package contains the slim SWF player for FreeSWITCH. ## sounds Package: freeswitch-music Architecture: all Depends: \${misc:Depends}, freeswitch-music-default (= \${binary:Version}) Description: Music on hold audio for FreeSWITCH $(debian_wrap "${fs_description}") . This package contains music on hold audio for FreeSWITCH. Package: freeswitch-music-default Architecture: all Depends: \${misc:Depends}, freeswitch-music-default-8k (= \${binary:Version}) Recommends: freeswitch-music-default-16k (= \${binary:Version}), freeswitch-music-default-32k (= \${binary:Version}), freeswitch-music-default-48k (= \${binary:Version}) Description: Music on hold audio for FreeSWITCH $(debian_wrap "${fs_description}") . This package contains the default music on hold audio for FreeSWITCH. Package: freeswitch-sounds Architecture: all Depends: \${misc:Depends}, freeswitch-sounds-en (= \${binary:Version}) Description: Sounds for FreeSWITCH $(debian_wrap "${fs_description}") . This package contains sounds for FreeSWITCH. Package: freeswitch-sounds-en Architecture: all Depends: \${misc:Depends}, freeswitch-sounds-en-us (= \${binary:Version}) Description: English sounds for FreeSWITCH $(debian_wrap "${fs_description}") . This package contains the English sounds for FreeSWITCH. Package: freeswitch-sounds-en-us Architecture: all Depends: \${misc:Depends}, freeswitch-sounds-en-us-callie (= \${binary:Version}) Description: US English sounds for FreeSWITCH $(debian_wrap "${fs_description}") . This package contains the US/English sounds for FreeSWITCH. Package: freeswitch-sounds-en-us-callie Architecture: all Depends: \${misc:Depends}, freeswitch-sounds-en-us-callie-8k (= \${binary:Version}) Recommends: freeswitch-sounds-en-us-callie-16k (= \${binary:Version}), freeswitch-sounds-en-us-callie-32k (= \${binary:Version}), freeswitch-sounds-en-us-callie-48k (= \${binary:Version}) Description: US English sounds for FreeSWITCH $(debian_wrap "${fs_description}") . This package contains the Callie English sounds for FreeSWITCH. EOF } print_mod_control () { cat <> control } gencontrol_per_cat () { (echo "## mod/$category"; echo) >> control } geninstall_per_mod () { local f=freeswitch-${module_name//_/-}.install (print_edit_warning; print_mod_install "$module_name") > $f test -f $f.tmpl && cat $f.tmpl >> $f } genmodules_per_cat () { echo "## $category" >> modules_.conf } genmodules_per_mod () { echo "$module" >> modules_.conf } genconf () { print_conf_control >> control local f=freeswitch-conf-${conf//_/-}.install (print_edit_warning; print_conf_install) > $f test -f $f.tmpl && cat $f.tmpl >> $f } genmusic () { rate="$1" rate_k="${rate%%000}k" print_music_control >> control local f=freeswitch-music-default-${rate_k}.install (print_edit_warning; print_music_install) > $f test -f $f.tmpl && cat $f.tmpl >> $f unset rate rate_k } gensound () { rate="$1" rate_k="${rate%%000}k" sound_path="$2" sound="${2,,}" language=$(echo $sound | cut -d/ -f1) country=$(echo $sound | cut -d/ -f2) speaker=$(echo $sound | cut -d/ -f3) print_sound_control >> control local f=freeswitch-sounds-${sound//\//-}-${rate_k}.install (print_edit_warning; print_sound_install) > $f test -f $f.tmpl && cat $f.tmpl >> $f unset rate rate_k sound sound_path language country speaker } accumulate_build_depends () { if [ -n "$build_depends" ]; then if [ ! "$mod_build_depends" = "." ]; then mod_build_depends="${mod_build_depends}, ${build_depends}" else mod_build_depends="${build_depends}" fi fi } genmodctl_new_mod () { grep -e "^Module: ${module}$" control-modules >/dev/null && return 0 cat </dev/null && return 0 cat < control-modules.preparse local category="" local module_name="" rm -rf $parse_dir while xread l; do if [ -z "$l" ]; then # is newline continue fi local header="${l%%:*}" local value="${l#*: }" if [ "$header" = "Module" ]; then category="${value%%/*}" module_name="${value#*/}" mkdir -p $parse_dir/$category (echo "module=$(var_escape "$value")"; \ echo "category=$(var_escape "$category")"; \ echo "module_name=$(var_escape "$module_name")"; \ ) >> $parse_dir/$category/$module_name else ([ -n "$category" ] && [ -n "$module_name" ]) \ || err "unexpected header $header" local var_name="$(echo "$header" | sed -e 's/-/_/g' | tr '[A-Z]' '[a-z]')" echo "${var_name}=$(var_escape "$value")" >> $parse_dir/$category/$module_name fi done < control-modules.preparse } debian_wrap () { local fl=true echo "$1" | fold -s -w 69 | while xread l; do local v="$(echo "$l" | sed -e 's/ *$//g')" if $fl; then fl=false echo "$v" else echo " $v" fi done } genmodctl_cat () { (echo "## mod/$category"; echo) } genmodctl_mod () { echo "Module: $module" echo "Description: $description" echo "$long_description" | fold -s -w 69 | while xread l; do local v="$(echo "$l" | sed -e 's/ *$//g')" echo " $v" done [ -n "$build_depends" ] && debian_wrap "Build-Depends: $build_depends" [ -n "$depends" ] && debian_wrap "Depends: $depends" [ -n "$reccomends" ] && debian_wrap "Recommends: $recommends" [ -n "$suggests" ] && debian_wrap "Suggests: $suggests" [ -n "$distro_conflicts" ] && debian_wrap "Distro-Conflicts: $distro_conflicts" echo } echo "Please wait, this takes a few seconds..." >&2 parse_dir=control-modules.parse map_fs_modules ':' 'genmodctl_new_cat' 'genmodctl_new_mod' >> control-modules parse_mod_control (echo "# -*- mode:debian-control -*-"; echo; \ map_modules ':' 'genmodctl_cat' 'genmodctl_mod' \ ) > control-modules.gen print_edit_warning > modules_.conf map_modules 'mod_filter' '' 'accumulate_build_depends' > control (print_edit_warning; print_source_control; print_core_control) >> control for r in 8000 16000 32000 48000; do genmusic $r; done for x in 'en/us/callie'; do for r in 8000 16000 32000 48000; do gensound $r $x done done (echo "### conf"; echo) >> control map_confs 'genconf' (echo "### modules"; echo) >> control map_modules "mod_filter" \ "gencontrol_per_cat genmodules_per_cat" \ "gencontrol_per_mod geninstall_per_mod genmodules_per_mod" touch .stamp-bootstrap