You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Jay c4dd026d76 Add EDGE stuff. 1 year ago
README.md Add EDGE stuff. 1 year ago

README.md

#PRELIMINARY VERSION

Compiling Asterisk on Alpine

This is currently a quick and very dirty way document on compiling Asterisk on Alpine.

This is not intended to be a Tutorial or HOWTO. I am not holding hands.

This has been tested on 3.16 and edge as of 27-FEB. It works and was stable. I built optimized for low memory and it ran in a 512MB VM just fine for 3 months.

This is based heavily off Alpine's own buildlog and uses some of their scripts from aports.

Install the dependencies (as a virtual package) - CHANGE linux-virt-dev TO MATCH YOUR KERNEL!

apk add linux-virt-dev bsd-compat-headers linux-headers dahdi-linux-dev wget git nano build-base alsa-lib-dev alpine-sdk bluez-dev bsd-compat-headers curl-dev dahdi-tools-dev findutils freetds-dev imap-dev jansson-dev libcap-dev libedit-dev libogg-dev libpri-dev libresample libsrtp-dev libtool libxml2-dev lua-dev mariadb-connector-c-dev ncurses-dev subversion newt-dev openssl1.1-compat-dev opus-dev opusfile-dev pjproject-dev popt-dev libpq-dev spandsp-dev speexdsp-dev speex-dev sqlite-dev tar tiff-dev unbound-dev unixodbc-dev util-linux-dev perl file autoconf automake pkgconfig zlib-dev -t builddep.asterisk

The Edge repositories require some changes:

apk add linux-virt-dev bsd-compat-headers linux-headers wget git nano build-base alsa-lib-dev alpine-sdk bluez-dev bsd-compat-headers curl-dev findutils freetds-dev imap-dev jansson-dev libcap-dev libedit-dev libogg-dev libresample libsrtp-dev libtool libxml2-dev lua-dev mariadb-connector-c-dev ncurses-dev subversion newt-dev openssl-dev opus-dev opusfile-dev pjproject-dev popt-dev libpq-dev spandsp-dev speexdsp-dev speex-dev sqlite-dev tar tiff-dev unbound-dev unixodbc-dev util-linux-dev perl file autoconf automake pkgconfig zlib-dev -t builddep.asterisk

The DHADI and Libpri libaries don't exist in edge. As of right now they can't be built for edge; which is fine for IP only setups.

Clone the repo(s). You only need Asterisk if you don't plan on needing dahdi or libpri support. You can also skip the next few sections.

git clone https://github.com/asterisk/asterisk.git
git clone https://github.com/asterisk/dahdi-linux.git
git clone https://github.com/asterisk/dahdi-tools.git
git clone https://github.com/asterisk/libpri.git

cd in to dhadi-linux and build it:

make -j4
make install

Okay. dahdi-tools has been a royal PITA. But I think we need to do this:

cd dahdi-tools
wget https://git.alpinelinux.org/aports/plain/main/dahdi-tools/fix-musl.patch?h=3.16-stable
patch -ruN fix-musl.patch?h=3.16-stable

The directories are different..plus I never got the APKBUILD patches to work automatically. I couldn't even get my own to work automatically. This is going to happen for the rest of our patches...so pay attention.

|+++ dahdi-tools-2.11.1/xpp/hexfile.h   2017-05-29 09:30:50.034438806 +0300

The file is xpp/hexfile.h if running the patch inside the dahdi-tools. You have to go through this similar punching in of files for all the patches. For pretty much all of these, you ignore the first folder since we're running this relative to the local repo.

autoreconf -fi
./configuremake -j4
make install
make install-config
dahdi_genconf modules
rm -rf /usr/lib/dracut

Holy cow. It worked. This is the first I've gotten this far with it. Still using ISDN? Of course not. We'll build it anyway.

cd libpri
sed -e 's|-Werror|-Wno-error|g' -i Makefile
sed -e 's,^#include <sys/signal.h>$,#include <signal.h>,g' -i pritest.c testprilib.c
make -j4
make install

Wow. This is looking promising. Let's do Asterisk.

Grab the Opus codec and copy the file in to the repository before cd'ing in to it. Opus is optional. You can skip if desired.

