# Contributor: Łukasz Jendrysik <scadu@yandex.com>
# Contributor: Michael Mason <ms13sp@gmail.com>
# Contributor: Leonardo Arena <rnalrd@gmail.com>
# Maintainer: Nathan Angelacos <nangel@alpinelinux.org>

pkgname=kamailio
pkgver=6.0.3
pkgrel=0

# If building from a git snapshot, specify the gitcommit
# If building a proper release, leave gitcommit blank or commented
_gitcommit=991fe9b28e0e201309048f3b38a135037e40357a

[ ! -z "${_gitcommit}" ] && pkgver="${pkgver}.$(date +%Y%m%d)"
[ ! -z "${_gitcommit}" ] && _suffix="-${_gitcommit:0:7}"
[ ! -z "${_gitcommit}" ] && builddir="$srcdir/$pkgname-$_gitcommit" || builddir="$srcdir/$pkgname-$pkgver"
[ -z "${_gitcommit}" ] && _gitcommit="${pkgver}"

pkgdesc="Open Source SIP Server"
url="https://www.kamailio.org/"
arch="all"
pkgusers="kamailio"
pkggroups="kamailio"
arch="all"
license="GPL-2.0"
depends="gawk"
options="!check"
makedepends="bison db-dev flex freeradius-client-dev expat-dev
	lksctp-tools-dev perl-dev postgresql-dev python3-dev
	pcre2-dev mariadb-dev libxml2-dev curl-dev unixodbc-dev
	confuse-dev ncurses-dev sqlite-dev lua-dev openldap-dev openssl-dev
	net-snmp-dev libuuid libev-dev jansson-dev json-c-dev libevent-dev
	linux-headers libmemcached-dev rabbitmq-c-dev hiredis-dev
	ruby-dev libmaxminddb-dev libunistring-dev mongo-c-driver-dev
	libwebsockets-dev mosquitto-dev librdkafka-dev nghttp2-dev libjwt-dev"

install="$pkgname.pre-install $pkgname.pre-upgrade"

# secfixes:
#   5.1.4-r0:
#   - CVE-2018-14767

# See Makefile.groups for the list of recommended modules for
# each package.  What follows is a simplified version of Makefile.groups
#
# Alpine specific changes:
#
# _mod_list_debugger is not defined in the original
#
# Move avp from _mod_list_extras to _mod_list_basic, so that we can create
# a kamailio-extras package
#
# Remove db_text from _mod_list_db because we create a separate dbtext package
#
# - basic used modules, with no extra dependency (widespread usage)
_mod_list_basic="avp async auth benchmark blst cfg_rpc cfgt cfgutils corex \
        counters ctl debugger diversion dlgs enum exec gzcompress ipops kex \
        keepalive mangler math maxfwd mediaproxy mqueue nat_traversal \
        nathelper path pike posops pv pv_headers pvtpl ratelimit rr rtimer \
		rtpproxy sanity sdpops siputils sl smsops statsc statistics \
		sworker textops textopsx tm tmx topoh topos xlog rtpengine stun sipt"

# - extra used modules, with no extra dependency
_mod_list_extras="auth_diameter call_control call_obj cnxcc dmq domainpolicy \
        log_custom msrp pdb qos sca seas sms ss7ops sst timer tmrec tsilo \
        uac_redirect xhttp xhttp_rpc xprint nosip dmq_usrloc statsd rtjson \
        tcpops auth_xkeys"

# Add tops_htable here, because htable is here.
#
# - common modules depending on database
_mod_list_db="acc alias_db auth_db avpops cfg_db db_berkeley db_flatstore \
		db_cluster dialog dispatcher domain drouting group htable imc matrix \
        mohqueue msilo mtree p_usrloc pdt permissions pipelimit prefix_route \
        registrar secfilter sipcapture siptrace speeddial sqlops topos_htable \
        uac uri_db userblocklist usrloc"

# - common modules depending on database, using UID db schema
_mod_list_dbuid="db2_ops uid_auth_db uid_avp_db uid_domain uid_gflags \
		uid_uri_db"

# - modules for devel purposes
_mod_list_devel="misctest"

# - kemix module
_mod_list_kemix="kemix"

# _mod_list_secsipid="secsipid secsipid_proc"

# - LOST
_mod_list_lost="lost"

# - JWT
_mod_list_jwt="jwt"

