75516c2c9ff3b95d081db563a624b6a72b16b1bd
[sip-router] / pkg / kamailio / alpine_docker / build.sh
1 #!/bin/sh -e
2
3 # This script is wrote by Sergey Safarov <s.safarov@gmail.com>
4
5 BUILD_ROOT=/tmp/kamailio
6 FILELIST=/tmp/filelist
7 FILELIST_BINARY=/tmp/filelist_binary
8 TMP_TAR=/tmp/kamailio_min.tar.gz
9 IMG_TAR=kamailio_img.tar.gz
10
11 prepare_build() {
12 apk add --no-cache abuild git gcc build-base bison db-dev flex expat-dev perl-dev postgresql-dev python2-dev pcre-dev mariadb-dev \
13     libxml2-dev curl-dev unixodbc-dev confuse-dev ncurses-dev sqlite-dev lua-dev openldap-dev \
14     libressl-dev net-snmp-dev libuuid libev-dev jansson-dev json-c-dev libevent-dev linux-headers \
15     libmemcached-dev rabbitmq-c-dev hiredis-dev libmaxminddb-dev libunistring-dev freeradius-client-dev lksctp-tools-dev
16
17     adduser -D build && addgroup build abuild
18     echo "%abuild ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/abuild
19     su - build -c "git config --global user.name 'Your Full Name'"
20     su - build -c "git config --global user.email 'your@email.address'"
21     su - build -c "abuild-keygen -a -i"
22 }
23
24 build_and_install(){
25     cd /usr/src/kamailio
26     REPO_OWNER=$(git remote get-url origin 2> /dev/null | sed -e 's|^.*github.com/||' -e 's|^git@github.com:||' -e 's|/.*\.git||')
27     if [ ! -z "$REPO_OWNER" ]; then
28         sed -i -e "s:github.com/kamailio:github.com/$REPO_OWNER:" /usr/src/kamailio/pkg/kamailio/alpine/APKBUILD
29     fi
30     if [ ! -z "$GIT_TAG" ]; then
31         sed -i -e "s/^_gitcommit=.*/_gitcommit=$GIT_TAG/" /usr/src/kamailio/pkg/kamailio/alpine/APKBUILD
32     fi
33     chown -R build /usr/src/kamailio
34     su - build -c "cd /usr/src/kamailio/pkg/kamailio/alpine; abuild snapshot"
35     su - build -c "cd /usr/src/kamailio/pkg/kamailio/alpine; abuild -r"
36     cd /home/build/packages/kamailio/x86_64
37     ls -1 kamailio-*.apk |  xargs apk --no-cache --allow-untrusted add
38 }
39
40 list_installed_kamailio_packages() {
41         apk info | grep kamailio
42 }
43
44 kamailio_files() {
45     local PACKAGES
46     PACKAGES=$(apk info | grep kamailio)
47     PACKAGES="musl $PACKAGES"
48     for pkg in $PACKAGES
49     do
50         # list package files and filter package name
51         apk info --contents $pkg 2> /dev/null | sed -e '/\S\+ contains:/d'  -e '/^$/d' -e 's/^/\//'
52     done
53 }
54
55 extra_files() {
56     cat << EOF
57 /etc
58 /bin
59 /bin/busybox
60 /usr/bin
61 /usr/bin/dumpcap
62 /usr/lib
63 /usr/sbin
64 /usr/sbin/tcpdump
65 /var
66 /var/run
67 /run
68 /tmp
69 EOF
70 }
71
72 sort_filelist() {
73     sort $FILELIST | uniq > $FILELIST.new
74     mv -f $FILELIST.new $FILELIST
75 }
76
77 filter_unnecessary_files() {
78 # excluded following files and directories recursive
79 # /usr/lib/debug/usr/lib/kamailio/
80 # /usr/share/doc/kamailio
81 # /usr/share/man
82 # /usr/share/snmp
83
84     sed -i \
85         -e '\|^/usr/lib/debug/|d' \
86         -e '\|^/usr/share/doc/kamailio/|d' \
87         -e '\|^/usr/share/man/|d' \
88         -e '\|^/usr/share/snmp/|d' \
89         $FILELIST
90 }
91
92 ldd_helper() {
93     TESTFILE=$1
94     LD_PRELOAD=/usr/sbin/kamailio ldd $TESTFILE 2> /dev/null > /dev/null || return
95
96     LD_PRELOAD=/usr/sbin/kamailio ldd $TESTFILE | sed -e 's/^.* => //' -e 's/ (.*)//' -e 's/\s\+//' -e '/^ldd$/d'
97 }
98
99 find_binaries() {
100     rm -f $FILELIST_BINARY
101     set +e
102     for f in $(cat $FILELIST)
103     do
104         ldd_helper /$f >> $FILELIST_BINARY
105     done
106     set -e
107     sort $FILELIST_BINARY | sort | uniq > $FILELIST_BINARY.new
108     mv -f $FILELIST_BINARY.new $FILELIST_BINARY
109
110     # Resolving symbolic links and removing duplicates
111     cat $FILELIST_BINARY | xargs realpath > $FILELIST_BINARY.new
112     cat $FILELIST_BINARY.new >> $FILELIST_BINARY
113     sort $FILELIST_BINARY | sort | uniq > $FILELIST_BINARY.new
114     mv -f $FILELIST_BINARY.new $FILELIST_BINARY
115 }
116
117 tar_files() {
118     local TARLIST=/tmp/tarlist
119     cat $FILELIST > $TARLIST
120     cat $FILELIST_BINARY >> $TARLIST
121     tar -czf $TMP_TAR --no-recursion -T $TARLIST
122     rm -f $TARLIST
123 }
124
125 make_image_tar() {
126     mkdir -p $BUILD_ROOT
127     cd $BUILD_ROOT
128     tar xzf $TMP_TAR
129     /bin/busybox --install -s bin
130     tar czf /usr/src/kamailio/pkg/kamailio/alpine_docker/$IMG_TAR *
131 }
132
133 prepare_build
134 build_and_install
135 #install PCAP tools
136 apk add --no-cache wireshark-common tcpdump
137
138 kamailio_files > $FILELIST
139 extra_files >> $FILELIST
140 sort_filelist
141 filter_unnecessary_files
142 find_binaries
143 tar_files
144 make_image_tar