wget https://distfiles.alpinelinux.org/distfiles/v3.16/asterisk-13.7-90e8780faccc79e68c07775c6ab2fe1ffaccfa08.tar.gz
tar -zxvf asterisk-13.7-90e8780faccc79e68c07775c6ab2fe1ffaccfa08.tar.gz
cp asterisk-opus-90e8780faccc79e68c07775c6ab2fe1ffaccfa08/codecs/codec_opus_open_source.c asterisk/codecs/codec_opus_open_source.c
cp asterisk-opus-90e8780faccc79e68c07775c6ab2fe1ffaccfa08/codecs/ex_opus.h  asterisk/codecs/ex_opus.h

If you skipped any of the optional stuff; start here.

Browse to the repository folder and grab the following files. The patch files don't work like I think they should; you have to tell it where the file is. Since you're doing this in the repository, you typically just drop the first folder; includes/whatever.c, main/code.c, etc.

wget https://git.alpinelinux.org/aports/plain/main/asterisk/10-musl-mutex-init.patch
wget https://git.alpinelinux.org/aports/plain/main/asterisk/20-musl-astmm-fix.patch
wget https://git.alpinelinux.org/aports/plain/main/asterisk/40-asterisk-cdefs.patch
patch -ruN -d /path/to/asterisk < 10-musl-mutex-init.patch
patch -ruN -d /path/to/asterisk < 20-musl-mutex-init.patch
patch -ruN -d -d /path/to/asterisk < 40-asterisk-cdefs.patch

The patches were made with the sources in a/ and b/ folders. You'll get errors and have to manually enter the path; but the path is the same under the a and b folders. At some point I'll fix this and verify it works next time I build Asterisk.

Grab Asterisk's MP3

./contrib/scripts/get_mp3_source.sh

res_crypto.c requires some attention. Open the file and add these lines with the other definitions:

#if !defined(ALLPERMS)
# define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) /* 07777 */
#endif

All patched. Now configure.If you're skipping all dahdi, pri, and/or opus; you'll want to remove their --with- entries in the ./configure. You may need to append --without-tonezone if skipping dhadi. They're at the end of the command.

./configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --infodir=/usr/share/info --libdir=/usr/lib --localstatedir=/var --disable-xmldoc --enable-permanent-dlopen --with-gsm=internal --with-popt --with-z --with-newt --with-unixodbc --with-postgres --with-tds --with-tonezone --with-resample --with-sqlite3 --with-speex --with-asound --without-x11 --without-pjproject-bundled --with-spandsp --with-bluetooth --with-libcurl --with-libedit  --with-srtp --with-imap=system --with-opus --with-opusfile  --with-dahdi --with-pri

Building under edge requires you to remove --with-dahdi and --with-pri; you will also have to add --without-tonezone as that is part of the dhadi dev package. Opus still optional.

make menuselect

Compile using all the cores you have

make -j4
make install

At this point you can make samples, make basic-pbx, or whatever else.

We have some openrc/init.d stuff to setup.

https://git.alpinelinux.org/aports/plain/main/dahdi-tools/dahdi-tools.initd?h=3.16-stable
mv dahdi-tools.initd?h=3.16-stable /etc/init.d/dahdi-tools
chmod 755 /etc/init.d/dahdi
rc-update add dahdi

That's dahdi. Now Asterisk.

addgroup -S asterisk 2>/dev/null
adduser -S -D -h /var/lib/asterisk -s /sbin/nologin -G asterisk -g asterisk asterisk 2>/dev/null
addgroup -S dialout 2>/dev/null
addgroup asterisk dialout 2>/dev/null
wget https://git.alpinelinux.org/aports/plain/main/asterisk/asterisk.confd?h=3.16-stable
mv asterisk.confd\?h=3.16-stable /etc/conf.d/asterisk
chmod 644 /etc/conf.d/asterisk
wget https://git.alpinelinux.org/aports/plain/main/asterisk/asterisk.initd?h=3.16-stable
mv asterisk.initd\?h=3.16-stable /etc/init.d/asterisk
chmod 644 /etc/init.d/asterisk
chmod +x /etc/init.d/asterisk
wget https://git.alpinelinux.org/aports/plain/main/asterisk/asterisk.logrotate?h=3.16-stable
mv asterisk.logrotate?h=3.16-stable /etc/logrotate.d/asterisk
chmod 644 /etc/logrotate.d/asterisk
chown -R asterisk:asterisk "$subpkgdir"/var/*/asterisk
chown -R asterisk:asterisk "$subpkgdir"/etc/asterisk
chmod -R u=rwX,g=rX,o= "$subpkgdir"/etc/asterisk
rc-update add asterisk

That's it. It's all on you to write your configurations. make basicpbx will get you started; or just copy existing configurations in to /etc/asterisk.