# - modules depending on pcre2 library
_mod_list_pcre="dialplan lcr regex"

# - modules depending on radius client library
_mod_list_radius="acc_radius auth_radius misc_radius peering"

# - modules depending on ldap client library
_mod_list_ldap="db2_ldap h350 ldap"

# - modules depending on mysql client library
_mod_list_mysql="db_mysql"

# - modules depending on postgres client library
_mod_list_postgres="db_postgres"

# - modules depending on unixodbc library
_mod_list_unixodbc="db_unixodbc"

# - modules depending on mysql cassandra library
_mod_list_cassandra="db_cassandra ndb_cassandra"

# - modules depending on xml2 library
_mod_list_cpl="cplc"

# - modules depending on xml2 library
_mod_list_xml="xhttp_pi xmlrpc xmlops"

# - modules depending on net-snmp library
_mod_list_snmpstats="snmpstats"

# - modules depending on expat library
_mod_list_xmpp="xmpp"

# - modules depending on confuse library
_mod_list_carrierroute="carrierroute"

# - modules depending on bdb (db4) library
_mod_list_berkeley="db_berkeley"

# - modules depending on curl library
_mod_list_utils="utils http_client"

# - async http_async_client
_mod_list_http_async="http_async_client"

# - modules depending on purple library
_mod_list_purple="purple"

# - modules depending on memcache library
_mod_list_memcached="memcached"

# - modules depending on openssl library
_mod_list_tls="crypto tls"

# - modules depending on openssl library
_mod_list_outbound="outbound"

# - modules depending on unistring library
_mod_list_websocket="websocket lwsc"

# - modules depending on libval-threads libcrypto libsres libpthread
_mod_list_dnssec="dnssec"

# - modules depending on libsctp
_mod_list_sctp="sctp"

# - modules depending on openssl library
_mod_list_authephemeral="auth_ephemeral"

# - modules related to SIMPLE presence extensions
_mod_list_presence="presence presence_conference presence_dialoginfo \
			presence_mwi presence_profile presence_reginfo presence_xml \
            presence_dfks pua pua_bla pua_dialoginfo pua_reginfo pua_rpc \
            pua_usrloc pua_xmpp rls xcap_client xcap_server"

# - modules depending on lua library
_mod_list_lua="app_lua"

# - modules depending on perl library
_mod_list_perl="app_perl db_perlvdb"

# - modules depending on ruby library
_mod_list_ruby="app_ruby"

# - modules depending on python3 library
_mod_list_python3="app_python3 app_python3s"

# - modules depending on ruby library
_mod_list_ruby="app_ruby app_ruby_proc"

# - modules depending on rabbitmq
_mod_list_rabbitmq="rabbitmq"

# - modules depending on geoip2 library
_mod_list_geoip2="geoip2"

# - modules depending on sqlite library
_mod_list_sqlite="db_sqlite"

# - modules depending on oracle library
_mod_list_oracle="db_oracle"

# - modules depending on json library
_mod_list_json="json jsonrpcc jsonrpcs pua_json"

# - modules depending on redis library
_mod_list_redis="db_redis ndb_redis topos_redis"

# - modules depending on mono library
_mod_list_mono="app_mono"

# - modules related to IMS extensions
_mod_list_ims="cdp cdp_avp ims_dialog ims_diameter_server ims_auth ims_isc \
        ims_icscf ims_qos ims_ocs ims_registrar_pcscf ims_registrar_scscf \
        ims_usrloc_pcscf ims_usrloc_scscf ims_charging ims_qos_npn"

# - modules depending on osp toolkit library
_mod_list_osp="osp"

# - modules depending on java library
_mod_list_java="app_java"

# - modules depending on iptables library
_mod_list_iptrtpproxy="iptrtpproxy"

# - modules depending on gzip library
_mod_list_gzcompress="gzcompress"

# - modules depending on uuid library
_mod_list_uuid="uuid"

# - modules depending on ev library
_mod_list_ev="evapi"

# - modules depending on kazoo/rabbitmq
_mod_list_kazoo="kazoo"

# - modules depending on mongodb
_mod_list_mongodb="db_mongodb ndb_mongodb"

# - modules depending on jansson library
_mod_list_jansson="acc_json jansson janssonrpcc"

# - modules depending on libm
_mod_list_jsdt="app_jsdt"

