# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils flag-o-matic toolchain-funcs multilib

DESCRIPTION="Sip-Router (Kamailio/SER) is an Open Source SIP Server"
HOMEPAGE="http://sip-router.org/"
MY_P="${P/sip-router/kamailio}"
SRC_URI="http://www.kamailio.org/pub/kamailio/${PV}/src/${MY_P}_src.tar.gz"
S=${WORKDIR}/${MY_P}

SLOT="0"
LICENSE="GPL-2"
KEYWORDS="~amd64 ~x86"

#Documentation can be found here: http://www.kamailio.org/docs/modules/3.3.x/
IUSE="flavour_kamailio flavour_ser
debug ipv6 sctp
group_standard group_standard_dep group_mysql group_radius group_postgres group_presence group_stable group_experimental
group_kstandard group_kmysql group_kradius group_kpostgres group_kpresence
group_kxml group_kperl group_kldap group_kjson
acc acc_radius alias_db app_lua app_python app_mono async auth auth_identity auth_db auth_diameter auth_radius avpops
benchmark blst
call_control carrierroute cfg_db cfg_rpc cfgutils counters cpl-c ctl
db_berkeley db_flatstore db_mysql db_oracle db_postgres db_text db_unixodbc
db_sqlite ndb_redis db_cassandra db_cluster
debugger dialog dialplan dispatcher diversion domain domainpolicy drouting dmq
enum exec geoip group
h350 htable imc ipops iptrtpproxy jabber json jsonrpc-c kex
lcr ldap
matrix maxfwd msrp mediaproxy memcached misc_radius mi_datagram mi_fifo mi_rpc mi_xmlrpc mqueue msilo mtree
nathelper nat_traversal
osp
p_usrloc
path pdb pdt peering perl perlvdb permissions pike pipelimit prefix_route
presence presence_conference presence_dialoginfo presence_mwi presence_profile presence_reginfo presence_xml
pua pua_bla pua_dialoginfo pua_mi pua_reginfo pua_usrloc pua_xmpp purple pv
qos
ratelimit regex registrar rls rtimer rr rtpproxy
sanity sdpops seas sipcapture siptrace siputils sl sms snmpstats speeddial sqlops statistics sst
textops textopsx tls tm tmx tmrec topoh
uac uac_redirect uri_db userblacklist usrloc utils
xcap_client xcap_server xhttp xhttp_rpc xlog xmlops xmlrpc xmpp"

# FIXME: no ebuilds for them
#db_cassandra? ( thrift dev-db/cassandra )
#pdb? ( pdb-server )
#seas? ( www.wesip.eu )

RDEPEND="
	>=sys-libs/ncurses-5.7
	>=sys-libs/readline-6.1_p2
	group_experimental? ( dev-libs/openssl dev-db/redis dev-db/oracle-instantclient-basic )
	group_mysql? ( >=dev-db/mysql-5.1.50 sys-libs/zlib )
	group_radius? ( >=net-dialup/radiusclient-ng-0.5.0 )
	group_presence? ( dev-libs/libxml2 net-misc/curl )
	group_postgres? ( dev-db/postgresql-base )
	group_standard? ( dev-libs/libxml2 dev-libs/openssl net-misc/curl )
	group_kmysql? ( >=dev-db/mysql-5.1.50 sys-libs/zlib )
	group_kradius? ( >=net-dialup/radiusclient-ng-0.5.0 )
	group_kpresence? ( dev-libs/libxml2 net-misc/curl )
	group_kpostgres? ( dev-db/postgresql-base )
	group_kstandard? ( dev-libs/libxml2 dev-libs/openssl net-misc/curl )
	group_kxml? ( dev-libs/libxml2 dev-libs/xmlrpc-c )
	group_kperl? ( dev-lang/perl dev-perl/perl-ldap )
	group_kldap? ( net-nds/openldap )
	group_kjson? ( dev-libs/json-c dev-libs/libevent )
	acc_radius? ( net-dialup/radiusclient-ng )
	app_lua? ( >=dev-lang/lua-5.1 )
	app_python? ( dev-lang/python )
	app_mono? ( dev-lang/mono )
	auth_identity? ( dev-libs/openssl net-misc/curl )
	carrierroute? ( dev-libs/confuse )
	cpl-c? ( dev-libs/libxml2 )
	db_berkeley? ( >=sys-libs/db-4.6 )
	db_mysql? ( >=dev-db/mysql-5.1.50 )
	db_oracle? ( dev-db/oracle-instantclient-basic )
	db_postgres? ( dev-db/postgresql-base )
	db_sqlite? ( >=dev-db/sqlite-3 )
	db_unixodbc? ( dev-db/unixODBC )
	ndb_redis? ( dev-db/redis )
	dialplan? ( dev-libs/libpcre )
	geoip? ( dev-libs/geoip )
	h350? ( net-nds/openldap )
	jabber? ( dev-libs/expat )
	lcr? ( dev-libs/libpcre )
	ldap? ( net-nds/openldap )
	memcached? ( dev-libs/libmemcache net-misc/memcached )
	mi_xmlrpc? ( dev-libs/libxml2 dev-libs/xmlrpc-c )
	osp? ( net-libs/osptoolkit )
	peering? ( net-dialup/radiusclient-ng )
	perl? ( dev-lang/perl dev-perl/perl-ldap )
	presence? ( dev-libs/libxml2 )
	presence_conference? ( dev-libs/libxml2 )
	presence_xml? ( dev-libs/libxml2 )
	pua? ( dev-libs/libxml2 )
	pua_bla? ( dev-libs/libxml2 )
	pua_dialoginfo? ( dev-libs/libxml2 )
	pua_usrloc? ( dev-libs/libxml2 )
	pua_xmpp? ( dev-libs/libxml2 )
	purple? ( net-im/pidgin )
	regex? ( dev-libs/libpcre )
	rls? ( dev-libs/libxml2 )
	snmpstats? ( net-analyzer/net-snmp sys-apps/lm_sensors )
	tls? (
		sys-libs/zlib
		>=dev-libs/openssl-1.0.0a-r1
	)
	utils? ( net-misc/curl )
	xcap_client? ( dev-libs/libxml2 net-misc/curl )
	xcap_server? ( dev-libs/libxml2 )
	xmlops? ( dev-libs/libxml2 )
	xmpp? ( dev-libs/expat )
