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

inherit eutils flag-o-matic toolchain-funcs

DESCRIPTION="Kamailio (former OpenSER) is an Open Source SIP Server"
HOMEPAGE="http://www.kamailio.org/"
MY_P="${P}_src"
SRC_URI="http://www.${PN}.org/pub/${PN}/${PV}/src/${MY_P}.tar.gz"

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

IUSE="debug ipv6
group_standard group_mysql group_radius group_postgres group_presence
acc acc_radius alias_db auth auth_db auth_diameter auth_identity auth_radius
avpops bdb benchmark call_control carrierroute cfg_db cfg_rpc cfgutils cpl
cpl-c ctl CVS db_berkeley db_flatstore dbg db_mysql db_oracle db_postgres
dbtext db_text db_unixodbc dialog dialplan dispatcher diversion domain
domainpolicy drouting enum exec group h350 htable imc iptrtpproxy jabber kex
lcr ldap mangler maxfwd mediaproxy memcached mi_datagram mi_fifo mi_rpc
misc_radius mi_xmlrpc msilo nathelper nat_traversal oracle osp pa path pdb
pdt peering perl perlvdb permissions pike presence presence_b2b
presence_dialoginfo presence_mwi presence_xml print_lib pua pua_bla
pua_dialoginfo pua_mi pua_usrloc pua_xmpp purple pv qos ratelimit regex
registrar rls rr rtimer sanity seas siptrace siputils sl sms snmpstats
speeddial sqlops sst statistics textops tls tm tmx topoh uac uac_redirect
unixsock uri_db userblacklist usrloc utils xcap xcap_client xlog xmlrpc xmpp"

# Some of these modules have external dependencies.
# If you need to use a modules for which this ebuild does not have a proper
# dependency, please, read http://www.kamailio.org/docs/modules/3.0.x/
# and add fix the ebuild.
# So far, i only tested group_standard, group_radius, tm, pv, sl, auth,
# auth_db, db_mysql, rr, maxfwd, usrloc, registrar, textops, nathelper,
# xlog, kex, siputils, tls.
# sercmd needs ncurses and readline.
RDEPEND="
	>=sys-libs/ncurses-5.7-r5
	>=sys-libs/readline-6.1_p2
	group_mysql? ( >=dev-db/mysql-5.1.50 )
	group_radius? ( >=net-dialup/radiusclient-ng-0.5.0 )
	group_postgres? ( dev-db/postgresql-base )
	jabber? ( dev-libs/expat )
	tls? (
		>=sys-libs/zlib-1.2.5-r2
		>=dev-libs/openssl-1.0.0a-r1
	)
	cpl? ( dev-libs/libxml2 )
	odbc? ( dev-db/unixODBC )
	db_mysql? (
		>=dev-db/mysql-5.1.50
		>=sys-libs/zlib-1.2.5-r2
		>=dev-libs/openssl-1.0.0a-r1
	)"

DEPEND="${RDEPEND}
	>=sys-devel/bison-1.35
	>=sys-devel/flex-2.5.4a"