# - modules depending on rabbitmq
_mod_list_rabbitmq="rabbitmq"

# - modules depending on sipdump
_mod_list_sipdump="sipdump"

# - modules depending on xhttp_prom
_mod_list_xhttp_prom="xhttp_prom"

# - modules depending on slack
_mod_list_slack="slack"

# - modules depending on lrkproxy
_mod_list_slack="lrkproxy"

# mqtt
_mod_list_mqtt="mqtt"

# Kafka
_mod_list_kafka="kafka"

# Alpine Specific
_mod_list_debugger="$_mod_list_devel benchmark debugger"

_mod_list_nghttp2="nghttp2"

# Standard modules in main pkg
_module_group_kstandard="$_mod_list_basic $_mod_list_dbuid $_mod_list_pcre"

# END Makefile.groups #############################################################

subpackages="$pkgname-doc $pkgname-dbg $pkgname-openrc"
_modules="$_module_group_kstandard"
for _i in mqtt kafka lost jwt kemix db postgres sqlite dbtext mysql cpl xml \
    unixodbc snmpstats xmpp carrierroute ldap utils tls presence lua ims \
    outbound debugger extras json websocket authephemeral mongodb uuid ev \
    memcached redis geoip2 jansson sipdump jsdt http_async kazoo rabbitmq sctp \
    radius perl python3 ruby xhttp_prom slack lrkproxy; do

   subpackages="$subpackages $pkgname-$_i"
   eval "_modules=\"\$_modules \$_mod_list_$_i\""
done

source="${pkgname}-${pkgver}${_suffix}.tar.gz::https://github.com/kamailio/$pkgname/archive/$_gitcommit.tar.gz
	kamailio.initd
	"

get_source_from_local_git(){
        cd ../../.. && git archive --format=tar.gz --prefix=${pkgname}-${_gitcommit}/ -o "$SRCDEST"/${pkgname}-${pkgver}${_suffix}.tar.gz ${_gitcommit} && cd pkg/kamailio/alpine || return 1
        echo Created dist archive "$SRCDEST"/${pkgname}-${pkgver}${_suffix}.tar.gz
}

get_source_from_github(){
        echo Cannot create archive using local git repo. Trying create source from GutHub.
        wget -O "$SRCDEST"/${pkgname}-${pkgver}${_suffix}.tar.gz https://github.com/kamailio/$pkgname/archive/${_gitcommit}.tar.gz || return 1
        echo Created dist archive "$SRCDEST"/${pkgname}-${pkgver}${_suffix}.tar.gz
}

snapshot() {
        if [ ! -f "$SRCDEST"/${pkgname}-${pkgver}${_suffix}.tar.gz ]; then
            get_source_from_local_git || get_source_from_github
        fi
        SHA512SUM=$(sha512sum "$SRCDEST"/${pkgname}-${pkgver}${_suffix}.tar.gz | sed -e "s:${SRCDEST}/::")
        sed -i -e "s/^\(sha512sums=.\).*/\1$SHA512SUM/" APKBUILD
}

prepare() {
	default_prepare
	cd "$builddir"

	cd utils/kamctl/
	sed -i -e 's:/run/kamailio.pid:/run/kamailio/kamailio.pid:g' \
		kamctl.base kamctlrc || return 1
	# we actually don't need bash
	sed -i -e 's:/bin/bash:/bin/sh:' kamctl kamdbctl \
		|| return 1
}

build() {
	cd "$builddir"
	make FLAVOUR=kamailio STUN=1 \
		PREFIX=/usr \
		CC_EXTRA_OPTS="$CFLAGS -D_GNU_SOURCE" \
		cfg_target=/etc/kamailio/ \
		run_prefix="" \
		include_modules="$_modules" \
		LIBDIR=lib \
		DESTDIR="$pkgdir" \
		cfg_prefix="$pkgdir" \
		cfg
	make EMBEDDED_UTF8_DECODE=1 STUN=1 FREERADIUS=1 \
		all || return 1
}

package() {
	cd "$builddir"
	make  FREERADIUS=1 -j1 install || return 1

	install -m755 -D "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname
	install -d -o kamailio "$pkgdir"/run/kamailio
}

