# 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.1.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
acc acc_radius alias_db app_lua app_python 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
debugger dialog dialplan dispatcher diversion domain domainpolicy drouting
enum exec
geoip group
h350 htable imc iptrtpproxy jabber kex
lcr ldap
matrix maxfwd mediaproxy memcached misc_radius mi_datagram mi_fifo mi_rpc mi_xmlrpc mqueue msilo mtree
nathelper nat_traversal
osp
path pdb pdt peering perl perlvdb permissions pike pipelimit prefix_route
presence presence_conference presence_dialoginfo presence_mwi presence_xml
pua pua_bla pua_dialoginfo pua_mi pua_usrloc pua_xmpp purple pv
qos
ratelimit regex registrar rls rtimer rr rtpproxy
sanity seas siptrace siputils sl sms snmpstats speeddial sqlops statistics sst
textops textopsx tls tm tmx topoh
uac uac_redirect uri_db userblacklist usrloc utils
xcap_client xcap_server xhttp xlog xmlops xmlrpc xmpp"

#osp? ( net-libs/osptoolkit )
#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/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 )
	acc_radius? ( net-dialup/radiusclient-ng )
	app_lua? ( >=dev-lang/lua-5.1 )
	app_python? ( dev-lang/python )
	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_unixodbc? ( dev-db/unixODBC )
	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 )
	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"
	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}/" \
		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}"

	has_version <="${CATEGORY}/ser-0.9.8"
	previous_installed_version=$?
	if [[ $previous_installed_version = 1 ]] ; then
		elog "You have a previous version of SER on ${ROOT}etc/ser"
		elog "Consider or verify to remove it (emerge -C ser)."
		elog
		elog "Sip-Router may not could be installed/merged. See your elog."
	fi
}

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
}