src_unpack() {
	unpack ${A}
	cd "${S}"
	epatch "${FILESDIR}/${P}-makefile.diff"

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

src_compile() {
	local group_inc=""
	use group_standard && group_inc="${group_inc} standard"
	use group_mysql && group_inc="${group_inc} mysql"
	use group_radius && group_inc="${group_inc} radius"
	use group_postgres && group_inc="${group_inc} postgres"
	use group_presence && group_inc="${group_inc} presence"

	local mod_inc=""
	use acc && mod_inc="${mod_inc} acc"
	use acc_radius && mod_inc="${mod_inc} acc_radius"
	use alias_db && mod_inc="${mod_inc} alias_db"
	use auth_db && mod_inc="${mod_inc} auth_db"
	use auth_diameter && mod_inc="${mod_inc} auth_diameter"
	use auth_identity && mod_inc="${mod_inc} auth_identity"
	use auth && mod_inc="${mod_inc} auth"
	use auth_radius && mod_inc="${mod_inc} auth_radius"
	use avpops && mod_inc="${mod_inc} avpops"
	use bdb && mod_inc="${mod_inc} bdb"
	use benchmark && mod_inc="${mod_inc} benchmark"
	use call_control && mod_inc="${mod_inc} call_control"
	use carrierroute && mod_inc="${mod_inc} carrierroute"
	use cfg_db && mod_inc="${mod_inc} cfg_db"
	use cfg_rpc && mod_inc="${mod_inc} cfg_rpc"
	use cfgutils && mod_inc="${mod_inc} cfgutils"
	use cpl-c && mod_inc="${mod_inc} cpl-c"
	use cpl && mod_inc="${mod_inc} cpl"
	use ctl && mod_inc="${mod_inc} ctl"
	use CVS && mod_inc="${mod_inc} CVS"
	use db_berkeley && mod_inc="${mod_inc} db_berkeley"
	use db_flatstore && mod_inc="${mod_inc} db_flatstore"
	use dbg && mod_inc="${mod_inc} dbg"
	use db_mysql && mod_inc="${mod_inc} db_mysql"
	use db_oracle && mod_inc="${mod_inc} db_oracle"
	use db_postgres && mod_inc="${mod_inc} db_postgres"
	use db_text && mod_inc="${mod_inc} db_text"
	use dbtext && mod_inc="${mod_inc} dbtext"
	use db_unixodbc && mod_inc="${mod_inc} db_unixodbc"
	use dialog && mod_inc="${mod_inc} dialog"
	use dialplan && mod_inc="${mod_inc} dialplan"
	use dispatcher && mod_inc="${mod_inc} dispatcher"
	use diversion && mod_inc="${mod_inc} diversion"
	use domain && mod_inc="${mod_inc} domain"
	use domainpolicy && mod_inc="${mod_inc} domainpolicy"
	use drouting && mod_inc="${mod_inc} drouting"
	use enum && mod_inc="${mod_inc} enum"
	use exec && mod_inc="${mod_inc} exec"
	use group && mod_inc="${mod_inc} group"
	use h350 && mod_inc="${mod_inc} h350"
	use htable && mod_inc="${mod_inc} htable"
	use imc && mod_inc="${mod_inc} imc"
	use iptrtpproxy && mod_inc="${mod_inc} iptrtpproxy"
	use jabber && mod_inc="${mod_inc} jabber"
	use kex && mod_inc="${mod_inc} kex"
	use lcr && mod_inc="${mod_inc} lcr"
	use ldap && mod_inc="${mod_inc} ldap"
	use mangler && mod_inc="${mod_inc} mangler"
	use maxfwd && mod_inc="${mod_inc} maxfwd"
	use mediaproxy && mod_inc="${mod_inc} mediaproxy"
	use memcached && mod_inc="${mod_inc} memcached"
	use mi_datagram && mod_inc="${mod_inc} mi_datagram"
	use mi_fifo && mod_inc="${mod_inc} mi_fifo"
	use mi_rpc && mod_inc="${mod_inc} mi_rpc"
	use misc_radius && mod_inc="${mod_inc} misc_radius"
	use mi_xmlrpc && mod_inc="${mod_inc} mi_xmlrpc"
	use msilo && mod_inc="${mod_inc} msilo"
	use nathelper && mod_inc="${mod_inc} nathelper"
	use nat_traversal && mod_inc="${mod_inc} nat_traversal"
	use oracle && mod_inc="${mod_inc} oracle"
	use osp && mod_inc="${mod_inc} osp"
	use pa && mod_inc="${mod_inc} pa"
	use path && mod_inc="${mod_inc} path"
	use pdb && mod_inc="${mod_inc} pdb"
	use pdt && mod_inc="${mod_inc} pdt"
	use peering && mod_inc="${mod_inc} peering"
	use perl && mod_inc="${mod_inc} perl"
	use perlvdb && mod_inc="${mod_inc} perlvdb"
	use permissions && mod_inc="${mod_inc} permissions"
	use pike && mod_inc="${mod_inc} pike"
	use presence_b2b && mod_inc="${mod_inc} presence_b2b"
	use presence_dialoginfo && mod_inc="${mod_inc} presence_dialoginfo"
	use presence && mod_inc="${mod_inc} presence"
	use presence_mwi && mod_inc="${mod_inc} presence_mwi"
	use presence_xml && mod_inc="${mod_inc} presence_xml"
	use print_lib && mod_inc="${mod_inc} print_lib"
	use pua_bla && mod_inc="${mod_inc} pua_bla"
	use pua_dialoginfo && mod_inc="${mod_inc} pua_dialoginfo"
	use pua_mi && mod_inc="${mod_inc} pua_mi"
	use pua && mod_inc="${mod_inc} pua"
	use pua_usrloc && mod_inc="${mod_inc} pua_usrloc"
	use pua_xmpp && mod_inc="${mod_inc} pua_xmpp"
	use purple && mod_inc="${mod_inc} purple"
	use pv && mod_inc="${mod_inc} pv"
	use qos && mod_inc="${mod_inc} qos"
	use ratelimit && mod_inc="${mod_inc} ratelimit"
	use regex && mod_inc="${mod_inc} regex"
	use registrar && mod_inc="${mod_inc} registrar"
	use rls && mod_inc="${mod_inc} rls"
	use rr && mod_inc="${mod_inc} rr"
	use rtimer && mod_inc="${mod_inc} rtimer"
	use sanity && mod_inc="${mod_inc} sanity"
	use seas && mod_inc="${mod_inc} seas"
	use siptrace && mod_inc="${mod_inc} siptrace"
	use siputils && mod_inc="${mod_inc} siputils"
	use sl && mod_inc="${mod_inc} sl"
	use sms && mod_inc="${mod_inc} sms"
	use snmpstats && mod_inc="${mod_inc} snmpstats"
	use speeddial && mod_inc="${mod_inc} speeddial"
	use sqlops && mod_inc="${mod_inc} sqlops"
	use sst && mod_inc="${mod_inc} sst"
	use statistics && mod_inc="${mod_inc} statistics"
	use textops && mod_inc="${mod_inc} textops"
	use tm && mod_inc="${mod_inc} tm"
	use tmx && mod_inc="${mod_inc} tmx"
	use topoh && mod_inc="${mod_inc} topoh"
	use uac && mod_inc="${mod_inc} uac"
	use uac_redirect && mod_inc="${mod_inc} uac_redirect"
	use unixsock && mod_inc="${mod_inc} unixsock"
	use uri_db && mod_inc="${mod_inc} uri_db"
	use userblacklist && mod_inc="${mod_inc} userblacklist"
	use usrloc && mod_inc="${mod_inc} usrloc"
	use utils && mod_inc="${mod_inc} utils"
	use xcap_client && mod_inc="${mod_inc} xcap_client"
	use xcap && mod_inc="${mod_inc} xcap"
	use xlog && mod_inc="${mod_inc} xlog"
	use xmlrpc && mod_inc="${mod_inc} xmlrpc"
	use xmpp && mod_inc="${mod_inc} xmpp"

	if use tls; then
		tls_hooks=1
		mod_inc="${mod_inc} tls"
	else
		tls_hooks=0
	fi

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

	emake \
		CC="$(tc-getCC)" \
		CPU_TYPE="$(get-flag march)" \
		mode="${mode}" \
		TLS_HOOKS="${tls_hooks}" \
		group_include="${group_inc}" \
		include_modules="${mod_inc}" \
		cfg_prefix="" \
		cfg_target="/etc/${PN}/" \
		prefix="/usr" \
		all || die "emake all failed"
}

src_install() {
	emake \
		BASEDIR="${D}" \
		prefix="/usr" \
		cfg_prefix="${D}" \
		install || die "emake install failed"

	newinitd "${FILESDIR}/${PN}".init "${PN}"
	newconfd "${FILESDIR}/${PN}".confd "${PN}"
}

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

	chown -R root:"${PN}"  "${D}/etc/${PN}"
	chmod -R u=rwX,g=rX,o= "${D}/etc/${PN}"
}
pkg_prerm () {
	/etc/init.d/"${PN}" stop >/dev/null
}