"
DEPEND="${RDEPEND}
	>=sys-devel/bison-1.35
	>=sys-devel/flex-2.5.4a
	app-text/docbook2X"

src_unpack() {
	unpack ${A}
	cd "${S}"

	use ipv6 || \
		sed -i -e "s/-DUSE_IPV6//g" Makefile.defs || die
}

src_compile() {
	# iptrtpproxy broken as the needed netfilter module is not supported
	local mod_exc="iptrtpproxy"
	local group_inc=""
	local k=""
	if use flavour_kamailio; then
		k="k"
		use group_kxml && group_inc="${group_inc} kxml"
		use group_kperl && group_inc="${group_inc} kperl"
		use group_kldap && group_inc="${group_inc} kldap"
		use group_kjson && group_inc="${group_inc} kjson"
	fi
	# you can USE flavour=kamailio but also group_standard. It will be converted to group_kstandard
	# same as mysql/kmysql, postgres/kpostgres, radius/kradius, presence/kpresence
	(use group_standard || use group_kstandard) && group_inc="${group_inc} ${k}standard"
	use group_standard_dep && group_inc="${group_inc} standard_dep"
	(use group_mysql || use group_kmysql) && group_inc="${group_inc} ${k}mysql"
	(use group_radius || use group_kradius) && group_inc="${group_inc} ${k}radius"
	(use group_postgres || use group_kpostgres) && group_inc="${group_inc} ${k}postgres"
	(use group_presence || use group_kpresence) && group_inc="${group_inc} ${k}presence"
	use group_stable && group_inc="${group_inc} stable"
	use group_experimental && group_inc="${group_inc} experimental"
	# TODO: skip_modules?

	local mod_inc=""
	# some IUSE flags must not be included here in mod_inc
	# e.g.: flavour_kamailio, flavour_ser, debug, sctp, ipv6
	for i in ${IUSE[@]}; do
		for j in ${i[@]}; do
			[[ ! "${i}" =~ "flavour_" ]] && \
				[ ! "${i}" == "debug" ] && \
				[ ! "${i}" == "ipv6" ] && \
				[ ! "${i}" == "sctp" ] && \
				[[ ! "${i}" =~ "group_" ]] && \
			use "${i}" && mod_inc="${mod_inc} ${i}"
		done
	done

	if use tls; then
		tls_hooks=1
	else
		tls_hooks=0
	fi

	if use debug; then
		mode=debug
	else
		mode=release
	fi

	if use flavour_kamailio; then
		flavour=kamailio
	else
		flavour=ser # defaults to SER compatibility names
	fi

	if use sctp; then
		sctp=1
	else
		sctp=0
	fi

	emake \
		CC="$(tc-getCC)" \
		CPU_TYPE="$(get-flag march)" \
		SCTP="${sctp}" \
		CC_EXTRA_OPTS=-I/usr/gnu/include \
		mode="${mode}" \
		TLS_HOOKS="${tls_hooks}" \
		FLAVOUR="${flavour}" \
		group_include="${group_inc}" \
		include_modules="${mod_inc}" \
		exclude_modules="${mod_exc}" \
		prefix="/" \
		all || die "emake all failed"
}

src_install() {
	emake -j1 \
		BASEDIR="${D}" \
		FLAVOUR="${flavour}" \
		prefix="/" \
		bin_dir=/usr/sbin/ \
		cfg_dir=/etc/${flavour}/ \
		lib_dir=/usr/$(get_libdir)/${flavour}/ \
		modules_dir="/usr/$(get_libdir)/${flavour}/" \
		man_dir="/usr/share/man/" \
		doc_dir="/usr/share/doc/${flavour}/" \
		share_dir="/usr/share/${flavour}/" \
		data_dir="/usr/share/${flavour}/" \
		install || die "emake install failed"

	sed -e "s/sip-router/${flavour}/g" \
		${FILESDIR}/ser.initd > ${flavour}.initd || die
	sed -e "s/sip-router/${flavour}/g" \
		${FILESDIR}/ser.confd > ${flavour}.confd || die

	newinitd "${flavour}".initd "${flavour}"
	newconfd "${flavour}".confd "${flavour}"
}

pkg_preinst() {
	if [[ -z "$(egetent passwd ${flavour})" ]]; then
		einfo "Adding ${flavour} user and group"
		enewgroup "${flavour}"
		enewuser  "${flavour}" -1 -1 /dev/null "${flavour}"
	fi

	chown -R root:"${flavour}"  "${D}/etc/${flavour}"
	chmod -R u=rwX,g=rX,o= "${D}/etc/${flavour}"

}

pkg_postinst() {
	if [ use mediaproxy ]; then
		einfo "You have enabled mediaproxy support. In order to use it, you have
		to run it somewhere."
	fi
	if [ use rtpproxy ]; then
		einfo "You have enabled rtpproxy support. In order to use it, you have
		to run it somewhere."
	fi
}

pkg_prerm () {
	/etc/init.d/"${flavour}" stop >/dev/null
}