_mv_mod() {
	local moddir=usr/lib/kamailio/modules i=
	mkdir -p "$subpkgdir"/$moddir
	for i in $@; do
		mv "$pkgdir"/$moddir/$i.so "$subpkgdir"/$moddir/ || return 1
	done
}

_generic_pkg() {
	pkgdesc="Kamailio $1"
	depends="$pkgname"
	_mv_mod $2
}


_db_driver() {
	pkgdesc="Database drivers for $1"
	depends="$pkgname $pkgname-db"
	_mv_mod db_$2 || return 1
	mkdir -p "$subpkgdir"/usr/share/kamailio \
		"$subpkgdir"/usr/lib/kamailio/kamctl
	mv "$pkgdir"/usr/share/kamailio/$3 \
		"$subpkgdir"/usr/share/kamailio/ || return 1
	mv "$pkgdir"/usr/lib/kamailio/kamctl/*.$4 \
		"$subpkgdir"/usr/lib/kamailio/kamctl/ || return 1
}


db() {
	_generic_pkg "modules using a database backend" "$_mod_list_db"
}

postgres() {
	_db_driver Postgres postgres postgres pgsql
}

mysql() {
	_db_driver Mysql mysql mysql mysql
}

sqlite() {
	_db_driver SQlite sqlite db_sqlite sqlite
}

dbtext() {
	_db_driver DBText text dbtext dbtext || return 1
	# kamdbctl.dbtext is a python script - but we will not make python
	# a dependency because kamdbctl is not normally used
	depends="$depends"
	mkdir -p "$subpkgdir"/usr/lib/kamailio/kamctl || return 1
	mv "$pkgdir"/usr/lib/kamailio/kamctl/dbtextdb \
		"$subpkgdir"/usr/lib/kamailio/kamctl/ || return 1
}

cpl() {
	_generic_pkg "CPL (Call Processing Language) interpreter" \
		"$_mod_list_cpl"
}

xml() {
	_generic_pkg "XML related modules: $_mod_list_xml" \
		"$_mod_list_xml" || return 1
	mkdir -p "$subpkgdir"/usr/share/kamailio
	mv "$pkgdir"/usr/share/kamailio/xhttp_pi \
		"$subpkgdir"/usr/share/kamailio || return 1
	mkdir -p "$subpkgdir"/etc/kamailio/
	mv "$pkgdir"/etc/kamailio/pi_framework.xml \
		"$subpkgdir"/etc/kamailio || return 1
}

unixodbc() {
	_generic_pkg "Database drivers for unixodbc" \
		"$_mod_list_unixodbc"
}

snmpstats() {
	_generic_pkg "SNMP statistics support" \
		"$_mod_list_snmpstats" || return 1
	mkdir -p "$subpkgdir"/usr/share/snmp
	mv "$builddir"/src/modules/snmpstats/mibs \
		"$subpkgdir"/usr/share/snmp/ || return 1
}

xmpp() {
	_generic_pkg "XMPP (Jabber) gateway" \
		"$_mod_list_xmpp"
}

carrierroute() {
	_generic_pkg "carrier grade routing functions" \
		"$_mod_list_carrierroute"
}

kemix() {
	_generic_pkg "extensions and functions to be used with KEMI SIP routing scripting" \
		"$_mod_list_kemix"
}

#secsipid() {
#    _generic_pkg "Secure SIP/Telephony Identity (STIR/SHAKEN) extensions" \
#		"$_mod_list_secsipid"
#}

lost() {
    _generic_pkg "HELD (RFC6155) and LOST (RFC5222) location-based routing" \
		"$_mod_list_lost"
}

jwt() {
    _generic_pkg "JSON Web Token generation and validation" \
		"$_mod_list_jwt"
}

mqtt() {
	_generic_pkg "MQTT connector for bi-directional publish-subscribe communication" \
		"$_mod_list_mqtt"
}

kafka() {
	_generic_pkg "Produces and sends messages to a Kafka server" \
		"$_mod_list_kafka"
}

## doesn't compile
# tls_wolfssl() {
# 	_generic_pkg "TLS operations module using wolfssl" \
# 		"$_mod_list_tls_wolfssl"
# }

ldap() {
	_generic_pkg "LDAP search functions" \
		"$_mod_list_ldap"
}

utils() {
	_generic_pkg "miscellaneous utility functions" \
		"$_mod_list_utils"
}

tls() {
	_generic_pkg "TLS support" \
		"$_mod_list_tls"
}

presence() {
	_generic_pkg "SIP Notify (Presence) support" \
		"$_mod_list_presence"
}

lua() {
	_generic_pkg "Lua script support" \
		"$_mod_list_lua"
}

ims() {
	_generic_pkg "IP Multimedia Subsystem (IMS) support" \
		"$_mod_list_ims"
}

outbound() {
	_generic_pkg "RFC 5626 section 5 Outbound support" \
		"$_mod_list_outbound"
}

debugger() {
	_generic_pkg "debugging modules" \
		"$_mod_list_debugger"
}

extras() {
	_generic_pkg "extra modules" \
		"$_mod_list_extras"
}

websocket() {
	_generic_pkg "websocket support" \
		"$_mod_list_websocket"
}

authephemeral() {
	_generic_pkg "auth ephemeral (webrtc)" \
		"$_mod_list_authephemeral"
}

json() {
	_generic_pkg "Operations on json strings" \
		"$_mod_list_json"
}

jansson() {
	_generic_pkg "Operations on json strings using jansson library" \
		"$_mod_list_jansson"
}

geoip2() {
	_generic_pkg "MaxMind GeoIP lookup support" \
		"$_mod_list_geoip2"
}

ev() {
	_generic_pkg "Network event broadcast API" \
		"$_mod_list_ev"
}

uuid() {
	_generic_pkg "UUID generator using libuuid" \
		"$_mod_list_uuid"
}

memcached() {
	_generic_pkg "memcached support" \
		"$_mod_list_memcached"
}

mongodb() {
	_generic_pkg "MongoDB database connectivity" \
	"$_mod_list_mongodb"
}

rabbitmq() {
	_generic_pkg "RabbitMQ client for configuration file" \
		"$_mod_list_rabbitmq"
}

jsdt() {
	_generic_pkg "Support for executing JavaScript" \
		"$_mod_list_jsdt"
}


redis() {
	_generic_pkg "Redis NoSQL support" \
		"$_mod_list_redis"
}

http_async() {
	_generic_pkg "Asynchronous HTTP queries support" \
		"$_mod_list_http_async"
}

kazoo() {
	_generic_pkg "Kazoo VoIP platform support" \
		"$_mod_list_kazoo"
}

radius() {
	_generic_pkg "RADIUS modules for Kamailio" \
		"$_mod_list_radius"
}

sctp() {
	_generic_pkg "SCTP transport for Kamailio" \
		"$_mod_list_sctp"
}

perl() {
	_generic_pkg "Perl extensions and database driver for Kamailio" \
		"$_mod_list_perl"
}

ruby() {
	_generic_pkg "Ruby extensions for Kamailio" \
		"$_mod_list_ruby"
}

python3() {
	_generic_pkg "Execute embedded Python3 scripts" \
		"$_mod_list_python3"
}

ruby() {
	_generic_pkg "Execute embedded Ruby scripts" \
		"$_mod_list_ruby"
}

rabbitmq() {
	_generic_pkg "RabbitMQ related modules for Kamailio" \
		"$_mod_list_rabbitmq"
}

sipdump() {
	_generic_pkg "This module writes SIP traffic and some associated details into local files" \
		"$_mod_list_sipdump"
}

xhttp_prom() {
	_generic_pkg "Metrics for Prometheus monitoring." \
		"$_mod_list_xhttp_prom"
}

slack() {
	_generic_pkg "Send messages to Slack channels" \
		"$_mod_list_slack"
}

lrkproxy() {
	_generic_pkg "RTP packets relay with kernel based forwarding" \
		"$_mod_list_lrkproxy"
}

nghttp2() {
	_generic_pkg "Implements an embedded HTTP/2 server using nghttpd2 library" \
		"$_mod_list_nghttp2"
}

sha512sums="51ea5fccd27a9d3d1783cfc5596eb28ab27e34faeec3268600363f43c48a3634c3c584c479ba874fdb53b85766a0ce8fe7df0e20954c9c6514b1d9d41d9237e6  kamailio-5.1.0.20171125-991fe9b.tar.gz
a777338f1a60b95aa2bf3e38314a0cfa77a3397ccad342955409eb95f66ad9c38a3a64d2974d353d50f2aced3936b209063a0f0a7127851b1c278d8384f4cc45  kamailio.initd"
