summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2015-08-08 13:49:04 -0700
committerRobin H. Johnson <robbat2@gentoo.org>2015-08-08 17:38:18 -0700
commit56bd759df1d0c750a065b8c845e93d5dfa6b549d (patch)
tree3f91093cdb475e565ae857f1c5a7fd339e2d781e /app-emulation/ganeti
downloadgentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.gz
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.bz2
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.zip
proj/gentoo: Initial commit
This commit represents a new era for Gentoo: Storing the gentoo-x86 tree in Git, as converted from CVS. This commit is the start of the NEW history. Any historical data is intended to be grafted onto this point. Creation process: 1. Take final CVS checkout snapshot 2. Remove ALL ChangeLog* files 3. Transform all Manifests to thin 4. Remove empty Manifests 5. Convert all stale $Header$/$Id$ CVS keywords to non-expanded Git $Id$ 5.1. Do not touch files with -kb/-ko keyword flags. Signed-off-by: Robin H. Johnson <robbat2@gentoo.org> X-Thanks: Alec Warner <antarus@gentoo.org> - did the GSoC 2006 migration tests X-Thanks: Robin H. Johnson <robbat2@gentoo.org> - infra guy, herding this project X-Thanks: Nguyen Thai Ngoc Duy <pclouds@gentoo.org> - Former Gentoo developer, wrote Git features for the migration X-Thanks: Brian Harring <ferringb@gentoo.org> - wrote much python to improve cvs2svn X-Thanks: Rich Freeman <rich0@gentoo.org> - validation scripts X-Thanks: Patrick Lauer <patrick@gentoo.org> - Gentoo dev, running new 2014 work in migration X-Thanks: Michał Górny <mgorny@gentoo.org> - scripts, QA, nagging X-Thanks: All of other Gentoo developers - many ideas and lots of paint on the bikeshed
Diffstat (limited to 'app-emulation/ganeti')
-rw-r--r--app-emulation/ganeti/Manifest7
-rw-r--r--app-emulation/ganeti/files/ganeti-2.1.initd112
-rw-r--r--app-emulation/ganeti/files/ganeti-2.10-rundir.patch35
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-add-pgrep.patch25
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-daemon-util-tests.patch38
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-daemon-util.patch38
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-dont-nest-libdir.patch49
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-dont-print-man-help.patch13
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-qemu-enable-kvm.patch12
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-regex-builtin.patch15
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-start-stop-daemon-args.patch39
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-tests.patch13
-rw-r--r--app-emulation/ganeti/files/ganeti-2.11-useradd.patch17
-rw-r--r--app-emulation/ganeti/files/ganeti-2.12-cfgupgrade-state.patch15
-rw-r--r--app-emulation/ganeti/files/ganeti-2.12-daemon-util.patch37
-rw-r--r--app-emulation/ganeti/files/ganeti-2.12-qemu-enable-kvm.patch12
-rw-r--r--app-emulation/ganeti/files/ganeti-2.12-start-stop-daemon-args.patch39
-rw-r--r--app-emulation/ganeti/files/ganeti-2.12-tests.patch59
-rw-r--r--app-emulation/ganeti/files/ganeti-2.12.3-daemon-util.patch37
-rw-r--r--app-emulation/ganeti/files/ganeti-2.13-daemon-util.patch46
-rw-r--r--app-emulation/ganeti/files/ganeti-2.13-disable-usersgroups-test.patch68
-rw-r--r--app-emulation/ganeti/files/ganeti-2.13-process_unittest.patch21
-rw-r--r--app-emulation/ganeti/files/ganeti-2.13-regex-pcre-builtin.patch13
-rw-r--r--app-emulation/ganeti/files/ganeti-2.2.initd113
-rw-r--r--app-emulation/ganeti/files/ganeti-2.6-add-pgrep.patch38
-rw-r--r--app-emulation/ganeti/files/ganeti-2.6-fix-args.patch45
-rw-r--r--app-emulation/ganeti/files/ganeti-2.7-fix-tests.patch30
-rw-r--r--app-emulation/ganeti/files/ganeti-2.9-disable-root-tests.patch18
-rw-r--r--app-emulation/ganeti/files/ganeti-2.9-regex-builtin.patch22
-rw-r--r--app-emulation/ganeti/files/ganeti-2.9-skip-cli-test.patch18
-rw-r--r--app-emulation/ganeti/files/ganeti-fix-start-stop.patch47
-rw-r--r--app-emulation/ganeti/files/ganeti-kvm-poweroff.confd4
-rw-r--r--app-emulation/ganeti/files/ganeti-kvm-poweroff.initd58
-rw-r--r--app-emulation/ganeti/files/ganeti-lockdir.patch15
-rw-r--r--app-emulation/ganeti/files/ganeti.confd16
-rw-r--r--app-emulation/ganeti/files/ganeti.confd-r219
-rw-r--r--app-emulation/ganeti/files/ganeti.initd57
-rw-r--r--app-emulation/ganeti/files/ganeti.initd-r383
-rw-r--r--app-emulation/ganeti/files/ganeti2.initd55
-rw-r--r--app-emulation/ganeti/ganeti-2.10.5-r4.ebuild174
-rw-r--r--app-emulation/ganeti/ganeti-2.11.6-r2.ebuild220
-rw-r--r--app-emulation/ganeti/ganeti-2.12.1-r3.ebuild253
-rw-r--r--app-emulation/ganeti/ganeti-2.12.3-r2.ebuild262
-rw-r--r--app-emulation/ganeti/ganeti-2.13.0-r2.ebuild258
-rw-r--r--app-emulation/ganeti/ganeti-2.14.1-r1.ebuild295
-rw-r--r--app-emulation/ganeti/ganeti-2.4.5-r1.ebuild90
-rw-r--r--app-emulation/ganeti/metadata.xml36
47 files changed, 2986 insertions, 0 deletions
diff --git a/app-emulation/ganeti/Manifest b/app-emulation/ganeti/Manifest
new file mode 100644
index 000000000000..5180973a8505
--- /dev/null
+++ b/app-emulation/ganeti/Manifest
@@ -0,0 +1,7 @@
+DIST ganeti-2.10.5.tar.gz 3855105 SHA256 7b66a0a13344f484bc1d1e90f84227438e2cdbb054f5667a9a4c216bce2b8532 SHA512 ab9fe4c18f975e13dcd403a086b725d4f5e4f84aaa5a2651cf4087b6abad59b38b470ed062f407e6783997f976eb217e755c9d7a3ebde1df63638c3ab63cd755 WHIRLPOOL 5bf83bae29f51cfd2980d3e57a03d25e598ae7495785646e8920d4ca7685d2e93cbac42624e86fbbf92236edd7311f724fa036580300f8ccc066818d3c9911a5
+DIST ganeti-2.11.6.tar.gz 4145886 SHA256 db11659ae7aaab5933b55b35f703236edc91ec763e443ac80679a057ba57af5e SHA512 c68ba0661f7598b2fbd67a96fd897e9a8fe7c3a79e914200c08a8e6cb78ad7ea8a85ce7cfee157e22c07d5f46ae6ed61d946cf2cc3852624cd303deb96f1e449 WHIRLPOOL 9bd0acd85ed86b8d05164d6ee70ea960fd42128f9144739c148e70917675d53c1d808d22df981a1ea0d843dfc5fd14fd516d6d39330634beec7eb0ecae4cbe5b
+DIST ganeti-2.12.1.tar.gz 4353529 SHA256 bd1b33d12485f4de25cca74dcf2e5354067cdda5ee36b56333d402aa1c5351e0 SHA512 92f66b45b5adcfd4cca47a1cbd592489d6c3ec595d3c6ba7b4a9401cb588a51994288499078513d6f4c0369f15a403c796a526945a2e874e8d561aac2b962b7a WHIRLPOOL 60f446b851f0bcee536791ed01d470c7a5caf02b120891e370f491f07194c1b0d9fe991a0342c7f77f3762c4aaea1ae7b7cf731644d061f43f4ba38af36cf699
+DIST ganeti-2.12.3.tar.gz 4373350 SHA256 e66fc4c3dde1e90d85749ceb5c1c90bd6eaed1d139796829833b74337d2d4148 SHA512 7715db8e472e4ac99bf184028cd9853495153485c6638bcddba2d05ce958b6b44d3be07290780bb27b22337ae646881d6b0a30bbe87b7249106ac34d22bdd6c2 WHIRLPOOL e24d695d5acc582905ae7ba003e3fe6e6aa6ea4f9135daf76b953864c392803cd1c6ed81eb0e96652038f289bf450f3ac1a428c46d7a2573bc39a9451a47694e
+DIST ganeti-2.13.0.tar.gz 4573781 SHA256 30ccfa971b15d49b45a4bfb75bb9631c0993adbd7feac0562c11305ae8c13753 SHA512 bd847ae7e12cb978fae59a458a4d0e33fee470c51748964453b5d0ea6615e6d959519c84922e92229e942a88f1ad88a6d1cb655f58391d033d5f5dfc249ef941 WHIRLPOOL 925159e36fde1cd36214b4fe54b4e06958cc8bd3ded28e32bc4f99842aafcb4c53c701c8a651421559dc13b4d18ae2cc11f1b9d1d2da1e862561cca81d009bda
+DIST ganeti-2.14.1.tar.gz 4655994 SHA256 ae90c69f0c02d2ee558363a1c021dfaaaf4ccb59b662a72fa6485b406766e133 SHA512 2d3927bf888ea56df6b6275a869979c53d4b01e2e527e2dddea2a4835c90e85831e9e7691162999e5c58e9d214e03a37690e84f8fde9f1a0631897b06db348c3 WHIRLPOOL 3554161afd646af41e587fffa9dc85788f6ef13102121c636802946b64161cdeaeea326103171b70577b06635eebf6988b2f3942024a944612642aefd92b89bb
+DIST ganeti-2.4.5.tar.gz 1828118 SHA256 9141379f3802238fb209309ec12f7090d872b77d7a473c91fe766d1fcec97c89 SHA512 e3abc2fd7c031fbef41c6e993f4cb129fa1dd4cb8c44961a2574da23832fd8412b8b3664b2e05ba8236cb8e58e8d70c3c9081f3f1b6dba8ffdc28d298c8a5099 WHIRLPOOL 897c2b3cdf0c7b03232a4ec99314439dbd29afd65eb2502d21a9f197cc098323a4b9ec0671c24ef7aad44b5327316ee68731e7e5304c8730d03f8ca908b93b62
diff --git a/app-emulation/ganeti/files/ganeti-2.1.initd b/app-emulation/ganeti/files/ganeti-2.1.initd
new file mode 100644
index 000000000000..111f75468999
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.1.initd
@@ -0,0 +1,112 @@
+#!/sbin/runscript
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+depend() {
+ need localmount logger
+ after bootmisc
+}
+
+DAEMON_UTIL="/usr/lib/ganeti/daemon-util"
+
+check_config() {
+ if ! $DAEMON_UTIL check-config ; then
+ eend 0 "Incomplete configuration, will not run."
+ fi
+}
+
+check_exitcode() {
+ RC=${1}
+ if errmsg=$(${DAEMON_UTIL} check-exitcode ${RC}) ; then
+ eend 0 "${errmsg}"
+ else
+ eend 1 "${errmsg}"
+ fi
+}
+
+start_action() {
+ # called as start_action daemon-name
+ local daemon="${1}"
+ ebegin "Starting ${daemon}"
+ ${DAEMON_UTIL} start "${@}"
+ check_exitcode ${?}
+}
+
+stop_action() {
+ # called as stop_action daemon-name
+ local daemon="${1}"
+ ebegin "Stopping ${daemon}"
+ ${DAEMON_UTIL} stop "${@}"
+ check_exitcode ${?}
+}
+
+maybe_do() {
+ requested="${1}"; shift
+ action="${1}"; shift
+ target="${1}"
+ if [ -z "${requested}" -o "${requested}" = "${target}" ] ; then
+ ${action} "${@}"
+ fi
+}
+
+get_master_node() {
+ MASTER_NODE="$(gnt-cluster getmaster)"
+ NODE_HOSTNAME="$(hostname -f)"
+ if [ "$MASTER_NODE" == "$NODE_HOSTNAME" ] ; then
+ MASTER=1
+ else
+ MASTER=0
+ fi
+}
+
+start_all() {
+ check_config
+ get_master_node
+ for i in $($DAEMON_UTIL list-start-daemons); do \
+ GANETI_START_OPTS="${GANETI_OPTS}"
+ case "${i}" in
+ ganeti-masterd)
+ GANETI_OPTS="${GANETI_START_OPTS} ${GANETI_MASTERD_OPTS}"
+ ;;
+ ganeti-rapid)
+ GANETI_OPTS="${GANETI_START_OPTS} ${GANETI_RAPI_OPTS}"
+ ;;
+ ganeti-noded)
+ GANETI_OPTS="${GANETI_START_OPTS} ${GANETI_NODED_OPTS}"
+ ;;
+ ganeti-confd)
+ GANETI_OPTS="${GANETI_START_OPTS} ${GANETI_CONFD_OPTS}"
+ ;;
+ esac
+ # Don't start if not master
+ if [ $MASTER = 0 -a $i = "ganeti-masterd" ] ; then
+ continue
+ elif [ $MASTER = 0 -a $i = "ganeti-rapi" ] ; then
+ continue
+ else
+ maybe_do "${1}" start_action ${i} ${GANETI_OPTS}
+ fi
+ done
+}
+
+stop_all() {
+ get_master_node
+ for i in $($DAEMON_UTIL list-stop-daemons) ; do \
+ if [ $MASTER = 0 -a $i = "ganeti-masterd" ] ; then
+ continue
+ elif [ $MASTER = 0 -a $i = "ganeti-rapi" ] ; then
+ continue
+ else
+ maybe_do "${1}" stop_action ${i} ${GANETI_OPTS}
+ fi
+ done
+}
+
+start() {
+ start_all
+}
+
+stop() {
+ stop_all
+}
diff --git a/app-emulation/ganeti/files/ganeti-2.10-rundir.patch b/app-emulation/ganeti/files/ganeti-2.10-rundir.patch
new file mode 100644
index 000000000000..a723f2b63d85
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.10-rundir.patch
@@ -0,0 +1,35 @@
+diff --git a/Makefile.am b/Makefile.am
+index df62fdf..b034d32 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1865,7 +1865,7 @@ $(SHELL_ENV_INIT): Makefile stamp-directories
+ echo; \
+ echo 'readonly PKGLIBDIR=$(libdir)/ganeti'; \
+ echo 'readonly LOG_DIR="$$LOCALSTATEDIR/log/ganeti"'; \
+- echo 'readonly RUN_DIR="$$LOCALSTATEDIR/run/ganeti"'; \
++ echo 'readonly RUN_DIR="/run/ganeti"'; \
+ echo 'readonly DATA_DIR="$$LOCALSTATEDIR/lib/ganeti"'; \
+ echo 'readonly CONF_DIR="$$SYSCONFDIR/ganeti"'; \
+ } > $@
+@@ -2208,7 +2208,7 @@ dist-release: dist
+ install-exec-local:
+ @mkdir_p@ "$(DESTDIR)${localstatedir}/lib/ganeti" \
+ "$(DESTDIR)${localstatedir}/log/ganeti" \
+- "$(DESTDIR)${localstatedir}/run/ganeti"
++ "$(DESTDIR)/run/ganeti"
+ for dir in $(SYMLINK_TARGET_DIRS); do \
+ @mkdir_p@ $(DESTDIR)$$dir; \
+ done
+diff --git a/lib/pathutils.py b/lib/pathutils.py
+index f075e22..38b02e9 100644
+--- a/lib/pathutils.py
++++ b/lib/pathutils.py
+@@ -62,7 +62,7 @@ ETC_HOSTS = vcluster.ETC_HOSTS
+ DATA_DIR = LOCALSTATEDIR + "/lib/ganeti"
+ LOCK_DIR = LOCALSTATEDIR + "/lock"
+ LOG_DIR = LOCALSTATEDIR + "/log/ganeti"
+-RUN_DIR = LOCALSTATEDIR + "/run/ganeti"
++RUN_DIR = "/run/ganeti"
+
+ #: Script to configure master IP address
+ DEFAULT_MASTER_SETUP_SCRIPT = TOOLSDIR + "/master-ip-setup"
diff --git a/app-emulation/ganeti/files/ganeti-2.11-add-pgrep.patch b/app-emulation/ganeti/files/ganeti-2.11-add-pgrep.patch
new file mode 100644
index 000000000000..b0a8bd99cc0a
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-add-pgrep.patch
@@ -0,0 +1,25 @@
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index 656dc95..01f2cbb 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -246,12 +246,14 @@ start() {
+ @PKGLIBDIR@/ensure-dirs
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --start --quiet \
+- --pidfile $pidfile \
+- --exec $daemonexec \
+- --user $usergroup \
+- --wait 300 \
+- -- $args "$@"
++ if ! ret=$(/usr/bin/pgrep $name) ; then
++ start-stop-daemon --start --quiet \
++ --pidfile $pidfile \
++ --exec $daemonexec \
++ --user $usergroup \
++ --wait 300 \
++ -- $args "$@"
++ fi
+ else
+ # TODO: Find a way to start daemon with a group, until then the group must
+ # be removed
diff --git a/app-emulation/ganeti/files/ganeti-2.11-daemon-util-tests.patch b/app-emulation/ganeti/files/ganeti-2.11-daemon-util-tests.patch
new file mode 100644
index 000000000000..b60a85057761
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-daemon-util-tests.patch
@@ -0,0 +1,38 @@
+diff --git a/test/py/daemon-util_unittest.bash b/test/py/daemon-util_unittest.bash
+index faacaed..002bfb4 100755
+--- a/test/py/daemon-util_unittest.bash
++++ b/test/py/daemon-util_unittest.bash
+@@ -72,21 +72,21 @@ done
+ $daemon_util check-exitcode 11 >/dev/null 2>&1 ||
+ err "check-exitcode 11 (not master) didn't return 0"
+
+-tmp=$(echo $($daemon_util list-start-daemons))
+-test "$tmp" == "$DAEMONS" ||
+- err "list-start-daemons didn't return correct list of daemons"
++#tmp=$(echo $($daemon_util list-start-daemons))
++#test "$tmp" == "$DAEMONS" ||
++# err "list-start-daemons didn't return correct list of daemons"
+
+-tmp=$(echo $($daemon_util list-stop-daemons))
+-test "$tmp" == "$STOPDAEMONS" ||
+- err "list-stop-daemons didn't return correct list of daemons"
++#tmp=$(echo $($daemon_util list-stop-daemons))
++#test "$tmp" == "$STOPDAEMONS" ||
++# err "list-stop-daemons didn't return correct list of daemons"
+
+-$daemon_util is-daemon-name >/dev/null 2>&1 &&
+- err "is-daemon-name didn't require daemon name"
++#$daemon_util is-daemon-name >/dev/null 2>&1 &&
++# err "is-daemon-name didn't require daemon name"
+
+-for i in '' '.' '..' '-' 'not-a-daemon'; do
+- $daemon_util is-daemon-name "$i" >/dev/null 2>&1 &&
+- err "is-daemon-name thinks '$i' is a daemon name"
+-done
++#for i in '' '.' '..' '-' 'not-a-daemon'; do
++# $daemon_util is-daemon-name "$i" >/dev/null 2>&1 &&
++# err "is-daemon-name thinks '$i' is a daemon name"
++#done
+
+ for i in $DAEMONS; do
+ $daemon_util is-daemon-name $i >/dev/null 2>&1 ||
diff --git a/app-emulation/ganeti/files/ganeti-2.11-daemon-util.patch b/app-emulation/ganeti/files/ganeti-2.11-daemon-util.patch
new file mode 100644
index 000000000000..09b10cd3354d
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-daemon-util.patch
@@ -0,0 +1,38 @@
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index 01f2cbb..de4e396 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -22,18 +22,25 @@ set -e
+
+ @SHELL_ENV_INIT@
+
+-readonly defaults_file="$SYSCONFDIR/default/ganeti"
++readonly defaults_file="$SYSCONFDIR/conf.d/ganeti"
+
+ # This is a list of all daemons and the order in which they're started. The
+ # order is important as there are dependencies between them. On shutdown,
+ # they're stopped in reverse order.
+-DAEMONS=(
+- ganeti-noded
+- ganeti-masterd
+- ganeti-rapi
+- ganeti-luxid
+- ganeti-kvmd
+- )
++
++DAEMONS=( ganeti-noded )
++
++_is_master() {
++ [ -z "${ganeti_master}" ] && ganeti_master="$(gnt-cluster getmaster)"
++ [ -z "${local_hostname}" ] && local_hostname="$(hostname -f)"
++ [ "${ganeti_master}" = "${local_hostname}" ]
++}
++
++if _is_master; then
++ DAEMONS+=( ganeti-masterd ganeti-rapi ganeti-luxid )
++fi
++
++DAEMONS+=( ganeti-kvmd )
+
+ _confd_enabled() {
+ [[ "@CUSTOM_ENABLE_CONFD@" == True ]]
diff --git a/app-emulation/ganeti/files/ganeti-2.11-dont-nest-libdir.patch b/app-emulation/ganeti/files/ganeti-2.11-dont-nest-libdir.patch
new file mode 100644
index 000000000000..134b9d7bcac2
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-dont-nest-libdir.patch
@@ -0,0 +1,49 @@
+diff --git a/Makefile.am b/Makefile.am
+index 66ad714..5bd2e9c 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -67,7 +67,7 @@ defaultversionedsharedir = $(prefix)/share/ganeti/default
+
+ # Note: these are automake-specific variables, and must be named after
+ # the directory + 'dir' suffix
+-pkglibdir = $(versiondir)$(libdir)/ganeti
++pkglibdir = $(versiondir)/ganeti
+ myexeclibdir = $(pkglibdir)
+ bindir = $(versiondir)/$(BINDIR)
+ sbindir = $(versiondir)$(SBINDIR)
+@@ -1025,7 +1025,7 @@ bin_SCRIPTS = $(HS_BIN_PROGS)
+ install-exec-hook:
+ @mkdir_p@ $(DESTDIR)$(iallocatorsdir)
+ # FIXME: this is a hardcoded logic, instead of auto-resolving
+- $(LN_S) -f ../../../bin/htools \
++ $(LN_S) -f ../../usr/bin/htools \
+ $(DESTDIR)$(iallocatorsdir)/hail
+ for role in $(HS_BIN_ROLES); do \
+ $(LN_S) -f htools $(DESTDIR)$(bindir)/$$role ; \
+@@ -2297,7 +2297,7 @@ install-exec-local:
+ for prog in $(HS_BIN_ROLES); do \
+ $(LN_S) -f $(defaultversiondir)$(BINDIR)/$$prog $(DESTDIR)$(BINDIR)/$$prog; \
+ done
+- $(LN_S) -f $(defaultversiondir)$(libdir)/ganeti/iallocators/hail $(DESTDIR)$(libdir)/ganeti/iallocators/hail
++ $(LN_S) -f $(defaultversiondir)/ganeti/iallocators/hail $(DESTDIR)$(libdir)/ganeti/iallocators/hail
+ for prog in $(all_sbin_scripts); do \
+ $(LN_S) -f $(defaultversiondir)$(SBINDIR)/$$prog $(DESTDIR)$(SBINDIR)/$$prog; \
+ done
+@@ -2311,7 +2311,7 @@ install-exec-local:
+ $(LN_S) -f $(defaultversionedsharedir)/$$prog $(DESTDIR)$(libdir)/ganeti/tools/$$prog; \
+ done
+ for prog in $(tools_basenames); do \
+- $(LN_S) -f $(defaultversiondir)/$(libdir)/ganeti/tools/$$prog $(DESTDIR)$(libdir)/ganeti/tools/$$prog; \
++ $(LN_S) -f $(defaultversiondir)/ganeti/tools/$$prog $(DESTDIR)$(libdir)/ganeti/tools/$$prog; \
+ done
+ if ! test -n '$(ENABLE_MANPAGES)'; then \
+ for man in $(manfullpath); do \
+@@ -2319,7 +2319,7 @@ install-exec-local:
+ done; \
+ fi
+ for prog in $(myexeclib_scripts_basenames); do \
+- $(LN_S) -f $(defaultversiondir)$(libdir)/ganeti/$$prog $(DESTDIR)$(libdir)/ganeti/$$prog; \
++ $(LN_S) -f $(defaultversiondir)/ganeti/$$prog $(DESTDIR)$(libdir)/ganeti/$$prog; \
+ done
+ if INSTALL_SYMLINKS
+ $(LN_S) -f $(versionedsharedir) $(DESTDIR)$(sysconfdir)/ganeti/share
diff --git a/app-emulation/ganeti/files/ganeti-2.11-dont-print-man-help.patch b/app-emulation/ganeti/files/ganeti-2.11-dont-print-man-help.patch
new file mode 100644
index 000000000000..42b90deb6596
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-dont-print-man-help.patch
@@ -0,0 +1,13 @@
+diff --git a/configure.ac b/configure.ac
+index dcb8aa0..7d7ab76 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -796,7 +796,7 @@ fi
+
+ AC_SUBST(SOCAT_USE_COMPRESS)
+
+-if man --help | grep -q -e --warnings
++if man --help |& grep -q -e --warnings
+ then
+ MAN_HAS_WARNINGS=1
+ else
diff --git a/app-emulation/ganeti/files/ganeti-2.11-qemu-enable-kvm.patch b/app-emulation/ganeti/files/ganeti-2.11-qemu-enable-kvm.patch
new file mode 100644
index 000000000000..f2cce0c759d1
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-qemu-enable-kvm.patch
@@ -0,0 +1,12 @@
+diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py
+index b61be65..100aafd 100644
+--- a/lib/hypervisor/hv_kvm.py
++++ b/lib/hypervisor/hv_kvm.py
+@@ -1380,6 +1380,7 @@ class KVMHypervisor(hv_base.BaseHypervisor):
+ kvm = hvp[constants.HV_KVM_PATH]
+ kvm_cmd = [kvm]
+ # used just by the vnc server, if enabled
++ kvm_cmd.extend(["-enable-kvm"])
+ kvm_cmd.extend(["-name", instance.name])
+ kvm_cmd.extend(["-m", instance.beparams[constants.BE_MAXMEM]])
+
diff --git a/app-emulation/ganeti/files/ganeti-2.11-regex-builtin.patch b/app-emulation/ganeti/files/ganeti-2.11-regex-builtin.patch
new file mode 100644
index 000000000000..08ef3778ca53
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-regex-builtin.patch
@@ -0,0 +1,15 @@
+diff --git a/configure.ac b/configure.ac
+index d70db62..f94043f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -612,8 +612,8 @@ CONFD_PKG=
+ # if a new confd dependency is needed, add it here like:
+ # AC_GHC_PKG_CHECK([somepkg], [], [HS_NODEV=1; CONFD_PKG="$CONFD_PKG somepkg"])
+ HS_REGEX_PCRE=-DNO_REGEX_PCRE
+-AC_GHC_PKG_CHECK([regex-pcre], [HS_REGEX_PCRE=],
+- [HS_NODEV=1; CONFD_PKG="$CONFD_PKG regex-pcre"])
++AC_GHC_PKG_CHECK([regex-pcre-builtin], [HS_REGEX_PCRE=],
++ [HS_NODEV=1; CONFD_PKG="$CONFD_PKG regex-pcre-builtin"])
+
+ has_confd=False
+ if test "$enable_confd" != no; then
diff --git a/app-emulation/ganeti/files/ganeti-2.11-start-stop-daemon-args.patch b/app-emulation/ganeti/files/ganeti-2.11-start-stop-daemon-args.patch
new file mode 100644
index 000000000000..6f90233847ef
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-start-stop-daemon-args.patch
@@ -0,0 +1,39 @@
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index 4d1d7c5..3deeab7 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -246,10 +246,11 @@ start() {
+ @PKGLIBDIR@/ensure-dirs
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --start --quiet --oknodo \
++ start-stop-daemon --start --quiet \
+ --pidfile $pidfile \
+- --startas $daemonexec \
+- --chuid $usergroup \
++ --exec $daemonexec \
++ --user $usergroup \
++ --wait 300 \
+ -- $args "$@"
+ else
+ # TODO: Find a way to start daemon with a group, until then the group must
+@@ -273,7 +274,7 @@ stop() {
+ local pidfile=$(_daemon_pidfile $name)
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --stop --quiet --oknodo --retry 30 \
++ start-stop-daemon --stop --quiet --retry 30 \
+ --pidfile $pidfile
+ else
+ _ignore_error killproc -p $pidfile $name
+@@ -348,8 +348,8 @@ rotate_logs() {
+ local daemonexec=$(_daemon_executable $name)
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --stop --signal HUP --quiet \
+- --oknodo --pidfile $pidfile
++ start-stop-daemon --signal HUP --quiet \
++ --pidfile $pidfile
+ else
+ _ignore_error killproc \
+ -p $pidfile \
diff --git a/app-emulation/ganeti/files/ganeti-2.11-tests.patch b/app-emulation/ganeti/files/ganeti-2.11-tests.patch
new file mode 100644
index 000000000000..fd0a9f606718
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-tests.patch
@@ -0,0 +1,13 @@
+diff --git a/test/py/ganeti-cleaner_unittest.bash b/test/py/ganeti-cleaner_unittest.bash
+index bf57b76..ee3b90d 100755
+--- a/test/py/ganeti-cleaner_unittest.bash
++++ b/test/py/ganeti-cleaner_unittest.bash
+@@ -219,7 +219,7 @@ count_and_check_certs 10
+ run_cleaner master
+ count_and_check_certs 10
+ run_cleaner node
+-count_and_check_certs 5
++count_and_check_certs 10
+
+ check_logfiles $maxlog node
+ check_logfiles $maxlog master
diff --git a/app-emulation/ganeti/files/ganeti-2.11-useradd.patch b/app-emulation/ganeti/files/ganeti-2.11-useradd.patch
new file mode 100644
index 000000000000..d546921bd9b6
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.11-useradd.patch
@@ -0,0 +1,17 @@
+diff --git a/Makefile.am b/Makefile.am
+index 7666d18..a8b6396 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1695,9 +1695,9 @@ tools/users-setup: Makefile $(userspecs)
+ echo 'read confirm'; \
+ echo 'if [ "x$$confirm" != "xy" ]; then exit 0; fi'; \
+ echo 'fi'; \
+- $(AWK) -- '{print "addgroup --system",$$1}' doc/users/groups; \
+- $(AWK) -- '{if (NF > 1) {print "adduser --system --ingroup",$$2,$$1} else {print "adduser --system",$$1}}' doc/users/users; \
+- $(AWK) -- '{print "adduser",$$1,$$2}' doc/users/groupmemberships; \
++ $(AWK) -- '{print "groupadd --system",$$1}' doc/users/groups; \
++ $(AWK) -- '{if (NF > 1) {print "useradd --system --gid",$$2,$$1} else {print "useradd --system",$$1}}' doc/users/users; \
++ $(AWK) -- '{print "usermod --append --groups",$$2,$$1}' doc/users/groupmemberships; \
+ } > $@
+ chmod +x $@
+
diff --git a/app-emulation/ganeti/files/ganeti-2.12-cfgupgrade-state.patch b/app-emulation/ganeti/files/ganeti-2.12-cfgupgrade-state.patch
new file mode 100644
index 000000000000..42841f905937
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.12-cfgupgrade-state.patch
@@ -0,0 +1,15 @@
+diff --git a/tools/cfgupgrade b/tools/cfgupgrade
+index c8dfdec..0f886b2 100755
+--- a/tools/cfgupgrade
++++ b/tools/cfgupgrade
+@@ -169,6 +169,10 @@ def UpgradeCluster(config_data):
+ cluster.get("zeroing_image", "")
+ cluster["compression_tools"] = \
+ cluster.get("compression_tools", constants.IEC_DEFAULT_TOOLS)
++ cluster["hv_state_static"] = \
++ cluster.get("hv_state_static", {})
++ cluster["disk_state_static"] = \
++ cluster.get("disk_state_static", {})
+ if "enabled_user_shutdown" not in cluster:
+ cluster["enabled_user_shutdown"] = False
+
diff --git a/app-emulation/ganeti/files/ganeti-2.12-daemon-util.patch b/app-emulation/ganeti/files/ganeti-2.12-daemon-util.patch
new file mode 100644
index 000000000000..79bda3c989f3
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.12-daemon-util.patch
@@ -0,0 +1,37 @@
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index 6a47253..5d7c4cf 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -31,18 +31,24 @@ set -e
+
+ @SHELL_ENV_INIT@
+
+-readonly defaults_file="$SYSCONFDIR/default/ganeti"
++readonly defaults_file="$SYSCONFDIR/conf.d/ganeti"
+
+ # This is a list of all daemons and the order in which they're started. The
+ # order is important as there are dependencies between them. On shutdown,
+ # they're stopped in reverse order.
+-DAEMONS=(
+- ganeti-noded
+- ganeti-wconfd
+- ganeti-rapi
+- ganeti-luxid
+- ganeti-kvmd
+- )
++DAEMONS=( ganeti-noded )
++
++_is_master() {
++ [ -z "${ganeti_master}" ] && ganeti_master="$(gnt-cluster getmaster)"
++ [ -z "${local_hostname}" ] && local_hostname="$(hostname -f)"
++ [ "${ganeti_master}" = "${local_hostname}" ]
++}
++
++if _is_master; then
++ DAEMONS+=( ganeti-wconfd ganeti-rapi ganeti-luxid )
++fi
++
++DAEMONS+=( ganeti-kvmd )
+
+ # This is the list of daemons that are loaded on demand; they should only be
+ # stopped, not started.
diff --git a/app-emulation/ganeti/files/ganeti-2.12-qemu-enable-kvm.patch b/app-emulation/ganeti/files/ganeti-2.12-qemu-enable-kvm.patch
new file mode 100644
index 000000000000..b199ff09367c
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.12-qemu-enable-kvm.patch
@@ -0,0 +1,12 @@
+diff --git a/lib/hypervisor/hv_kvm/__init__.py b/lib/hypervisor/hv_kvm/__init__.py
+index d0c42c4..e6d3bcf 100644
+--- a/lib/hypervisor/hv_kvm/__init__.py
++++ b/lib/hypervisor/hv_kvm/__init__.py
+@@ -1061,6 +1061,7 @@ class KVMHypervisor(hv_base.BaseHypervisor):
+ pidfile = self._InstancePidFile(instance.name)
+ kvm = hvp[constants.HV_KVM_PATH]
+ kvm_cmd = [kvm]
++ kvm_cmd.extend(["-enable-kvm"])
+ # used just by the vnc server, if enabled
+ kvm_cmd.extend(["-name", instance.name])
+ kvm_cmd.extend(["-m", instance.beparams[constants.BE_MAXMEM]])
diff --git a/app-emulation/ganeti/files/ganeti-2.12-start-stop-daemon-args.patch b/app-emulation/ganeti/files/ganeti-2.12-start-stop-daemon-args.patch
new file mode 100644
index 000000000000..463ff26095a2
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.12-start-stop-daemon-args.patch
@@ -0,0 +1,39 @@
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index 6a47253..11eb9d1 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -294,10 +294,11 @@ start() {
+ @PKGLIBDIR@/ensure-dirs
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --start --quiet --oknodo \
++ start-stop-daemon --start --quiet \
+ --pidfile $pidfile \
+- --startas $daemonexec \
+- --chuid $usergroup \
++ --exec $daemonexec \
++ --user $usergroup \
++ --wait 300 \
+ -- $args "$@"
+ else
+ # TODO: Find a way to start daemon with a group, until then the group must
+@@ -323,7 +324,7 @@ stop() {
+ if use_systemctl; then
+ systemctl stop "${name}.service"
+ elif type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --stop --quiet --oknodo --retry 30 \
++ start-stop-daemon --stop --quiet --retry 30 \
+ --pidfile $pidfile
+ else
+ _ignore_error killproc -p $pidfile $name
+@@ -409,8 +410,8 @@ rotate_logs() {
+ local daemonexec=$(_daemon_executable $name)
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --stop --signal HUP --quiet \
+- --oknodo --pidfile $pidfile
++ start-stop-daemon --signal HUP --quiet \
++ --pidfile $pidfile
+ else
+ _ignore_error killproc \
+ -p $pidfile \
diff --git a/app-emulation/ganeti/files/ganeti-2.12-tests.patch b/app-emulation/ganeti/files/ganeti-2.12-tests.patch
new file mode 100644
index 000000000000..dcf9b5184a0b
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.12-tests.patch
@@ -0,0 +1,59 @@
+diff --git a/test/hs/Test/Ganeti/Runtime.hs b/test/hs/Test/Ganeti/Runtime.hs
+index b15aa36..a805869 100644
+--- a/test/hs/Test/Ganeti/Runtime.hs
++++ b/test/hs/Test/Ganeti/Runtime.hs
+@@ -126,10 +126,6 @@ case_UsersGroups = do
+ (length py_users) (length users)
+ assertEqual "Mismatch in number of returned users"
+ (length py_groups) (length groups)
+- mapM_ (uncurry (assertEqual "Different result for users")
+- ) $ zip users py_users
+- mapM_ (uncurry (assertEqual "Different result for groups")
+- ) $ zip groups py_groups
+
+ testSuite "Runtime"
+ [ 'case_LogFiles
+diff --git a/test/py/daemon-util_unittest.bash b/test/py/daemon-util_unittest.bash
+index edaeac5..1ee6eae 100755
+--- a/test/py/daemon-util_unittest.bash
++++ b/test/py/daemon-util_unittest.bash
+@@ -45,8 +45,8 @@ if ! grep -q '^ENABLE_MOND = ' lib/_constants.py; then
+ err "Please update $0, mond enable feature is missing"
+ fi
+
+-DAEMONS_LIST="noded wconfd rapi luxid kvmd"
+-STOPDAEMONS_LIST="kvmd luxid rapi wconfd noded"
++DAEMONS_LIST="noded wconfd kvmd"
++STOPDAEMONS_LIST="kvmd wconfd noded"
+
+ if grep -q '^ENABLE_CONFD = True' lib/_constants.py; then
+ DAEMONS_LIST="$DAEMONS_LIST confd"
+diff --git a/test/py/ganeti.utils.process_unittest.py b/test/py/ganeti.utils.process_unittest.py
+index 7d4cbb6..08752fe 100755
+--- a/test/py/ganeti.utils.process_unittest.py
++++ b/test/py/ganeti.utils.process_unittest.py
+@@ -274,7 +274,7 @@ class TestRunCmd(testutils.GanetiTestCase):
+ result = utils.RunCmd(["/bin/sh", "-c", cmd], timeout=0.2,
+ noclose_fds=[self.proc_ready_helper.write_fd],
+ postfork_fn=self.proc_ready_helper.Ready)
+- self.assertEqual(result.exit_code, 0)
++ self.assertEqual(result.exit_code, None)
+
+ def testTimeoutKill(self):
+ cmd = ["/bin/sh", "-c", "trap '' TERM; echo >&%d; read < %s" %
+@@ -289,15 +289,6 @@ class TestRunCmd(testutils.GanetiTestCase):
+ self.assert_(status < 0)
+ self.assertEqual(-status, signal.SIGKILL)
+
+- def testTimeoutOutputAfterTerm(self):
+- cmd = ("trap 'echo sigtermed; exit 1' TERM; echo >&%d; read < %s" %
+- (self.proc_ready_helper.write_fd, self.fifo_file))
+- result = utils.RunCmd(["/bin/sh", "-c", cmd], timeout=0.2,
+- noclose_fds=[self.proc_ready_helper.write_fd],
+- postfork_fn=self.proc_ready_helper.Ready)
+- self.assert_(result.failed)
+- self.assertEqual(result.stdout, "sigtermed\n")
+-
+ def testListRun(self):
+ """Test list runs"""
+ result = utils.RunCmd(["true"])
diff --git a/app-emulation/ganeti/files/ganeti-2.12.3-daemon-util.patch b/app-emulation/ganeti/files/ganeti-2.12.3-daemon-util.patch
new file mode 100644
index 000000000000..2f6bfa3208d1
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.12.3-daemon-util.patch
@@ -0,0 +1,37 @@
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index 6a47253..d7afd84 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -31,18 +31,24 @@ set -e
+
+ @SHELL_ENV_INIT@
+
+-readonly defaults_file="$SYSCONFDIR/default/ganeti"
++readonly defaults_file="$SYSCONFDIR/conf.d/ganeti"
+
+ # This is a list of all daemons and the order in which they're started. The
+ # order is important as there are dependencies between them. On shutdown,
+ # they're stopped in reverse order.
+-DAEMONS=(
+- ganeti-noded
+- ganeti-wconfd
+- ganeti-rapi
+- ganeti-luxid
+- ganeti-kvmd
+- )
++DAEMONS=( ganeti-noded )
++
++_is_master() {
++ [ -z "${GANETI_MASTER}" ] && GANETI_MASTER="$(gnt-cluster getmaster)"
++ [ -z "${LOCAL_HOSTNAME}" ] && LOCAL_HOSTNAME="$(hostname -f)"
++ [ "${GANETI_MASTER}" = "${LOCAL_HOSTNAME}" ]
++}
++
++if _is_master; then
++ DAEMONS+=( ganeti-wconfd ganeti-rapi ganeti-luxid )
++fi
++
++DAEMONS+=( ganeti-kvmd )
+
+ # This is the list of daemons that are loaded on demand; they should only be
+ # stopped, not started.
diff --git a/app-emulation/ganeti/files/ganeti-2.13-daemon-util.patch b/app-emulation/ganeti/files/ganeti-2.13-daemon-util.patch
new file mode 100644
index 000000000000..5d8dedfe89dd
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.13-daemon-util.patch
@@ -0,0 +1,46 @@
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index 7636fc9..e93370f 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -31,25 +31,28 @@ set -e
+
+ @SHELL_ENV_INIT@
+
+-readonly defaults_file="$SYSCONFDIR/default/ganeti"
+-
+-# This is a list of all daemons and the order in which they're started. The
+-# order is important as there are dependencies between them. On shutdown,
+-# they're stopped in reverse order.
+-DAEMONS=(
+- ganeti-noded
+- ganeti-confd
+- ganeti-wconfd
+- ganeti-rapi
+- ganeti-luxid
+- ganeti-kvmd
+- )
++readonly defaults_file="$SYSCONFDIR/conf.d/ganeti"
+
+ # This is the list of daemons that are loaded on demand; they should only be
+ # stopped, not started.
+ ON_DEMAND_DAEMONS=(
+ ganeti-metad
+ )
++DAEMONS=( ganeti-noded ganeti-confd )
++
++_is_master() {
++ [ -z "${GANETI_MASTER}" ] && GANETI_MASTER="$(gnt-cluster getmaster)"
++ [ -z "${LOCAL_HOSTNAME}" ] && LOCAL_HOSTNAME="$(hostname -f)"
++ [ "${GANETI_MASTER}" = "${LOCAL_HOSTNAME}" ]
++}
++
++if _is_master; then
++ DAEMONS+=( ganeti-wconfd ganeti-rapi ganeti-luxid )
++else
++ DAEMONS+=( ganeti-rapi )
++fi
++
++DAEMONS+=( ganeti-kvmd )
+
+ _mond_enabled() {
+ [[ "@CUSTOM_ENABLE_MOND@" == True ]]
diff --git a/app-emulation/ganeti/files/ganeti-2.13-disable-usersgroups-test.patch b/app-emulation/ganeti/files/ganeti-2.13-disable-usersgroups-test.patch
new file mode 100644
index 000000000000..6e81b515d830
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.13-disable-usersgroups-test.patch
@@ -0,0 +1,68 @@
+diff --git a/test/hs/Test/Ganeti/Runtime.hs b/test/hs/Test/Ganeti/Runtime.hs
+index b15aa36..7aa75ca 100644
+--- a/test/hs/Test/Ganeti/Runtime.hs
++++ b/test/hs/Test/Ganeti/Runtime.hs
+@@ -75,63 +75,7 @@ case_LogFiles = do
+ mapM_ (uncurry (assertEqual "Different result after encoding/decoding")
+ ) $ zip dfiles decoded
+
+--- | Tests the compatibility between Haskell and Python users.
+-case_UsersGroups :: Assertion
+-case_UsersGroups = do
+- -- note: we don't have here a programatic way to list all users, so
+- -- we harcode some parts of the two (hs/py) lists
+- let daemons = [minBound..maxBound]::[GanetiDaemon]
+- users = map daemonUser daemons
+- groups = map daemonGroup $
+- map DaemonGroup daemons ++ map ExtraGroup [minBound..maxBound]
+- py_stdout <-
+- runPython "from ganeti import constants\n\
+- \from ganeti import serializer\n\
+- \import sys\n\
+- \users = [constants.MASTERD_USER,\n\
+- \ constants.NODED_USER,\n\
+- \ constants.RAPI_USER,\n\
+- \ constants.CONFD_USER,\n\
+- \ constants.WCONFD_USER,\n\
+- \ constants.KVMD_USER,\n\
+- \ constants.LUXID_USER,\n\
+- \ constants.METAD_USER,\n\
+- \ constants.MOND_USER,\n\
+- \ ]\n\
+- \groups = [constants.MASTERD_GROUP,\n\
+- \ constants.NODED_GROUP,\n\
+- \ constants.RAPI_GROUP,\n\
+- \ constants.CONFD_GROUP,\n\
+- \ constants.WCONFD_GROUP,\n\
+- \ constants.KVMD_GROUP,\n\
+- \ constants.LUXID_GROUP,\n\
+- \ constants.METAD_GROUP,\n\
+- \ constants.MOND_GROUP,\n\
+- \ constants.DAEMONS_GROUP,\n\
+- \ constants.ADMIN_GROUP,\n\
+- \ ]\n\
+- \encoded = (users, groups)\n\
+- \print serializer.Dump(encoded)" ""
+- >>= checkPythonResult
+- let deserialised = J.decode py_stdout::J.Result ([String], [String])
+- (py_users, py_groups) <-
+- case deserialised of
+- J.Ok ops -> return ops
+- J.Error msg ->
+- assertFailure ("Unable to decode users/groups: " ++ msg)
+- -- this already raised an expection, but we need it for proper
+- -- types
+- >> fail "Unable to decode users/groups"
+- assertEqual "Mismatch in number of returned users"
+- (length py_users) (length users)
+- assertEqual "Mismatch in number of returned users"
+- (length py_groups) (length groups)
+- mapM_ (uncurry (assertEqual "Different result for users")
+- ) $ zip users py_users
+- mapM_ (uncurry (assertEqual "Different result for groups")
+- ) $ zip groups py_groups
+
+ testSuite "Runtime"
+ [ 'case_LogFiles
+- , 'case_UsersGroups
+ ]
diff --git a/app-emulation/ganeti/files/ganeti-2.13-process_unittest.patch b/app-emulation/ganeti/files/ganeti-2.13-process_unittest.patch
new file mode 100644
index 000000000000..4001ac5aa4de
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.13-process_unittest.patch
@@ -0,0 +1,21 @@
+diff --git a/test/py/ganeti.utils.process_unittest.py b/test/py/ganeti.utils.process_unittest.py
+index 2cfb841..a5876a5 100755
+--- a/test/py/ganeti.utils.process_unittest.py
++++ b/test/py/ganeti.utils.process_unittest.py
+@@ -284,7 +284,7 @@ class TestRunCmd(testutils.GanetiTestCase):
+ result = utils.RunCmd(["/bin/sh", "-c", cmd], timeout=0.2,
+ noclose_fds=[self.proc_ready_helper.write_fd],
+ postfork_fn=self.proc_ready_helper.Ready)
+- self.assertEqual(result.exit_code, 0)
++ self.assertEqual(result.exit_code, None)
+
+ def testTimeoutKill(self):
+ cmd = ["/bin/sh", "-c", "trap '' TERM; echo >&%d; read < %s" %
+@@ -306,7 +306,6 @@ class TestRunCmd(testutils.GanetiTestCase):
+ noclose_fds=[self.proc_ready_helper.write_fd],
+ postfork_fn=self.proc_ready_helper.Ready)
+ self.assert_(result.failed)
+- self.assertEqual(result.stdout, "sigtermed\n")
+
+ def testListRun(self):
+ """Test list runs"""
diff --git a/app-emulation/ganeti/files/ganeti-2.13-regex-pcre-builtin.patch b/app-emulation/ganeti/files/ganeti-2.13-regex-pcre-builtin.patch
new file mode 100644
index 000000000000..ced966fbe6e3
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.13-regex-pcre-builtin.patch
@@ -0,0 +1,13 @@
+diff --git a/configure.ac b/configure.ac
+index e014d7a..024e584 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -672,7 +672,7 @@ AC_GHC_PKG_REQUIRE(hinotify)
+ AC_GHC_PKG_REQUIRE(Crypto)
+ AC_GHC_PKG_REQUIRE(lifted-base)
+ AC_GHC_PKG_REQUIRE(lens)
+-AC_GHC_PKG_REQUIRE(regex-pcre)
++AC_GHC_PKG_REQUIRE(regex-pcre-builtin)
+
+ #extra modules for monitoring daemon functionality; also needed for tests
+ MONITORING_PKG=
diff --git a/app-emulation/ganeti/files/ganeti-2.2.initd b/app-emulation/ganeti/files/ganeti-2.2.initd
new file mode 100644
index 000000000000..a270ac831e93
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.2.initd
@@ -0,0 +1,113 @@
+#!/sbin/runscript
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+depend() {
+ need localmount logger
+ after bootmisc
+ use net
+}
+
+DAEMON_UTIL="/usr/lib/ganeti/daemon-util"
+
+check_config() {
+ if ! $DAEMON_UTIL check-config ; then
+ eend 0 "Incomplete configuration, will not run."
+ fi
+}
+
+check_exitcode() {
+ RC=${1}
+ if errmsg=$(${DAEMON_UTIL} check-exitcode ${RC}) ; then
+ eend 0 "${errmsg}"
+ else
+ eend 1 "${errmsg}"
+ fi
+}
+
+start_action() {
+ # called as start_action daemon-name
+ local daemon="${1}"
+ ebegin "Starting ${daemon}"
+ ${DAEMON_UTIL} start "${@}"
+ check_exitcode ${?}
+}
+
+stop_action() {
+ # called as stop_action daemon-name
+ local daemon="${1}"
+ ebegin "Stopping ${daemon}"
+ ${DAEMON_UTIL} stop "${@}"
+ check_exitcode ${?}
+}
+
+maybe_do() {
+ requested="${1}"; shift
+ action="${1}"; shift
+ target="${1}"
+ if [ -z "${requested}" -o "${requested}" = "${target}" ] ; then
+ ${action} "${@}"
+ fi
+}
+
+get_master_node() {
+ MASTER_NODE="$(gnt-cluster getmaster)"
+ NODE_HOSTNAME="$(hostname -f)"
+ if [ "$MASTER_NODE" == "$NODE_HOSTNAME" ] ; then
+ MASTER=1
+ else
+ MASTER=0
+ fi
+}
+
+start_all() {
+ check_config
+ get_master_node
+ for i in $($DAEMON_UTIL list-start-daemons); do \
+ GANETI_START_OPTS="${GANETI_OPTS}"
+ case "${i}" in
+ ganeti-masterd)
+ GANETI_OPTS="${GANETI_START_OPTS} ${GANETI_MASTERD_OPTS}"
+ ;;
+ ganeti-rapid)
+ GANETI_OPTS="${GANETI_START_OPTS} ${GANETI_RAPI_OPTS}"
+ ;;
+ ganeti-noded)
+ GANETI_OPTS="${GANETI_START_OPTS} ${GANETI_NODED_OPTS}"
+ ;;
+ ganeti-confd)
+ GANETI_OPTS="${GANETI_START_OPTS} ${GANETI_CONFD_OPTS}"
+ ;;
+ esac
+ # Don't start if not master
+ if [ $MASTER = 0 -a $i = "ganeti-masterd" ] ; then
+ continue
+ elif [ $MASTER = 0 -a $i = "ganeti-rapi" ] ; then
+ continue
+ else
+ maybe_do "${1}" start_action ${i} ${GANETI_OPTS}
+ fi
+ done
+}
+
+stop_all() {
+ get_master_node
+ for i in $($DAEMON_UTIL list-stop-daemons) ; do \
+ if [ $MASTER = 0 -a $i = "ganeti-masterd" ] ; then
+ continue
+ elif [ $MASTER = 0 -a $i = "ganeti-rapi" ] ; then
+ continue
+ else
+ maybe_do "${1}" stop_action ${i} ${GANETI_OPTS}
+ fi
+ done
+}
+
+start() {
+ start_all
+}
+
+stop() {
+ stop_all
+}
diff --git a/app-emulation/ganeti/files/ganeti-2.6-add-pgrep.patch b/app-emulation/ganeti/files/ganeti-2.6-add-pgrep.patch
new file mode 100644
index 000000000000..c69128229a66
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.6-add-pgrep.patch
@@ -0,0 +1,38 @@
+From 49767a66e27a1cb61abb8f812b2e61eba03a9594 Mon Sep 17 00:00:00 2001
+From: Lance Albertson <lance@osuosl.org>
+Date: Wed, 25 Jul 2012 16:21:21 -0700
+Subject: [PATCH 2/2] Check if process is already running and skip if so
+
+Gentoo uses a modified version of start-stop-daemon which returns an error if it
+sees another process running with the same name. This happens during cluster
+initialization since ganeti-noded gets fired off first.
+---
+ daemons/daemon-util.in | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index c19daa7..7be9d8b 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -222,11 +222,13 @@ start() {
+ @PKGLIBDIR@/ensure-dirs
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --start --quiet \
+- --pidfile $pidfile \
+- --exec $daemonexec \
+- --user $usergroup \
+- -- $args "$@"
++ if ! ret=$(/usr/bin/pgrep $name) ; then
++ start-stop-daemon --start --quiet \
++ --pidfile $pidfile \
++ --exec $daemonexec \
++ --user $usergroup \
++ -- $args "$@"
++ fi
+ else
+ # TODO: Find a way to start daemon with a group, until then the group must
+ # be removed
+--
+1.7.9.5
+
diff --git a/app-emulation/ganeti/files/ganeti-2.6-fix-args.patch b/app-emulation/ganeti/files/ganeti-2.6-fix-args.patch
new file mode 100644
index 000000000000..6fb5bd0df62f
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.6-fix-args.patch
@@ -0,0 +1,45 @@
+From 0491397d7648fd70ad0a6cef9e8626b9c2a968e9 Mon Sep 17 00:00:00 2001
+From: Lance Albertson <ramereth@gmail.com>
+Date: Mon, 8 Aug 2011 23:34:33 -0700
+Subject: [PATCH 1/2] Remove/fix deprecated start-stop-daemon functions
+
+daemon-util uses the deprecated functions --startas, --chuid and, most
+importantly, --oknodo. The last one causes start-stop-daemon to exit with a
+non-zero status, which makes openrc think it crashed (when in reality it just
+shut down properly) [1].
+
+[1] https://bugs.gentoo.org/show_bug.cgi?id=377905
+---
+ daemons/daemon-util.in | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index b754e7f..c19daa7 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -222,10 +222,10 @@ start() {
+ @PKGLIBDIR@/ensure-dirs
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --start --quiet --oknodo \
++ start-stop-daemon --start --quiet \
+ --pidfile $pidfile \
+- --startas $daemonexec \
+- --chuid $usergroup \
++ --exec $daemonexec \
++ --user $usergroup \
+ -- $args "$@"
+ else
+ # TODO: Find a way to start daemon with a group, until then the group must
+@@ -248,7 +248,7 @@ stop() {
+ local pidfile=$(_daemon_pidfile $name)
+
+ if type -p start-stop-daemon >/dev/null; then
+- start-stop-daemon --stop --quiet --oknodo --retry 30 \
++ start-stop-daemon --stop --quiet --retry 30 \
+ --pidfile $pidfile
+ else
+ _ignore_error killproc -p $pidfile $name
+--
+1.7.9.5
+
diff --git a/app-emulation/ganeti/files/ganeti-2.7-fix-tests.patch b/app-emulation/ganeti/files/ganeti-2.7-fix-tests.patch
new file mode 100644
index 000000000000..b3b5ad17f2b1
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.7-fix-tests.patch
@@ -0,0 +1,30 @@
+diff --git a/test/py/ganeti.hooks_unittest.py b/test/py/ganeti.hooks_unittest.py
+index 30e00d8..50f91fc 100755
+--- a/test/py/ganeti.hooks_unittest.py
++++ b/test/py/ganeti.hooks_unittest.py
+@@ -192,7 +192,7 @@ class TestHooksRunner(unittest.TestCase):
+ os.symlink("/usr/bin/env", fname)
+ self.torm.append((fname, False))
+ env_snt = {"PHASE": phase}
+- env_exp = "PHASE=%s" % phase
++ env_exp = "LD_PRELOAD=libsandbox.so\\nPHASE=%s" % phase
+ self.failUnlessEqual(self.hr.RunHooks(self.hpath, phase, env_snt),
+ [(self._rname(fname), HKR_SUCCESS, env_exp)])
+
+diff --git a/test/py/ganeti.utils.process_unittest.py b/test/py/ganeti.utils.process_unittest.py
+index 2e36cfa..e0392b2 100755
+--- a/test/py/ganeti.utils.process_unittest.py
++++ b/test/py/ganeti.utils.process_unittest.py
+@@ -341,10 +341,10 @@ class TestRunCmd(testutils.GanetiTestCase):
+ def testResetEnv(self):
+ """Test environment reset functionality"""
+ self.failUnlessEqual(utils.RunCmd(["env"], reset_env=True).stdout.strip(),
+- "")
++ "LD_PRELOAD=libsandbox.so")
+ self.failUnlessEqual(utils.RunCmd(["env"], reset_env=True,
+ env={"FOO": "bar",}).stdout.strip(),
+- "FOO=bar")
++ "LD_PRELOAD=libsandbox.so\nFOO=bar")
+
+ def testNoFork(self):
+ """Test that nofork raise an error"""
diff --git a/app-emulation/ganeti/files/ganeti-2.9-disable-root-tests.patch b/app-emulation/ganeti/files/ganeti-2.9-disable-root-tests.patch
new file mode 100644
index 000000000000..932258b93a3d
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.9-disable-root-tests.patch
@@ -0,0 +1,18 @@
+--- a/Makefile.am 2013-11-13 01:48:34.733493100 +0000
++++ b/Makefile.am 2013-11-13 01:48:46.623657315 +0000
+@@ -1245,7 +1245,6 @@
+ test/py/cfgupgrade_unittest.py \
+ test/py/docs_unittest.py \
+ test/py/ganeti.asyncnotifier_unittest.py \
+- test/py/ganeti.backend_unittest-runasroot.py \
+ test/py/ganeti.backend_unittest.py \
+ test/py/ganeti.bootstrap_unittest.py \
+ test/py/ganeti.cli_unittest.py \
+@@ -1308,7 +1307,6 @@
+ test/py/ganeti.utils.algo_unittest.py \
+ test/py/ganeti.utils.filelock_unittest.py \
+ test/py/ganeti.utils.hash_unittest.py \
+- test/py/ganeti.utils.io_unittest-runasroot.py \
+ test/py/ganeti.utils.io_unittest.py \
+ test/py/ganeti.utils.log_unittest.py \
+ test/py/ganeti.utils.lvm_unittest.py \
diff --git a/app-emulation/ganeti/files/ganeti-2.9-regex-builtin.patch b/app-emulation/ganeti/files/ganeti-2.9-regex-builtin.patch
new file mode 100644
index 000000000000..f9aba9d4e2eb
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.9-regex-builtin.patch
@@ -0,0 +1,22 @@
+--- configure.ac.orig 2013-11-13 01:56:03.819694900 +0000
++++ configure.ac 2013-11-13 01:56:34.350116602 +0000
+@@ -493,8 +493,8 @@
+ has_confd=False
+ if test "$enable_confd" != no; then
+ CONFD_PKG=
+- AC_GHC_PKG_CHECK([regex-pcre], [HS_REGEX_PCRE=],
+- [CONFD_PKG="$CONFD_PKG regex-pcre"])
++ AC_GHC_PKG_CHECK([regex-pcre-builtin], [HS_REGEX_PCRE=],
++ [CONFD_PKG="$CONFD_PKG regex-pcre-builtin"])
+ AC_GHC_PKG_CHECK([Crypto], [], [CONFD_PKG="$CONFD_PKG Crypto"])
+ AC_GHC_PKG_CHECK([text], [], [CONFD_PKG="$CONFD_PKG text"])
+ AC_GHC_PKG_CHECK([hinotify], [], [CONFD_PKG="$CONFD_PKG hinotify"])
+@@ -578,7 +578,7 @@
+ AC_GHC_PKG_CHECK([vector], [], [HS_NODEV=1])
+ AC_GHC_PKG_CHECK([process], [], [HS_NODEV=1])
+ AC_GHC_PKG_CHECK([snap-server], [], [HS_NODEV=1])
+-AC_GHC_PKG_CHECK([regex-pcre], [], [HS_NODEV=1])
++AC_GHC_PKG_CHECK([regex-pcre-builtin], [], [HS_NODEV=1])
+ AC_GHC_PKG_CHECK([Crypto], [], [HS_NODEV=1])
+ AC_GHC_PKG_CHECK([text], [], [HS_NODEV=1])
+ AC_GHC_PKG_CHECK([hinotify], [], [HS_NODEV=1])
diff --git a/app-emulation/ganeti/files/ganeti-2.9-skip-cli-test.patch b/app-emulation/ganeti/files/ganeti-2.9-skip-cli-test.patch
new file mode 100644
index 000000000000..7e1badc96fc0
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-2.9-skip-cli-test.patch
@@ -0,0 +1,18 @@
+--- Makefile.am.orig 2013-11-13 02:19:49.198992622 +0000
++++ Makefile.am 2013-11-13 02:20:12.709305182 +0000
+@@ -1332,7 +1332,6 @@
+ test/py/daemon-util_unittest.bash \
+ test/py/ganeti-cleaner_unittest.bash \
+ test/py/import-export_unittest.bash \
+- test/py/cli-test.bash \
+ test/py/bash_completion.bash
+
+ if PY_UNIT
+@@ -1397,7 +1396,6 @@
+ test/py/daemon-util_unittest.bash \
+ test/py/ganeti-cleaner_unittest.bash \
+ test/py/import-export_unittest.bash \
+- test/py/cli-test.bash \
+ test/py/bash_completion.bash \
+ test/hs/offline-test.sh \
+ test/hs/cli-tests-defs.sh \
diff --git a/app-emulation/ganeti/files/ganeti-fix-start-stop.patch b/app-emulation/ganeti/files/ganeti-fix-start-stop.patch
new file mode 100644
index 000000000000..e53161a00b22
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-fix-start-stop.patch
@@ -0,0 +1,47 @@
+From 9f8f304c983635e0ead6adadd1c4a62be6e92e01 Mon Sep 17 00:00:00 2001
+From: Lance Albertson <ramereth@gmail.com>
+Date: Mon, 8 Aug 2011 23:34:33 -0700
+Subject: [PATCH] Remove/fix deprecated start-stop-daemon functions
+
+daemon-util uses the deprecated functions --startas, --chuid and, most
+importantly, --oknodo. The last one causes start-stop-daemon to exit with a
+non-zero status, which makes openrc think it crashed (when in reality it just
+shut down properly) [1].
+
+[1] https://bugs.gentoo.org/show_bug.cgi?id=377905
+
+Signed-off-by: Lance Albertson <ramereth@gmail.com>
+---
+ daemons/daemon-util.in | 8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
+index 819fd6b..00fe1b6 100644
+--- a/daemons/daemon-util.in
++++ b/daemons/daemon-util.in
+@@ -172,10 +172,10 @@ start() {
+
+ @PKGLIBDIR@/ensure-dirs
+
+- start-stop-daemon --start --quiet --oknodo \
++ start-stop-daemon --start --quiet \
+ --pidfile $(_daemon_pidfile $name) \
+- --startas $(_daemon_executable $name) \
+- --chuid $(_daemon_usergroup $plain_name) \
++ --exec $(_daemon_executable $name) \
++ --user $(_daemon_usergroup $plain_name) \
+ -- $args "$@"
+ }
+
+@@ -188,7 +188,7 @@ stop() {
+
+ local name="$1"; shift
+
+- start-stop-daemon --stop --quiet --oknodo --retry 30 \
++ start-stop-daemon --stop --quiet --retry 30 \
+ --pidfile $(_daemon_pidfile $name)
+ }
+
+--
+1.7.4.1
+
diff --git a/app-emulation/ganeti/files/ganeti-kvm-poweroff.confd b/app-emulation/ganeti/files/ganeti-kvm-poweroff.confd
new file mode 100644
index 000000000000..6ab21c3709a5
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-kvm-poweroff.confd
@@ -0,0 +1,4 @@
+# /etc/conf.d/ganeti-kvm-poweroff: config file for /etc/init.d/ganeti-kvm-poweroff
+
+# Maximum time in seconds to wait until KVM VMs shutdown before giving up.
+# GANETI_KVM_TIMEOUT="60"
diff --git a/app-emulation/ganeti/files/ganeti-kvm-poweroff.initd b/app-emulation/ganeti/files/ganeti-kvm-poweroff.initd
new file mode 100644
index 000000000000..967f0acff783
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-kvm-poweroff.initd
@@ -0,0 +1,58 @@
+#!/sbin/runscript
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+depend() {
+ after ganeti
+ after bootmisc
+}
+
+CONTROL_PATH="/var/run/ganeti/kvm-hypervisor/ctrl"
+GANETI_KVM_TIMEOUT=${GANETI_KVM_TIMEOUT:-60}
+
+start() {
+ return 0
+}
+
+# Taken from doc/examples/ganeti-kvm-poweroff.initd.in in ganeti package
+stop() {
+ ebegin "Stopping Ganeti KVM VMs"
+ # shutdown VMs and remove sockets of those not running
+ for vm_monitor in $(find $CONTROL_PATH -type s -name '*.monitor') ; do
+ if ! echo system_powerdown | \
+ socat -U UNIX:$vm_monitor STDIO > /dev/null 2>&1; then
+ # remove disconnected socket
+ rm -f $vm_monitor
+ fi
+ done
+
+ einfo " Waiting for VMs to poweroff"
+ waiting=true
+ remaining=$GANETI_KVM_TIMEOUT
+ while $waiting && [ $remaining -ne 0 ]; do
+ if [ -z "$(find $CONTROL_PATH -type s -name '*.monitor')" ] ; then
+ break
+ fi
+
+ echo -n "."
+ for vm_monitor in $(find $CONTROL_PATH -type s -name '*.monitor') ; do
+ if ! echo | socat -U UNIX:$vm_monitor STDIO > /dev/null 2>&1; then
+ rm -rf $vm_monitor
+ fi
+ done
+
+ sleep 5
+ let remaining-=5 1
+ done
+
+ if [ -n "$(find $CONTROL_PATH -type s -name '*.monitor')" ] ; then
+ eerror " Some ganeti VMs did not shutdown"
+ fi
+ echo
+ eend $?
+}
+
+restart() {
+ eerror "restart not supported"
+}
diff --git a/app-emulation/ganeti/files/ganeti-lockdir.patch b/app-emulation/ganeti/files/ganeti-lockdir.patch
new file mode 100644
index 000000000000..dad084fa4306
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti-lockdir.patch
@@ -0,0 +1,15 @@
+diff --git a/lib/pathutils.py b/lib/pathutils.py
+index db860ff..53a9cc4 100644
+--- a/lib/pathutils.py
++++ b/lib/pathutils.py
+@@ -63,9 +63,9 @@ ETC_HOSTS = vcluster.ETC_HOSTS
+
+ # Top-level paths
+ DATA_DIR = LOCALSTATEDIR + "/lib/ganeti"
+-LOCK_DIR = LOCALSTATEDIR + "/lock"
++LOCK_DIR = "/run/lock"
+ LOG_DIR = LOCALSTATEDIR + "/log/ganeti"
+ RUN_DIR = "/run/ganeti"
+
+ #: Script to configure master IP address
+ DEFAULT_MASTER_SETUP_SCRIPT = TOOLSDIR + "/master-ip-setup"
diff --git a/app-emulation/ganeti/files/ganeti.confd b/app-emulation/ganeti/files/ganeti.confd
new file mode 100644
index 000000000000..3b71d7ee44a8
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti.confd
@@ -0,0 +1,16 @@
+# /etc/conf.d/ganeti: config file for /etc/init.d/ganeti
+
+# Extra options to pass to all of the ganeti daemons
+# GANETI_OPTS="-d"
+
+# Options to pass to ganeti-masterd
+# GANETI_MASTERD_OPTS=""
+
+# Options to pass to ganeti-rapi
+# GANETI_RAPI_OPTS=""
+
+# Options to pass to ganeti-noded
+# GANETI_NODED_OPTS=""
+
+# Options to pass to ganeti-confd
+# GANETI_CONFD_OPTS=""
diff --git a/app-emulation/ganeti/files/ganeti.confd-r2 b/app-emulation/ganeti/files/ganeti.confd-r2
new file mode 100644
index 000000000000..0f2e69f3d5ea
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti.confd-r2
@@ -0,0 +1,19 @@
+# /etc/conf.d/ganeti: config file for /etc/init.d/ganeti
+
+# Extra options to pass to all of the ganeti daemons
+# GANETI_OPTS="-d"
+
+# Options to pass to ganeti-masterd
+# GANETI_MASTERD_OPTS=""
+
+# Options to pass to ganeti-rapi
+# GANETI_RAPI_OPTS=""
+
+# Options to pass to ganeti-noded
+# GANETI_NODED_OPTS=""
+
+# Options to pass to ganeti-confd
+# GANETI_CONFD_OPTS=""
+
+# Options to pass to ganeti-luxid
+# GANETI_LUXID_OPTS=""
diff --git a/app-emulation/ganeti/files/ganeti.initd b/app-emulation/ganeti/files/ganeti.initd
new file mode 100644
index 000000000000..8d31f1698490
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti.initd
@@ -0,0 +1,57 @@
+#!/sbin/runscript
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+depend() {
+ need localmount xend drbd
+ before ganeti-kvm-poweroff
+ after bootmisc nfsmount
+}
+
+checkconfig() {
+ for fname in /var/lib/ganeti/ssconf_node_pass /var/lib/ganeti/server.pem
+ do
+ if [[ ! -f "$fname" ]]
+ then
+ eerror "Config file $fname not found, will not run."
+ return 1
+ fi
+ done
+
+ return 0
+}
+
+start() {
+ checkconfig || return 1
+
+ ebegin "Starting ganeti-master"
+ /usr/sbin/ganeti-master start
+ ret=$?
+ eend ${ret}
+ [[ "${ret}" != 0 ]] && return 1
+
+ ebegin "Starting ganeti-noded"
+ start-stop-daemon --start --quiet --exec /usr/sbin/ganeti-noded
+ ret=$?
+ eend ${ret}
+ [[ "${ret}" != 0 ]] && return 1
+
+ return 0
+}
+
+stop() {
+ ebegin "Stopping ganeti-noded"
+ start-stop-daemon --stop --quiet --name ganeti-noded
+ ret=$?
+ eend ${ret}
+ [[ "${ret}" != 0 ]] && return 1
+
+ ebegin "Stopping ganeti-master"
+ /usr/sbin/ganeti-master start
+ ret=$?
+ eend ${ret}
+ [[ "${ret}" != 0 ]] && return 1
+
+ return 0
+}
diff --git a/app-emulation/ganeti/files/ganeti.initd-r3 b/app-emulation/ganeti/files/ganeti.initd-r3
new file mode 100644
index 000000000000..d425fd0dccc6
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti.initd-r3
@@ -0,0 +1,83 @@
+#!/sbin/runscript
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+depend() {
+ need localmount logger
+ after bootmisc sshd
+ use net
+}
+
+DAEMON_UTIL="/usr/lib/ganeti/daemon-util"
+
+is_master() {
+ [ -z "${ganeti_master}" ] && ganeti_master="$(gnt-cluster getmaster)"
+ [ -z "${local_hostname}" ] && local_hostname="$(hostname -f)"
+ [ "${ganeti_master}" = "${local_hostname}" ]
+}
+
+start() {
+ if ! [ -e ${DAEMON_UTIL} ]; then
+ eerror "Could not find daemon utility at ${DAEMON_UTIL}"
+ return 1
+ elif ! ${DAEMON_UTIL} check-config ; then
+ eerror "Incomplete configuration, will not run."
+ return 1
+ fi
+
+ local daemon retval=0 optsvar started_daemons daemon_opts
+
+ for daemon in $(${DAEMON_UTIL} list-start-daemons); do
+ optsvar="${daemon//-/_}"
+
+ case "${daemon#ganeti-}" in
+ masterd|rapi|luxid) is_master || continue;;
+ esac
+
+ eval daemon_opts=\"\$\{${optsvar^^*}_OPTS\}\"
+
+ ebegin "Starting ${daemon}"
+ eindent
+ ${DAEMON_UTIL} start ${daemon} ${GANETI_OPTS} ${daemon_opts} || retval=${?}
+
+ if [ ${retval} != 0 ] && [ -n "${started_daemons}" ]; then
+ case ${daemon} in
+ *-kvmd) retval=0; ewarn "Failed to start kvmd, continuing anyway";;
+ *)
+ eerror "Stopping already started daemons"
+ eindent
+ eend ${code} "$(${DAEMON_UTIL} check-exitcode ${code})"
+
+ for daemon in ${started_daemons}; do
+ ebegin "Stopping ${daemon}"
+ ${DAEMON_UTIL} stop ${daemon} ${GANETI_OPTS}
+ eend ${?}
+ done
+ eoutdent; eoutdent
+ return ${retval}
+ ;;
+ esac
+ fi
+ eoutdent
+ started_daemons="${started_daemons} ${daemon}"
+ done
+}
+
+stop() {
+ if ! [ -e ${DAEMON_UTIL} ]; then
+ eerror "Could not find daemon utility at ${DAEMON_UTIL}"
+ return 1
+ fi
+
+ local daemon
+
+ for daemon in $(${DAEMON_UTIL} list-stop-daemons) ; do \
+ case "${daemon#ganeti-}" in
+ masterd|rapi|luxid) is_master || continue;;
+ esac
+ ${DAEMON_UTIL} stop ${daemon} ${GANETI_OPTS}
+ done
+}
+
+# vim:ft=gentoo-init-d:ts=4:sts=4:sw=4:noet:
diff --git a/app-emulation/ganeti/files/ganeti2.initd b/app-emulation/ganeti/files/ganeti2.initd
new file mode 100644
index 000000000000..74a748a73e38
--- /dev/null
+++ b/app-emulation/ganeti/files/ganeti2.initd
@@ -0,0 +1,55 @@
+#!/sbin/runscript
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+depend() {
+ need localmount drbd
+ after bootmisc
+}
+
+checkconfig() {
+ for fname in /var/lib/ganeti/server.pem
+ do
+ if [[ ! -f "$fname" ]]
+ then
+ eerror "Config file $fname not found, will not run."
+ return 1
+ fi
+ done
+
+ return 0
+}
+
+start_action() {
+ # called as start_action daemon pidfile
+ local daemon="${1}"; shift
+ local pidfile="${1}"; shift
+ ebegin "Starting ${daemon}"
+ start-stop-daemon --start --quiet --exec "${daemon}" --pidfile "${pidfile}" \
+ -- "${@}"
+ eend ${?}
+}
+
+stop_action() {
+ # called as stop_action daemon pidfile
+ ebegin "Stopping ${1}"
+ start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile "${2}"
+ eend ${?}
+}
+
+
+start() {
+ checkconfig || return 1
+ start_action /usr/sbin/ganeti-noded /var/run/ganeti/ganeti-noded.pid
+ start_action /usr/sbin/ganeti-masterd /var/run/ganeti/ganeti-masterd.pid
+ start_action /usr/sbin/ganeti-rapi /var/run/ganeti/ganeti-rapi.pid
+ return 0
+}
+
+stop() {
+ stop_action /usr/sbin/ganeti-rapi /var/run/ganeti/ganeti-rapi.pid
+ stop_action /usr/sbin/ganeti-masterd /var/run/ganeti/ganeti-masterd.pid
+ stop_action /usr/sbin/ganeti-noded /var/run/ganeti/ganeti-noded.pid
+ return 0
+}
diff --git a/app-emulation/ganeti/ganeti-2.10.5-r4.ebuild b/app-emulation/ganeti/ganeti-2.10.5-r4.ebuild
new file mode 100644
index 000000000000..c166144f5b50
--- /dev/null
+++ b/app-emulation/ganeti/ganeti-2.10.5-r4.ebuild
@@ -0,0 +1,174 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=(python2_7)
+use test && PYTHON_REQ_USE="ipv6"
+
+inherit eutils confutils autotools bash-completion-r1 python-single-r1 versionator
+
+MY_PV="${PV/_rc/~rc}"
+#MY_PV="${PV/_beta/~beta}"
+MY_P="${PN}-${MY_PV}"
+SERIES="$(get_version_component_range 1-2)"
+
+if [[ ${PV} == "9999" ]] ; then
+ EGIT_REPO_URI="git://git.ganeti.org/ganeti.git"
+ inherit git-2
+ KEYWORDS=""
+ # you will need to pull in the haskell overlay for pandoc
+ GIT_DEPEND="app-text/pandoc
+ dev-python/docutils
+ dev-python/sphinx
+ media-libs/gd[fontconfig,jpeg,png,truetype]
+ media-gfx/graphviz
+ media-fonts/urw-fonts"
+else
+ SRC_URI="http://downloads.ganeti.org/releases/${SERIES}/${P}.tar.gz"
+ KEYWORDS="~amd64 ~x86"
+fi
+
+DESCRIPTION="Ganeti is a virtual server management software tool"
+HOMEPAGE="http://code.google.com/p/ganeti/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="kvm xen lxc drbd htools syslog ipv6 haskell-daemons rbd test"
+REQUIRED_USE="|| ( kvm xen lxc )"
+
+HASKELL_DEPS=">=dev-lang/ghc-6.12:0=
+ dev-haskell/json:0=
+ dev-haskell/curl:0=
+ dev-haskell/network:0=
+ dev-haskell/parallel:3=
+ dev-haskell/hslogger:0=
+ dev-haskell/utf8-string:0=
+ dev-haskell/attoparsec:0=
+ dev-haskell/crypto:0="
+
+DEPEND="xen? ( >=app-emulation/xen-3.0 )
+ kvm? ( app-emulation/qemu )
+ lxc? ( app-emulation/lxc )
+ drbd? ( <sys-cluster/drbd-8.5 )
+ rbd? ( sys-cluster/ceph )
+ ipv6? ( net-misc/ndisc6 )
+ haskell-daemons? (
+ ${HASKELL_DEPS}
+ dev-haskell/text:0=
+ dev-haskell/hinotify:0=
+ dev-haskell/regex-pcre-builtin:0=
+ dev-haskell/vector:0=
+ )
+ dev-libs/openssl:0
+ dev-python/paramiko[${PYTHON_USEDEP}]
+ dev-python/pyopenssl[${PYTHON_USEDEP}]
+ dev-python/pyparsing[${PYTHON_USEDEP}]
+ dev-python/pycurl[${PYTHON_USEDEP}]
+ dev-python/pyinotify[${PYTHON_USEDEP}]
+ dev-python/simplejson[${PYTHON_USEDEP}]
+ dev-python/ipaddr[${PYTHON_USEDEP}]
+ dev-python/bitarray[${PYTHON_USEDEP}]
+ net-analyzer/arping
+ net-analyzer/fping
+ net-misc/bridge-utils
+ net-misc/curl[ssl]
+ net-misc/openssh
+ net-misc/socat
+ sys-apps/iproute2
+ sys-fs/lvm2
+ >=sys-apps/baselayout-2.0
+ ${PYTHON_DEPS}
+ ${GIT_DEPEND}"
+RDEPEND="${DEPEND}
+ !app-emulation/ganeti-htools"
+DEPEND+="${HASKELL_DEPS}
+ sys-devel/m4
+ test? (
+ dev-python/mock
+ dev-python/pyyaml
+ dev-haskell/test-framework:0=
+ dev-haskell/test-framework-hunit:0=
+ dev-haskell/test-framework-quickcheck2:0=
+ dev-haskell/temporary:0=
+ sys-apps/fakeroot
+ )"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-2.6-fix-args.patch"
+ "${FILESDIR}/${PN}-2.6-add-pgrep.patch"
+ "${FILESDIR}/${PN}-2.7-fix-tests.patch"
+ "${FILESDIR}/${PN}-2.9-disable-root-tests.patch"
+ "${FILESDIR}/${PN}-2.9-regex-builtin.patch"
+ "${FILESDIR}/${PN}-2.9-skip-cli-test.patch"
+ "${FILESDIR}/${PN}-2.10-rundir.patch"
+ "${FILESDIR}/${PN}-lockdir.patch"
+)
+
+S="${WORKDIR}/${MY_P}"
+
+pkg_setup () {
+ confutils_use_depend_all haskell-daemons htools
+ python-single-r1_pkg_setup
+}
+
+src_prepare() {
+ epatch "${PATCHES[@]}"
+ [[ ${PV} == "9999" ]] && ./autogen.sh
+ rm autotools/missing
+ eautoreconf
+}
+
+src_configure () {
+ econf --localstatedir=/var \
+ --sharedstatedir=/var \
+ --disable-symlinks \
+ --docdir=/usr/share/doc/${P} \
+ --with-ssh-initscript=/etc/init.d/sshd \
+ --with-export-dir=/var/lib/ganeti-storage/export \
+ --with-os-search-path=/usr/share/${PN}/os \
+ $(use_enable syslog) \
+ $(usex kvm '--with-kvm-path=' '' '/usr/bin/qemu-kvm' '') \
+ $(usex haskell-daemons "--enable-confd=haskell" '' '' '')
+}
+
+src_install () {
+ emake V=1 DESTDIR="${D}" install || die "emake install failed"
+
+ newinitd "${FILESDIR}"/ganeti.initd-r3 ${PN}
+ newconfd "${FILESDIR}"/ganeti.confd-r2 ${PN}
+
+ use kvm && newinitd "${FILESDIR}"/ganeti-kvm-poweroff.initd ganeti-kvm-poweroff
+ use kvm && newconfd "${FILESDIR}"/ganeti-kvm-poweroff.confd ganeti-kvm-poweroff
+ newbashcomp doc/examples/bash_completion ganeti
+ dodoc INSTALL UPGRADE NEWS README doc/*.rst
+ dohtml -r doc/html/*
+ rm -rf "${D}"/{usr/share/doc/${PN},run}
+
+ docinto examples
+ dodoc doc/examples/{ganeti.cron,gnt-config-backup} doc/examples/*.ocf
+
+ docinto examples/hooks
+ dodoc doc/examples/hooks/{ipsec,ethers}
+
+ insinto /etc/cron.d
+ newins doc/examples/ganeti.cron ${PN}
+
+ insinto /etc/logrotate.d
+ newins doc/examples/ganeti.logrotate ${PN}
+
+ python_fix_shebang "${D}"/usr/"$(get_libdir)"/${PN}/${SERIES}
+
+ keepdir /var/{lib,log}/${PN}/
+ keepdir /usr/share/${PN}/${SERIES}/os/
+ keepdir /var/lib/ganeti-storage/{export,file,shared}/
+
+ dosym ${SERIES} "/usr/share/${PN}/default"
+ dosym ${SERIES} "/usr/$(get_libdir)/${PN}/default"
+
+ python_fix_shebang "${ED}"
+}
+
+src_test () {
+ emake check || die "emake check failed"
+}
diff --git a/app-emulation/ganeti/ganeti-2.11.6-r2.ebuild b/app-emulation/ganeti/ganeti-2.11.6-r2.ebuild
new file mode 100644
index 000000000000..87527cdf9302
--- /dev/null
+++ b/app-emulation/ganeti/ganeti-2.11.6-r2.ebuild
@@ -0,0 +1,220 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=(python2_7)
+use test && PYTHON_REQ_USE="ipv6"
+
+inherit eutils confutils autotools bash-completion-r1 python-single-r1 versionator pax-utils
+
+MY_PV="${PV/_rc/~rc}"
+#MY_PV="${PV/_beta/~beta}"
+MY_P="${PN}-${MY_PV}"
+SERIES="$(get_version_component_range 1-2)"
+
+if [[ ${PV} == "9999" ]] ; then
+ EGIT_REPO_URI="git://git.ganeti.org/ganeti.git"
+ inherit git-2
+ KEYWORDS=""
+ # you will need to pull in the haskell overlay for pandoc
+ GIT_DEPEND="app-text/pandoc
+ dev-python/docutils
+ dev-python/sphinx
+ media-libs/gd[fontconfig,jpeg,png,truetype]
+ media-gfx/graphviz
+ media-fonts/urw-fonts"
+else
+ SRC_URI="http://downloads.ganeti.org/releases/${SERIES}/${P}.tar.gz"
+ KEYWORDS="~amd64 ~x86"
+fi
+
+DESCRIPTION="Ganeti is a virtual server management software tool"
+HOMEPAGE="http://code.google.com/p/ganeti/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="drbd haskell-daemons htools ipv6 kvm lxc monitoring multiple-users rbd syslog test xen"
+REQUIRED_USE="|| ( kvm xen lxc )"
+
+USER_PREFIX="${GANETI_USER_PREFIX:-"gnt-"}"
+GROUP_PREFIX="${GANETI_GROUP_PREFIX:-"${USER_PREFIX}"}"
+
+HASKELL_DEPS=">=dev-lang/ghc-6.12:0=
+ dev-haskell/json:0=
+ dev-haskell/curl:0=
+ dev-haskell/network:0=
+ dev-haskell/parallel:3=
+ dev-haskell/hslogger:0=
+ dev-haskell/utf8-string:0=
+ dev-haskell/attoparsec:0=
+ dev-haskell/crypto:0=
+ dev-haskell/vector:0=
+ dev-haskell/hinotify:0=
+ dev-haskell/regex-pcre-builtin:0=
+ dev-haskell/zlib:0=
+ dev-haskell/base64-bytestring:0=
+ monitoring? ( dev-haskell/snap-server:0= )"
+
+DEPEND="xen? ( >=app-emulation/xen-3.0 )
+ kvm? ( app-emulation/qemu )
+ lxc? ( app-emulation/lxc )
+ drbd? ( <sys-cluster/drbd-8.5 )
+ rbd? ( sys-cluster/ceph )
+ ipv6? ( net-misc/ndisc6 )
+ haskell-daemons? (
+ ${HASKELL_DEPS}
+ dev-haskell/text:0=
+ )
+ dev-libs/openssl:0
+ dev-python/paramiko[${PYTHON_USEDEP}]
+ dev-python/pyopenssl[${PYTHON_USEDEP}]
+ dev-python/pyparsing[${PYTHON_USEDEP}]
+ dev-python/pycurl[${PYTHON_USEDEP}]
+ dev-python/pyinotify[${PYTHON_USEDEP}]
+ dev-python/simplejson[${PYTHON_USEDEP}]
+ dev-python/ipaddr[${PYTHON_USEDEP}]
+ dev-python/bitarray[${PYTHON_USEDEP}]
+ net-analyzer/arping
+ net-analyzer/fping
+ net-misc/bridge-utils
+ net-misc/curl[ssl]
+ net-misc/openssh
+ net-misc/socat
+ sys-apps/iproute2
+ sys-fs/lvm2
+ >=sys-apps/baselayout-2.0
+ ${PYTHON_DEPS}
+ ${GIT_DEPEND}"
+RDEPEND="${DEPEND}
+ !app-emulation/ganeti-htools"
+DEPEND+="${HASKELL_DEPS}
+ sys-devel/m4
+ test? (
+ dev-python/mock
+ dev-python/pyyaml
+ dev-haskell/haddock:0=
+ dev-haskell/test-framework:0=
+ dev-haskell/test-framework-hunit:0=
+ dev-haskell/test-framework-quickcheck2:0=
+ dev-haskell/temporary:0=
+ sys-apps/fakeroot
+ )"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-2.11-start-stop-daemon-args.patch"
+ "${FILESDIR}/${PN}-2.11-add-pgrep.patch"
+ "${FILESDIR}/${PN}-2.11-daemon-util.patch"
+ "${FILESDIR}/${PN}-2.7-fix-tests.patch"
+ "${FILESDIR}/${PN}-2.9-disable-root-tests.patch"
+ "${FILESDIR}/${PN}-2.11-regex-builtin.patch"
+ "${FILESDIR}/${PN}-2.9-skip-cli-test.patch"
+ "${FILESDIR}/${PN}-2.10-rundir.patch"
+ "${FILESDIR}/${PN}-2.11-qemu-enable-kvm.patch"
+ "${FILESDIR}/${PN}-2.11-tests.patch"
+ "${FILESDIR}/${PN}-lockdir.patch"
+ "${FILESDIR}/${PN}-2.11-useradd.patch"
+ "${FILESDIR}/${PN}-2.11-dont-nest-libdir.patch"
+ "${FILESDIR}/${PN}-2.11-dont-print-man-help.patch"
+ "${FILESDIR}/${PN}-2.11-daemon-util-tests.patch"
+)
+
+REQUIRED_USE="kvm? ( || ( amd64 x86 ) )"
+
+S="${WORKDIR}/${MY_P}"
+
+pkg_setup () {
+ confutils_use_depend_all haskell-daemons htools
+ python-single-r1_pkg_setup
+}
+
+src_prepare() {
+ epatch "${PATCHES[@]}"
+
+ [[ ${PV} == "9999" ]] && ./autogen.sh
+ rm autotools/missing
+ eautoreconf
+}
+
+src_configure () {
+ # this is kind of a hack to work around the removal of the qemu-kvm wrapper
+ local kvm_arch
+
+ if use amd64; then
+ kvm_arch=x86_64
+ elif use x86; then
+ kvm_arch=i386
+ elif use kvm; then
+ die "Could not determine qemu system to use for kvm"
+ fi
+
+ econf --localstatedir=/var \
+ --sharedstatedir=/var \
+ --disable-symlinks \
+ --docdir=/usr/share/doc/${P} \
+ --with-ssh-initscript=/etc/init.d/sshd \
+ --with-export-dir=/var/lib/ganeti-storage/export \
+ --with-os-search-path=/usr/share/${PN}/os \
+ $(usex multiple-users "--with-user-prefix=" "" "${USER_PREFIX}" "") \
+ $(usex multiple-users "--with-group-prefix=" "" "${GROUP_PREFIX}" "") \
+ $(use_enable syslog) \
+ $(use_enable monitoring) \
+ $(usex kvm '--with-kvm-path=' '' "/usr/bin/qemu-system-${kvm_arch}" '') \
+ $(usex haskell-daemons "--enable-confd=haskell" '' '' '')
+}
+
+src_install () {
+ emake V=1 DESTDIR="${D}" install || die "emake install failed"
+
+ newinitd "${FILESDIR}"/ganeti.initd-r3 ${PN}
+ newconfd "${FILESDIR}"/ganeti.confd-r2 ${PN}
+
+ if use kvm; then
+ newinitd "${FILESDIR}"/ganeti-kvm-poweroff.initd ganeti-kvm-poweroff
+ newconfd "${FILESDIR}"/ganeti-kvm-poweroff.confd ganeti-kvm-poweroff
+ fi
+
+ # ganeti installs it's own docs in a generic location
+ rm -rf "${D}"/{usr/share/doc/${PN},run}
+
+ newbashcomp doc/examples/bash_completion ganeti
+
+ dodoc INSTALL UPGRADE NEWS README doc/*.rst
+ dohtml -r doc/html/* doc/css/*.css
+
+ docinto examples
+ dodoc doc/examples/{ganeti.cron,gnt-config-backup} doc/examples/*.ocf
+
+ docinto examples/hooks
+ dodoc doc/examples/hooks/{ipsec,ethers}
+
+ insinto /etc/cron.d
+ newins doc/examples/ganeti.cron ${PN}
+
+ insinto /etc/logrotate.d
+ newins doc/examples/ganeti.logrotate ${PN}
+
+ keepdir /var/{lib,log}/${PN}/
+ keepdir /usr/share/${PN}/${SERIES}/os/
+ keepdir /var/lib/ganeti-storage/{export,file,shared}/
+
+ dosym ${SERIES} "/usr/share/${PN}/default"
+ dosym ${SERIES} "/usr/$(get_libdir)/${PN}/default"
+
+ python_fix_shebang "${ED}" "${D}"/usr/"$(get_libdir)"/${PN}/${SERIES}
+}
+
+pkg_postinst() {
+ if use multiple-users; then
+ elog "You have enable multiple user support, the users for this must"
+ elog "be created. You can use the provided tool for this, which is"
+ elog "located at:"
+ elog " /usr/$(get_libdir)/${PN}/tools/users-setup"
+ fi
+}
+
+src_test () {
+ PATH="${S}/scripts:${S}/src:${PATH}" \
+ TMPDIR="/tmp" \
+ emake check || die "emake check failed"
+}
diff --git a/app-emulation/ganeti/ganeti-2.12.1-r3.ebuild b/app-emulation/ganeti/ganeti-2.12.1-r3.ebuild
new file mode 100644
index 000000000000..644983532c81
--- /dev/null
+++ b/app-emulation/ganeti/ganeti-2.12.1-r3.ebuild
@@ -0,0 +1,253 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=(python2_7)
+use test && PYTHON_REQ_USE="ipv6"
+
+inherit eutils user confutils autotools bash-completion-r1 python-single-r1 versionator pax-utils
+
+MY_PV="${PV/_rc/~rc}"
+#MY_PV="${PV/_beta/~beta}"
+MY_P="${PN}-${MY_PV}"
+SERIES="$(get_version_component_range 1-2)"
+
+if [[ ${PV} == "9999" ]] ; then
+ EGIT_REPO_URI="git://git.ganeti.org/ganeti.git"
+ inherit git-2
+ KEYWORDS=""
+ # you will need to pull in the haskell overlay for pandoc
+ GIT_DEPEND="app-text/pandoc
+ dev-python/docutils
+ dev-python/sphinx
+ media-libs/gd[fontconfig,jpeg,png,truetype]
+ media-gfx/graphviz
+ media-fonts/urw-fonts"
+else
+ SRC_URI="http://downloads.ganeti.org/releases/${SERIES}/${P}.tar.gz"
+ KEYWORDS="~amd64 ~x86"
+fi
+
+DESCRIPTION="Ganeti is a virtual server management software tool"
+HOMEPAGE="http://code.google.com/p/ganeti/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="drbd haskell-daemons htools ipv6 kvm lxc monitoring multiple-users rbd syslog test xen"
+REQUIRED_USE="|| ( kvm xen lxc )"
+
+USER_PREFIX="${GANETI_USER_PREFIX:-"gnt-"}"
+GROUP_PREFIX="${GANETI_GROUP_PREFIX:-"${USER_PREFIX}"}"
+
+# the haskell less-than atoms list are resolver hints, they aren't actual
+# direct dependencies, just hints to help the resolver fufill the dependency
+# on an older transformer.
+# these need to stay until 2.14.0
+DEPEND="
+ dev-libs/openssl:0
+ dev-python/paramiko[${PYTHON_USEDEP}]
+ dev-python/pyopenssl[${PYTHON_USEDEP}]
+ dev-python/pyparsing[${PYTHON_USEDEP}]
+ dev-python/pycurl[${PYTHON_USEDEP}]
+ dev-python/pyinotify[${PYTHON_USEDEP}]
+ dev-python/simplejson[${PYTHON_USEDEP}]
+ dev-python/ipaddr[${PYTHON_USEDEP}]
+ dev-python/bitarray[${PYTHON_USEDEP}]
+ net-analyzer/arping
+ net-analyzer/fping
+ net-misc/bridge-utils
+ net-misc/curl[ssl]
+ net-misc/openssh
+ net-misc/socat
+ sys-apps/iproute2
+ sys-fs/lvm2
+ >=sys-apps/baselayout-2.0
+ >=dev-lang/ghc-7.6.0:0=
+ >=dev-haskell/json-0.9:0=
+ <dev-haskell/monad-control-1.0.0.0:0=
+ <dev-haskell/transformers-0.4.0:0=
+ dev-haskell/curl:0=
+ dev-haskell/network:0=
+ dev-haskell/parallel:3=
+ >=dev-haskell/hslogger-1.2.6:0=
+ dev-haskell/snap-server:0=
+ dev-haskell/utf8-string:0=
+ dev-haskell/attoparsec:0=
+ dev-haskell/crypto:0=
+ dev-haskell/vector:0=
+ dev-haskell/hinotify:0=
+ dev-haskell/regex-pcre-builtin:0=
+ dev-haskell/zlib:0=
+ >=dev-haskell/lifted-base-0.2.3.3:0=
+ <dev-haskell/lens-3.10:0=
+ dev-haskell/base64-bytestring:0=
+ <dev-haskell/mtl-2.2
+ <dev-haskell/contravariant-0.6
+ <dev-haskell/profunctors-4.3
+ <dev-haskell/distributive-0.4.4
+ <dev-haskell/comonad-4.2.2
+ <dev-haskell/transformers-compat-0.3
+ <dev-haskell/transformers-base-0.4.4
+ <dev-haskell/semigroupoids-4.0
+ <dev-haskell/semigroupoid-extras-4.0
+ <dev-haskell/groupoids-4.0
+ xen? ( >=app-emulation/xen-3.0 )
+ kvm? ( app-emulation/qemu )
+ lxc? ( app-emulation/lxc )
+ drbd? ( <sys-cluster/drbd-8.5 )
+ rbd? ( sys-cluster/ceph )
+ ipv6? ( net-misc/ndisc6 )
+ haskell-daemons? ( dev-haskell/text:0= )
+ ${PYTHON_DEPS}
+ ${GIT_DEPEND}"
+RDEPEND="${DEPEND}
+ !app-emulation/ganeti-htools"
+DEPEND+="sys-devel/m4
+ test? (
+ dev-python/mock
+ dev-python/pyyaml
+ dev-haskell/haddock:0=
+ dev-haskell/test-framework:0=
+ dev-haskell/test-framework-hunit:0=
+ dev-haskell/test-framework-quickcheck2:0=
+ dev-haskell/temporary:0=
+ sys-apps/fakeroot
+ net-misc/socat
+ dev-util/shelltestrunner
+ )"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-2.12-start-stop-daemon-args.patch"
+ "${FILESDIR}/${PN}-2.11-add-pgrep.patch"
+ "${FILESDIR}/${PN}-2.12-daemon-util.patch"
+ "${FILESDIR}/${PN}-2.7-fix-tests.patch"
+ "${FILESDIR}/${PN}-2.9-disable-root-tests.patch"
+ "${FILESDIR}/${PN}-2.11-regex-builtin.patch"
+ "${FILESDIR}/${PN}-2.9-skip-cli-test.patch"
+ "${FILESDIR}/${PN}-2.10-rundir.patch"
+ "${FILESDIR}/${PN}-2.12-qemu-enable-kvm.patch"
+ "${FILESDIR}/${PN}-2.11-tests.patch"
+ "${FILESDIR}/${PN}-lockdir.patch"
+ "${FILESDIR}/${PN}-2.11-useradd.patch"
+ "${FILESDIR}/${PN}-2.11-dont-nest-libdir.patch"
+ "${FILESDIR}/${PN}-2.11-dont-print-man-help.patch"
+ "${FILESDIR}/${PN}-2.11-daemon-util-tests.patch"
+ "${FILESDIR}/${PN}-2.12-tests.patch"
+ "${FILESDIR}/${PN}-2.12-cfgupgrade-state.patch"
+)
+
+REQUIRED_USE="kvm? ( || ( amd64 x86 ) )"
+
+S="${WORKDIR}/${MY_P}"
+
+pkg_setup () {
+ local user
+ confutils_use_depend_all haskell-daemons htools
+ python-single-r1_pkg_setup
+
+ if use multiple-users; then
+ for user in gnt-{masterd,confd,luxid,rapi,daemons,admin}; do
+ enewgroup ${user}
+ enewuser ${user} -1 -1 -1 ${user}
+ done
+ fi
+}
+
+src_prepare() {
+ local testfile
+ epatch "${PATCHES[@]}"
+
+ # not sure why these tests are failing
+ # should remove this on next version bump if possible
+ for testfile in test/py/import-export_unittest.bash; do
+ printf '#!/bin/bash\ntrue\n' > "${testfile}"
+ done
+
+ [[ ${PV} == "9999" ]] && ./autogen.sh
+ rm autotools/missing
+ eautoreconf
+}
+
+src_configure () {
+ # this is kind of a hack to work around the removal of the qemu-kvm wrapper
+ local kvm_arch
+
+ if use amd64; then
+ kvm_arch=x86_64
+ elif use x86; then
+ kvm_arch=i386
+ elif use kvm; then
+ die "Could not determine qemu system to use for kvm"
+ fi
+
+ econf --localstatedir=/var \
+ --sharedstatedir=/var \
+ --disable-symlinks \
+ --docdir=/usr/share/doc/${P} \
+ --with-ssh-initscript=/etc/init.d/sshd \
+ --with-export-dir=/var/lib/ganeti-storage/export \
+ --with-os-search-path=/usr/share/${PN}/os \
+ $(usex multiple-users "--with-user-prefix=" "" "${USER_PREFIX}" "") \
+ $(usex multiple-users "--with-group-prefix=" "" "${GROUP_PREFIX}" "") \
+ $(use_enable syslog) \
+ $(use_enable monitoring) \
+ $(usex kvm '--with-kvm-path=' '' "/usr/bin/qemu-system-${kvm_arch}" '') \
+ $(usex haskell-daemons "--enable-confd=haskell" '' '' '')
+}
+
+src_install () {
+ emake V=1 DESTDIR="${D}" install || die "emake install failed"
+
+ newinitd "${FILESDIR}"/ganeti.initd-r3 ${PN}
+ newconfd "${FILESDIR}"/ganeti.confd-r2 ${PN}
+
+ if use kvm; then
+ newinitd "${FILESDIR}"/ganeti-kvm-poweroff.initd ganeti-kvm-poweroff
+ newconfd "${FILESDIR}"/ganeti-kvm-poweroff.confd ganeti-kvm-poweroff
+ fi
+
+ # ganeti installs it's own docs in a generic location
+ rm -rf "${D}"/{usr/share/doc/${PN},run}
+
+ newbashcomp doc/examples/bash_completion ganeti
+
+ dodoc INSTALL UPGRADE NEWS README doc/*.rst
+ dohtml -r doc/html/* doc/css/*.css
+
+ docinto examples
+ dodoc doc/examples/{ganeti.cron,gnt-config-backup} doc/examples/*.ocf
+
+ docinto examples/hooks
+ dodoc doc/examples/hooks/{ipsec,ethers}
+
+ insinto /etc/cron.d
+ newins doc/examples/ganeti.cron ${PN}
+
+ insinto /etc/logrotate.d
+ newins doc/examples/ganeti.logrotate ${PN}
+
+ keepdir /var/{lib,log}/${PN}/
+ keepdir /usr/share/${PN}/${SERIES}/os/
+ keepdir /var/lib/ganeti-storage/{export,file,shared}/
+
+ dosym ${SERIES} "/usr/share/${PN}/default"
+ dosym ${SERIES} "/usr/$(get_libdir)/${PN}/default"
+
+ python_fix_shebang "${ED}" "${D}"/usr/"$(get_libdir)"/${PN}/${SERIES}
+}
+
+pkg_postinst() {
+ if use multiple-users; then
+ elog "You have enable multiple user support, the users for this must"
+ elog "be created. You can use the provided tool for this, which is"
+ elog "located at:"
+ elog " /usr/$(get_libdir)/${PN}/tools/users-setup"
+ fi
+}
+
+src_test () {
+ PATH="${S}/scripts:${S}/src:${PATH}" \
+ TMPDIR="/tmp" \
+ emake check || die "emake check failed"
+}
diff --git a/app-emulation/ganeti/ganeti-2.12.3-r2.ebuild b/app-emulation/ganeti/ganeti-2.12.3-r2.ebuild
new file mode 100644
index 000000000000..c1eb25d7b864
--- /dev/null
+++ b/app-emulation/ganeti/ganeti-2.12.3-r2.ebuild
@@ -0,0 +1,262 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=(python2_7)
+use test && PYTHON_REQ_USE="ipv6"
+
+inherit eutils user autotools bash-completion-r1 python-single-r1 versionator
+
+MY_PV="${PV/_rc/~rc}"
+MY_PV="${MY_PV/_beta/~beta}"
+MY_P="${PN}-${MY_PV}"
+SERIES="$(get_version_component_range 1-2)"
+
+if [[ ${PV} == "9999" ]] ; then
+ EGIT_REPO_URI="git://git.ganeti.org/ganeti.git"
+ inherit git-2
+ KEYWORDS=""
+ GIT_DEPEND="app-text/pandoc
+ dev-python/docutils
+ dev-python/sphinx[${PYTHON_USEDEP}]
+ media-libs/gd[fontconfig,jpeg,png,truetype]
+ media-gfx/graphviz
+ media-fonts/urw-fonts"
+else
+ SRC_URI="http://downloads.ganeti.org/releases/${SERIES}/${MY_P}.tar.gz"
+ KEYWORDS="~amd64 ~x86"
+fi
+
+DESCRIPTION="Ganeti is a virtual server management software tool"
+HOMEPAGE="http://www.ganeti.org/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="drbd haskell-daemons htools ipv6 kvm lxc monitoring multiple-users rbd syslog test xen"
+REQUIRED_USE="|| ( kvm xen lxc ) ${PYTHON_REQUIRED_USE}"
+
+USER_PREFIX="${GANETI_USER_PREFIX:-"gnt-"}"
+GROUP_PREFIX="${GANETI_GROUP_PREFIX:-"${USER_PREFIX}"}"
+
+# the haskell less-than atoms list are resolver hints, they aren't actual
+# direct dependencies, just hints to help the resolver fufill the dependency
+# on an older transformer.
+# these need to stay until 2.14.0
+DEPEND="
+ dev-libs/openssl:0
+ dev-python/paramiko[${PYTHON_USEDEP}]
+ dev-python/pyopenssl[${PYTHON_USEDEP}]
+ dev-python/pyparsing[${PYTHON_USEDEP}]
+ dev-python/pycurl[${PYTHON_USEDEP}]
+ dev-python/pyinotify[${PYTHON_USEDEP}]
+ dev-python/simplejson[${PYTHON_USEDEP}]
+ dev-python/ipaddr[${PYTHON_USEDEP}]
+ dev-python/bitarray[${PYTHON_USEDEP}]
+ net-analyzer/arping
+ net-analyzer/fping
+ net-misc/bridge-utils
+ net-misc/curl[ssl]
+ net-misc/openssh
+ net-misc/socat
+ sys-apps/iproute2
+ sys-fs/lvm2
+ >=sys-apps/baselayout-2.0
+ =dev-lang/ghc-7.6*:0=
+ >=dev-haskell/json-0.9:0=
+ <dev-haskell/monad-control-1.0.0.0:0=
+ <dev-haskell/transformers-0.4.0:0=
+ dev-haskell/curl:0=
+ dev-haskell/network:0=
+ dev-haskell/parallel:3=
+ >=dev-haskell/hslogger-1.2.6:0=
+ dev-haskell/snap-server:0=
+ dev-haskell/utf8-string:0=
+ dev-haskell/attoparsec:0=
+ dev-haskell/crypto:0=
+ dev-haskell/vector:0=
+ dev-haskell/hinotify:0=
+ dev-haskell/regex-pcre-builtin:0=
+ dev-haskell/zlib:0=
+ >=dev-haskell/lifted-base-0.2.3.3:0=
+ <dev-haskell/lens-3.10:0=
+ dev-haskell/base64-bytestring:0=
+ <dev-haskell/mtl-2.2
+ <dev-haskell/contravariant-0.6
+ <dev-haskell/profunctors-4.3
+ <dev-haskell/distributive-0.4.4
+ <dev-haskell/comonad-4.2.2
+ <dev-haskell/transformers-compat-0.3
+ <dev-haskell/transformers-base-0.4.4
+ <dev-haskell/semigroupoids-4.0
+ <dev-haskell/semigroupoid-extras-4.0
+ <dev-haskell/groupoids-4.0
+ xen? ( >=app-emulation/xen-3.0 )
+ kvm? ( app-emulation/qemu )
+ lxc? ( app-emulation/lxc )
+ drbd? ( <sys-cluster/drbd-8.5 )
+ rbd? ( sys-cluster/ceph )
+ ipv6? ( net-misc/ndisc6 )
+ haskell-daemons? ( dev-haskell/text:0= )
+ ${PYTHON_DEPS}
+ ${GIT_DEPEND}"
+RDEPEND="${DEPEND}
+ !app-emulation/ganeti-htools"
+DEPEND+="sys-devel/m4
+ test? (
+ dev-python/mock
+ dev-python/pyyaml
+ dev-haskell/haddock:0=
+ dev-haskell/test-framework:0=
+ dev-haskell/test-framework-hunit:0=
+ dev-haskell/test-framework-quickcheck2:0=
+ dev-haskell/temporary:0=
+ sys-apps/fakeroot
+ net-misc/socat
+ dev-util/shelltestrunner
+ )"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-2.12-start-stop-daemon-args.patch"
+ "${FILESDIR}/${PN}-2.11-add-pgrep.patch"
+ "${FILESDIR}/${PN}-2.12.3-daemon-util.patch"
+ "${FILESDIR}/${PN}-2.7-fix-tests.patch"
+ "${FILESDIR}/${PN}-2.9-disable-root-tests.patch"
+ "${FILESDIR}/${PN}-2.11-regex-builtin.patch"
+ "${FILESDIR}/${PN}-2.9-skip-cli-test.patch"
+ "${FILESDIR}/${PN}-2.10-rundir.patch"
+ "${FILESDIR}/${PN}-2.12-qemu-enable-kvm.patch"
+ "${FILESDIR}/${PN}-2.11-tests.patch"
+ "${FILESDIR}/${PN}-lockdir.patch"
+ "${FILESDIR}/${PN}-2.11-useradd.patch"
+ "${FILESDIR}/${PN}-2.11-dont-nest-libdir.patch"
+ "${FILESDIR}/${PN}-2.11-dont-print-man-help.patch"
+ "${FILESDIR}/${PN}-2.11-daemon-util-tests.patch"
+ "${FILESDIR}/${PN}-2.12-tests.patch"
+)
+
+REQUIRED_USE="kvm? ( || ( amd64 x86 ) )"
+
+S="${WORKDIR}/${MY_P}"
+
+QA_WX_LOAD="usr/$(get_libdir)/${PN}/${SERIES}/usr/sbin/ganeti-*d
+ usr/$(get_libdir)/${PN}/${SERIES}/usr/bin/htools"
+
+pkg_setup () {
+ local user
+ confutils_use_depend_all haskell-daemons htools
+ python-single-r1_pkg_setup
+
+ if use multiple-users; then
+ for user in gnt-{masterd,confd,luxid,rapi,daemons,admin}; do
+ enewgroup ${user}
+ enewuser ${user} -1 -1 -1 ${user}
+ done
+ fi
+}
+
+src_prepare() {
+ local testfile
+ epatch "${PATCHES[@]}"
+
+ # not sure why these tests are failing
+ # should remove this on next version bump if possible
+ for testfile in test/py/import-export_unittest.bash; do
+ printf '#!/bin/bash\ntrue\n' > "${testfile}"
+ done
+
+ # take the sledgehammer approach to bug #526270
+ grep -lr '/bin/sh' "${S}" | xargs -r -- sed -i 's:/bin/sh:/bin/bash:g'
+
+ [[ ${PV} =~ [9]{4,} ]] && ./autogen.sh
+ rm autotools/missing
+ eautoreconf
+}
+
+src_configure () {
+ # this is kind of a hack to work around the removal of the qemu-kvm wrapper
+ local kvm_arch
+
+ if use amd64; then
+ kvm_arch=x86_64
+ elif use x86; then
+ kvm_arch=i386
+ elif use kvm; then
+ die "Could not determine qemu system to use for kvm"
+ fi
+
+ econf --localstatedir=/var \
+ --sharedstatedir=/var \
+ --disable-symlinks \
+ --docdir=/usr/share/doc/${P} \
+ --with-ssh-initscript=/etc/init.d/sshd \
+ --with-export-dir=/var/lib/ganeti-storage/export \
+ --with-os-search-path=/usr/share/${PN}/os \
+ $(usex multiple-users "--with-user-prefix=" "" "${USER_PREFIX}" "") \
+ $(usex multiple-users "--with-group-prefix=" "" "${GROUP_PREFIX}" "") \
+ $(use_enable syslog) \
+ $(use_enable monitoring) \
+ $(usex kvm '--with-kvm-path=' '' "/usr/bin/qemu-system-${kvm_arch}" '') \
+ $(usex haskell-daemons "--enable-confd=haskell" '' '' '')
+}
+
+src_install () {
+ emake V=1 DESTDIR="${D}" install || die "emake install failed"
+
+ newinitd "${FILESDIR}"/ganeti.initd-r3 ${PN}
+ newconfd "${FILESDIR}"/ganeti.confd-r2 ${PN}
+
+ if use kvm; then
+ newinitd "${FILESDIR}"/ganeti-kvm-poweroff.initd ganeti-kvm-poweroff
+ newconfd "${FILESDIR}"/ganeti-kvm-poweroff.confd ganeti-kvm-poweroff
+ fi
+
+ # ganeti installs it's own docs in a generic location
+ rm -rf "${D}"/{usr/share/doc/${PN},run}
+
+ sed -i "s:/usr/$(get_libdir)/${PN}/tools/burnin:burnin:" doc/examples/bash_completion
+ newbashcomp doc/examples/bash_completion gnt-instance
+ bashcomp_alias gnt-instance burnin ganeti-{cleaner,confd} \
+ h{space,check,scan,info,ail,arep,roller,squeeze,bal} \
+ gnt-{os,job,filter,debug,storage,group,node,network,backup,cluster}
+
+ dodoc INSTALL UPGRADE NEWS README doc/*.rst
+ dohtml -r doc/html/* doc/css/*.css
+
+ docinto examples
+ dodoc doc/examples/{ganeti.cron,gnt-config-backup} doc/examples/*.ocf
+
+ docinto examples/hooks
+ dodoc doc/examples/hooks/{ipsec,ethers}
+
+ insinto /etc/cron.d
+ newins doc/examples/ganeti.cron ${PN}
+
+ insinto /etc/logrotate.d
+ newins doc/examples/ganeti.logrotate ${PN}
+
+ keepdir /var/{lib,log}/${PN}/
+ keepdir /usr/share/${PN}/${SERIES}/os/
+ keepdir /var/lib/ganeti-storage/{export,file,shared}/
+
+ dosym ${SERIES} "/usr/share/${PN}/default"
+ dosym ${SERIES} "/usr/$(get_libdir)/${PN}/default"
+
+ python_fix_shebang "${ED}" "${D}"/usr/"$(get_libdir)"/${PN}/${SERIES}
+}
+
+pkg_postinst() {
+ if use multiple-users; then
+ elog "You have enable multiple user support, the users for this must"
+ elog "be created. You can use the provided tool for this, which is"
+ elog "located at:"
+ elog " /usr/$(get_libdir)/${PN}/tools/users-setup"
+ fi
+}
+
+src_test () {
+ PATH="${S}/scripts:${S}/src:${PATH}" \
+ TMPDIR="/tmp" \
+ GANETI_MASTER="$(hostname -f)" \
+ emake check || die "emake check failed"
+}
diff --git a/app-emulation/ganeti/ganeti-2.13.0-r2.ebuild b/app-emulation/ganeti/ganeti-2.13.0-r2.ebuild
new file mode 100644
index 000000000000..45a4009dce60
--- /dev/null
+++ b/app-emulation/ganeti/ganeti-2.13.0-r2.ebuild
@@ -0,0 +1,258 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=(python2_7)
+use test && PYTHON_REQ_USE="ipv6"
+
+inherit eutils user autotools bash-completion-r1 python-single-r1 versionator
+
+MY_PV="${PV/_rc/~rc}"
+MY_PV="${MY_PV/_beta/~beta}"
+MY_P="${PN}-${MY_PV}"
+SERIES="$(get_version_component_range 1-2)"
+
+if [[ ${PV} == "9999" ]] ; then
+ EGIT_REPO_URI="git://git.ganeti.org/ganeti.git"
+ inherit git-2
+ KEYWORDS=""
+ GIT_DEPEND="app-text/pandoc
+ dev-python/docutils
+ dev-python/sphinx[${PYTHON_USEDEP}]
+ media-libs/gd[fontconfig,jpeg,png,truetype]
+ media-gfx/graphviz
+ media-fonts/urw-fonts"
+else
+ SRC_URI="http://downloads.ganeti.org/releases/${SERIES}/${MY_P}.tar.gz"
+ KEYWORDS="~amd64 ~x86"
+fi
+
+DESCRIPTION="Ganeti is a virtual server management software tool"
+HOMEPAGE="http://www.ganeti.org/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="drbd haskell-daemons htools ipv6 kvm lxc monitoring multiple-users rbd syslog test xen"
+REQUIRED_USE="|| ( kvm xen lxc ) ${PYTHON_REQUIRED_USE}"
+
+USER_PREFIX="${GANETI_USER_PREFIX:-"gnt-"}"
+GROUP_PREFIX="${GANETI_GROUP_PREFIX:-"${USER_PREFIX}"}"
+
+DEPEND="
+ dev-libs/openssl:0
+ dev-python/paramiko[${PYTHON_USEDEP}]
+ dev-python/pyopenssl[${PYTHON_USEDEP}]
+ dev-python/pyparsing[${PYTHON_USEDEP}]
+ dev-python/pycurl[${PYTHON_USEDEP}]
+ dev-python/pyinotify[${PYTHON_USEDEP}]
+ dev-python/simplejson[${PYTHON_USEDEP}]
+ dev-python/ipaddr[${PYTHON_USEDEP}]
+ dev-python/bitarray[${PYTHON_USEDEP}]
+ net-analyzer/arping
+ net-analyzer/fping
+ net-misc/bridge-utils
+ net-misc/curl[ssl]
+ net-misc/openssh
+ net-misc/socat
+ sys-apps/iproute2
+ sys-fs/lvm2
+ >=sys-apps/baselayout-2.0
+ =dev-lang/ghc-7.6*:0=
+ >=dev-haskell/json-0.9:0=
+ dev-haskell/curl:0=
+ dev-haskell/network:0=
+ dev-haskell/parallel:3=
+ >=dev-haskell/hslogger-1.2.6:0=
+ dev-haskell/snap-server:0=
+ dev-haskell/utf8-string:0=
+ dev-haskell/attoparsec:0=
+ dev-haskell/crypto:0=
+ dev-haskell/vector:0=
+ dev-haskell/hinotify:0=
+ dev-haskell/regex-pcre-builtin:0=
+ dev-haskell/zlib:0=
+ >=dev-haskell/lifted-base-0.2.3.3:0=
+ <dev-haskell/lens-4:0=
+ dev-haskell/psqueue:0=
+ dev-haskell/base64-bytestring:0=
+ <dev-haskell/semigroupoids-4.1:0=
+ <dev-haskell/mtl-2.2:0=
+ <dev-haskell/monad-control-1.0.0.0:0=
+ <dev-haskell/transformers-0.4.0:0=
+ <dev-haskell/contravariant-0.6
+ <dev-haskell/transformers-compat-0.4[three]
+ <dev-haskell/transformers-base-0.4.4
+ xen? ( >=app-emulation/xen-3.0 )
+ kvm? ( app-emulation/qemu )
+ lxc? ( app-emulation/lxc )
+ drbd? ( <sys-cluster/drbd-8.5 )
+ rbd? ( sys-cluster/ceph )
+ ipv6? ( net-misc/ndisc6 )
+ haskell-daemons? ( dev-haskell/text:0= )
+ ${PYTHON_DEPS}
+ ${GIT_DEPEND}"
+RDEPEND="${DEPEND}
+ !app-emulation/ganeti-htools"
+DEPEND+="sys-devel/m4
+ app-text/pandoc
+ test? (
+ dev-python/mock
+ dev-python/pyyaml
+ dev-haskell/haddock:0=
+ dev-haskell/test-framework:0=
+ dev-haskell/test-framework-hunit:0=
+ dev-haskell/test-framework-quickcheck2:0=
+ dev-haskell/temporary:0=
+ sys-apps/fakeroot
+ net-misc/socat
+ dev-util/shelltestrunner
+ )"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-2.12-start-stop-daemon-args.patch"
+ "${FILESDIR}/${PN}-2.11-add-pgrep.patch"
+ "${FILESDIR}/${PN}-2.13-daemon-util.patch"
+ "${FILESDIR}/${PN}-2.7-fix-tests.patch"
+ "${FILESDIR}/${PN}-2.9-disable-root-tests.patch"
+ "${FILESDIR}/${PN}-2.9-skip-cli-test.patch"
+ "${FILESDIR}/${PN}-2.10-rundir.patch"
+ "${FILESDIR}/${PN}-2.12-qemu-enable-kvm.patch"
+ "${FILESDIR}/${PN}-2.11-tests.patch"
+ "${FILESDIR}/${PN}-lockdir.patch"
+ "${FILESDIR}/${PN}-2.11-dont-nest-libdir.patch"
+ "${FILESDIR}/${PN}-2.11-dont-print-man-help.patch"
+ "${FILESDIR}/${PN}-2.11-daemon-util-tests.patch"
+ "${FILESDIR}/${PN}-2.13-regex-pcre-builtin.patch"
+ "${FILESDIR}/${PN}-2.13-process_unittest.patch"
+ "${FILESDIR}/${PN}-2.13-disable-usersgroups-test.patch"
+)
+
+REQUIRED_USE="kvm? ( || ( amd64 x86 ) )"
+
+S="${WORKDIR}/${MY_P}"
+
+QA_WX_LOAD="usr/$(get_libdir)/${PN}/${SERIES}/usr/sbin/ganeti-*d
+ usr/$(get_libdir)/${PN}/${SERIES}/usr/bin/htools"
+
+pkg_setup () {
+ local user
+ confutils_use_depend_all haskell-daemons htools
+ python-single-r1_pkg_setup
+
+ if use multiple-users; then
+ for user in gnt-{masterd,confd,luxid,rapi,daemons,admin}; do
+ enewgroup ${user}
+ enewuser ${user} -1 -1 -1 ${user}
+ done
+ fi
+}
+
+src_prepare() {
+ local testfile
+ epatch "${PATCHES[@]}"
+
+ # not sure why these tests are failing
+ # should remove this on next version bump if possible
+ for testfile in test/py/import-export_unittest.bash; do
+ printf '#!/bin/bash\ntrue\n' > "${testfile}"
+ done
+
+ # take the sledgehammer approach to bug #526270
+ grep -lr '/bin/sh' "${S}" | xargs -r -- sed -i 's:/bin/sh:/bin/bash:g'
+
+ [[ ${PV} =~ [9]{4,} ]] && ./autogen.sh
+ rm autotools/missing
+ eautoreconf
+}
+
+src_configure () {
+ # this is kind of a hack to work around the removal of the qemu-kvm wrapper
+ local kvm_arch
+
+ if use amd64; then
+ kvm_arch=x86_64
+ elif use x86; then
+ kvm_arch=i386
+ elif use kvm; then
+ die "Could not determine qemu system to use for kvm"
+ fi
+
+ econf --localstatedir=/var \
+ --sharedstatedir=/var \
+ --disable-symlinks \
+ --docdir=/usr/share/doc/${P} \
+ --with-ssh-initscript=/etc/init.d/sshd \
+ --with-export-dir=/var/lib/ganeti-storage/export \
+ --with-os-search-path=/usr/share/${PN}/os \
+ $(use_enable test haskell-tests) \
+ $(usex multiple-users "--with-default-user=" "" "gnt-daemons" "") \
+ $(usex multiple-users "--with-user-prefix=" "" "${USER_PREFIX}" "") \
+ $(usex multiple-users "--with-default-group=" "" "gnt-daemons" "") \
+ $(usex multiple-users "--with-group-prefix=" "" "${GROUP_PREFIX}" "") \
+ $(use_enable syslog) \
+ $(use_enable monitoring) \
+ $(usex kvm '--with-kvm-path=' '' "/usr/bin/qemu-system-${kvm_arch}" '') \
+ $(usex haskell-daemons "--enable-confd=haskell" '' '' '')
+}
+
+src_install () {
+ emake V=1 DESTDIR="${D}" install || die "emake install failed"
+
+ newinitd "${FILESDIR}"/ganeti.initd-r3 ${PN}
+ newconfd "${FILESDIR}"/ganeti.confd-r2 ${PN}
+
+ if use kvm; then
+ newinitd "${FILESDIR}"/ganeti-kvm-poweroff.initd ganeti-kvm-poweroff
+ newconfd "${FILESDIR}"/ganeti-kvm-poweroff.confd ganeti-kvm-poweroff
+ fi
+
+ # ganeti installs it's own docs in a generic location
+ rm -rf "${D}"/{usr/share/doc/${PN},run}
+
+ sed -i "s:/usr/$(get_libdir)/${PN}/tools/burnin:burnin:" doc/examples/bash_completion
+ newbashcomp doc/examples/bash_completion gnt-instance
+ bashcomp_alias gnt-instance burnin ganeti-{cleaner,confd} \
+ h{space,check,scan,info,ail,arep,roller,squeeze,bal} \
+ gnt-{os,job,filter,debug,storage,group,node,network,backup,cluster}
+
+ dodoc INSTALL UPGRADE NEWS README doc/*.rst
+ dohtml -r doc/html/* doc/css/*.css
+
+ docinto examples
+ dodoc doc/examples/{ganeti.cron,gnt-config-backup} doc/examples/*.ocf
+
+ docinto examples/hooks
+ dodoc doc/examples/hooks/{ipsec,ethers}
+
+ insinto /etc/cron.d
+ newins doc/examples/ganeti.cron ${PN}
+
+ insinto /etc/logrotate.d
+ newins doc/examples/ganeti.logrotate ${PN}
+
+ keepdir /var/{lib,log}/${PN}/
+ keepdir /usr/share/${PN}/${SERIES}/os/
+ keepdir /var/lib/ganeti-storage/{export,file,shared}/
+
+ dosym ${SERIES} "/usr/share/${PN}/default"
+ dosym ${SERIES} "/usr/$(get_libdir)/${PN}/default"
+
+ python_fix_shebang "${ED}" "${D}"/usr/"$(get_libdir)"/${PN}/${SERIES}
+}
+
+pkg_postinst() {
+ if use multiple-users; then
+ elog "You have enable multiple user support, the users for this must"
+ elog "be created. You can use the provided tool for this, which is"
+ elog "located at:"
+ elog " /usr/$(get_libdir)/${PN}/tools/users-setup"
+ fi
+}
+
+src_test () {
+ PATH="${S}/scripts:${S}/src:${PATH}" \
+ TMPDIR="/tmp" \
+ GANETI_MASTER="$(hostname -f)" \
+ emake check || die "emake check failed"
+}
diff --git a/app-emulation/ganeti/ganeti-2.14.1-r1.ebuild b/app-emulation/ganeti/ganeti-2.14.1-r1.ebuild
new file mode 100644
index 000000000000..17bb19c37c17
--- /dev/null
+++ b/app-emulation/ganeti/ganeti-2.14.1-r1.ebuild
@@ -0,0 +1,295 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=(python2_7)
+use test && PYTHON_REQ_USE="ipv6"
+
+inherit eutils user autotools bash-completion-r1 python-single-r1 versionator
+
+MY_PV="${PV/_rc/~rc}"
+MY_PV="${MY_PV/_beta/~beta}"
+MY_P="${PN}-${MY_PV}"
+SERIES="$(get_version_component_range 1-2)"
+
+if [[ ${PV} =~ [9]{4,} ]] ; then
+ EGIT_REPO_URI="git://git.ganeti.org/ganeti.git"
+ inherit git-2
+ KEYWORDS=""
+ GIT_DEPEND="dev-python/docutils
+ =dev-python/sphinx-1.2*[${PYTHON_USEDEP}]
+ media-libs/gd[fontconfig,jpeg,png,truetype]
+ media-gfx/graphviz
+ media-fonts/urw-fonts"
+else
+ SRC_URI="http://downloads.ganeti.org/releases/${SERIES}/${MY_P}.tar.gz"
+ KEYWORDS="~amd64 ~x86"
+fi
+
+DESCRIPTION="Ganeti is a virtual server management software tool"
+HOMEPAGE="http://www.ganeti.org/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="drbd haskell-daemons htools ipv6 kvm lxc monitoring multiple-users rbd syslog test xen"
+REQUIRED_USE="|| ( kvm xen lxc ) ${PYTHON_REQUIRED_USE}"
+
+USER_PREFIX="${GANETI_USER_PREFIX:-"gnt-"}"
+GROUP_PREFIX="${GANETI_GROUP_PREFIX:-"${USER_PREFIX}"}"
+
+DEPEND="
+ dev-libs/openssl:0
+ dev-python/paramiko[${PYTHON_USEDEP}]
+ dev-python/pyopenssl[${PYTHON_USEDEP}]
+ dev-python/pyparsing[${PYTHON_USEDEP}]
+ dev-python/pycurl[${PYTHON_USEDEP}]
+ dev-python/pyinotify[${PYTHON_USEDEP}]
+ dev-python/simplejson[${PYTHON_USEDEP}]
+ dev-python/ipaddr[${PYTHON_USEDEP}]
+ dev-python/bitarray[${PYTHON_USEDEP}]
+ net-analyzer/arping
+ net-analyzer/fping
+ net-misc/bridge-utils
+ net-misc/curl[ssl]
+ net-misc/openssh
+ net-misc/socat
+ sys-apps/iproute2
+ sys-fs/lvm2
+ >=sys-apps/baselayout-2.0
+ =dev-lang/ghc-7.6*:0=
+ dev-haskell/cabal:0=
+ dev-haskell/cabal-install:0=
+ >=dev-haskell/mtl-2.1.1:0=
+ >=dev-haskell/old-time-1.1.0.0:0=
+ >=dev-haskell/random-1.0.1.1:0=
+ haskell-daemons? ( >=dev-haskell/text-0.11.1.13:0= )
+ >=dev-haskell/transformers-0.3.0.0:0=
+
+ >=dev-haskell/attoparsec-0.10.1.1:0=
+ <dev-haskell/attoparsec-0.13:0
+ >=dev-haskell/base64-bytestring-1.0.0.1:0=
+ <dev-haskell/base64-bytestring-1.1:0=
+ >=dev-haskell/crypto-4.2.4:0=
+ <dev-haskell/crypto-4.3:0=
+ >=dev-haskell/curl-1.3.7:0=
+ <dev-haskell/curl-1.4:0=
+ >=dev-haskell/hinotify-0.3.2:0=
+ <dev-haskell/hinotify-0.4:0=
+ >=dev-haskell/hslogger-1.1.4:0=
+ <dev-haskell/hslogger-1.3:0=
+ >=dev-haskell/json-0.5:0=
+ <dev-haskell/json-0.9:0=
+ >=dev-haskell/lens-3.10:0=
+ <dev-haskell/lens-4.8:0=
+ >=dev-haskell/lifted-base-0.2.0.3:0=
+ <dev-haskell/lifted-base-0.3:0=
+ >=dev-haskell/monad-control-0.3.1.3:0=
+ <dev-haskell/monad-control-1.1:0=
+ >=dev-haskell/network-2.3.0.13:0=
+ <dev-haskell/network-2.7:0=
+ >=dev-haskell/parallel-3.2.0.2:3=
+ <dev-haskell/parallel-3.3:3=
+ >=dev-haskell/temporary-1.1.2.3:0=
+ <dev-haskell/temporary-1.3:0=
+ >=dev-haskell/regex-pcre-0.94.2:0=
+ <dev-haskell/regex-pcre-0.95:0=
+ >=dev-haskell/transformers-base-0.4.1:0=
+ <dev-haskell/transformers-base-0.5:0=
+ >=dev-haskell/utf8-string-0.3.7:0=
+ <dev-haskell/utf8-string-0.4:0=
+ >=dev-haskell/zlib-0.5.3.3:0=
+ <dev-haskell/zlib-0.6:0=
+
+ >=dev-haskell/psqueue-1.1:0=
+ <dev-haskell/psqueue-1.2:0=
+ >=dev-haskell/snap-core-0.8.1:0=
+ <dev-haskell/snap-core-0.10:0=
+ >=dev-haskell/snap-server-0.8.1:0=
+ <dev-haskell/snap-server-0.10:0=
+
+ dev-haskell/vector:0=
+ <dev-haskell/semigroupoids-4.1:0=
+ <dev-haskell/contravariant-0.6
+ <dev-haskell/transformers-compat-0.4[three]
+ xen? ( >=app-emulation/xen-3.0 )
+ kvm? ( app-emulation/qemu )
+ lxc? ( app-emulation/lxc )
+ drbd? ( <sys-cluster/drbd-8.5 )
+ rbd? ( sys-cluster/ceph )
+ ipv6? ( net-misc/ndisc6 )
+ ${PYTHON_DEPS}
+ ${GIT_DEPEND}"
+RDEPEND="${DEPEND}
+ !app-emulation/ganeti-htools"
+DEPEND+="sys-devel/m4
+ =app-text/pandoc-1.12*
+ >=dev-haskell/test-framework-0.6:0=
+ <dev-haskell/test-framework-0.9:0=
+ >=dev-haskell/test-framework-hunit-0.2.7:0=
+ <dev-haskell/test-framework-hunit-0.4:0=
+ >=dev-haskell/test-framework-quickcheck2-0.2.12.1:0=
+ <dev-haskell/test-framework-quickcheck2-0.4:0=
+ test? (
+ dev-python/mock
+ dev-python/pyyaml
+ dev-haskell/haddock:0=
+ >=dev-haskell/hunit-1.2.4.2:0=
+ <dev-haskell/hunit-1.3:0=
+ >=dev-haskell/quickcheck-2.4.2:2=
+ <dev-haskell/quickcheck-2.8:2=
+ sys-apps/fakeroot
+ net-misc/socat
+ dev-util/shelltestrunner
+ )"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-2.12-start-stop-daemon-args.patch"
+ "${FILESDIR}/${PN}-2.11-add-pgrep.patch"
+ "${FILESDIR}/${PN}-2.13-daemon-util.patch"
+ "${FILESDIR}/${PN}-2.7-fix-tests.patch"
+ "${FILESDIR}/${PN}-2.9-disable-root-tests.patch"
+ "${FILESDIR}/${PN}-2.9-skip-cli-test.patch"
+ "${FILESDIR}/${PN}-2.10-rundir.patch"
+ "${FILESDIR}/${PN}-2.12-qemu-enable-kvm.patch"
+ "${FILESDIR}/${PN}-2.11-tests.patch"
+ "${FILESDIR}/${PN}-lockdir.patch"
+ "${FILESDIR}/${PN}-2.11-dont-nest-libdir.patch"
+ "${FILESDIR}/${PN}-2.11-dont-print-man-help.patch"
+ "${FILESDIR}/${PN}-2.11-daemon-util-tests.patch"
+ "${FILESDIR}/${PN}-2.13-process_unittest.patch"
+)
+
+REQUIRED_USE="kvm? ( || ( amd64 x86 ) )"
+
+S="${WORKDIR}/${MY_P}"
+
+# apparently currently broken
+QA_WX_LOAD="
+ usr/lib*/${PN}/${SERIES}/usr/sbin/ganeti-*d
+ usr/lib*/${PN}/${SERIES}/usr/bin/htools
+"
+
+pkg_setup () {
+ local user
+ python-single-r1_pkg_setup
+
+ if use multiple-users; then
+ for user in gnt-{masterd,confd,luxid,rapi,daemons,admin}; do
+ enewgroup ${user}
+ enewuser ${user} -1 -1 -1 ${user}
+ done
+ fi
+}
+
+src_prepare() {
+ local testfile
+ epatch "${PATCHES[@]}"
+
+ # not sure why these tests are failing
+ # should remove this on next version bump if possible
+ for testfile in test/py/import-export_unittest.bash; do
+ printf '#!/bin/bash\ntrue\n' > "${testfile}"
+ done
+
+ # take the sledgehammer approach to bug #526270
+ grep -lr '/bin/sh' "${S}" | xargs -r -- sed -i 's:/bin/sh:/bin/bash:g'
+
+ [[ ${PV} =~ [9]{4,} ]] && ./autogen.sh
+ rm autotools/missing
+ eautoreconf
+}
+
+src_configure () {
+ # this is kind of a hack to work around the removal of the qemu-kvm wrapper
+ local kvm_arch
+
+ if use amd64; then
+ kvm_arch=x86_64
+ elif use x86; then
+ kvm_arch=i386
+ elif use kvm; then
+ die "Could not determine qemu system to use for kvm"
+ fi
+
+ econf --localstatedir=/var \
+ --sharedstatedir=/var \
+ --disable-symlinks \
+ --docdir=/usr/share/doc/${P} \
+ --with-ssh-initscript=/etc/init.d/sshd \
+ --with-export-dir=/var/lib/ganeti-storage/export \
+ --with-os-search-path=/usr/share/${PN}/os \
+ $(use_enable test haskell-tests) \
+ $(usex multiple-users "--with-default-user=" "" "gnt-daemons" "") \
+ $(usex multiple-users "--with-user-prefix=" "" "${USER_PREFIX}" "") \
+ $(usex multiple-users "--with-default-group=" "" "gnt-daemons" "") \
+ $(usex multiple-users "--with-group-prefix=" "" "${GROUP_PREFIX}" "") \
+ $(use_enable syslog) \
+ $(use_enable monitoring) \
+ $(usex kvm '--with-kvm-path=' '' "/usr/bin/qemu-system-${kvm_arch}" '') \
+ $(usex haskell-daemons "--enable-confd=haskell" '' '' '')
+}
+
+src_install () {
+ emake V=1 DESTDIR="${D}" install || die "emake install failed"
+
+ newinitd "${FILESDIR}"/ganeti.initd-r3 ${PN}
+ newconfd "${FILESDIR}"/ganeti.confd-r2 ${PN}
+
+ if use kvm; then
+ newinitd "${FILESDIR}"/ganeti-kvm-poweroff.initd ganeti-kvm-poweroff
+ newconfd "${FILESDIR}"/ganeti-kvm-poweroff.confd ganeti-kvm-poweroff
+ fi
+
+ # ganeti installs it's own docs in a generic location
+ rm -rf "${D}"/{usr/share/doc/${PN},run}
+
+ sed -i "s:/usr/$(get_libdir)/${PN}/tools/burnin:burnin:" doc/examples/bash_completion
+ newbashcomp doc/examples/bash_completion gnt-instance
+ bashcomp_alias gnt-instance burnin ganeti-{cleaner,confd} \
+ h{space,check,scan,info,ail,arep,roller,squeeze,bal} \
+ gnt-{os,job,filter,debug,storage,group,node,network,backup,cluster}
+
+ dodoc INSTALL UPGRADE NEWS README doc/*.rst
+ dohtml -r doc/html/* doc/css/*.css
+
+ docinto examples
+ dodoc doc/examples/{ganeti.cron,gnt-config-backup} doc/examples/*.ocf
+
+ docinto examples/hooks
+ dodoc doc/examples/hooks/{ipsec,ethers}
+
+ insinto /etc/cron.d
+ newins doc/examples/ganeti.cron ${PN}
+
+ insinto /etc/logrotate.d
+ newins doc/examples/ganeti.logrotate ${PN}
+
+ # need to dodir rather than keepdir here (bug #552482)
+ dodir /var/lib/${PN}
+
+ keepdir /var/log/${PN}/
+ keepdir /usr/share/${PN}/${SERIES}/os/
+ keepdir /var/lib/ganeti-storage/{export,file,shared}/
+
+ dosym ${SERIES} "/usr/share/${PN}/default"
+ dosym ${SERIES} "/usr/$(get_libdir)/${PN}/default"
+
+ python_fix_shebang "${ED}" "${D}"/usr/"$(get_libdir)"/${PN}/${SERIES}
+}
+
+pkg_postinst() {
+ if use multiple-users; then
+ elog "You have enable multiple user support, the users for this must"
+ elog "be created. You can use the provided tool for this, which is"
+ elog "located at:"
+ elog " /usr/$(get_libdir)/${PN}/tools/users-setup"
+ fi
+}
+
+src_test () {
+ PATH="${S}/scripts:${S}/src:${PATH}" \
+ TMPDIR="/tmp" \
+ GANETI_MASTER="$(hostname -f)" \
+ emake check || die "emake check failed"
+}
diff --git a/app-emulation/ganeti/ganeti-2.4.5-r1.ebuild b/app-emulation/ganeti/ganeti-2.4.5-r1.ebuild
new file mode 100644
index 000000000000..51fbeef95cc9
--- /dev/null
+++ b/app-emulation/ganeti/ganeti-2.4.5-r1.ebuild
@@ -0,0 +1,90 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=4
+
+inherit eutils confutils bash-completion-r1
+
+MY_PV="${PV/_rc/~rc}"
+#MY_PV="${PV/_beta/~beta}"
+MY_P="${PN}-${MY_PV}"
+DESCRIPTION="Ganeti is a virtual server management software tool"
+HOMEPAGE="http://code.google.com/p/ganeti/"
+SRC_URI="http://ganeti.googlecode.com/files/${MY_P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="amd64 x86"
+IUSE="kvm xen drbd +filestorage syslog ipv6"
+
+S="${WORKDIR}/${MY_P}"
+
+DEPEND="xen? ( >=app-emulation/xen-3.0 )
+ kvm? ( app-emulation/qemu )
+ drbd? ( >=sys-cluster/drbd-8.3 )
+ ipv6? ( net-misc/ndisc6 )
+ dev-libs/openssl
+ dev-python/paramiko
+ dev-python/pyopenssl
+ dev-python/pyparsing
+ dev-python/pycurl
+ dev-python/pyinotify
+ dev-python/simplejson
+ net-analyzer/arping
+ net-misc/bridge-utils
+ net-misc/curl[ssl]
+ net-misc/openssh
+ net-misc/socat
+ sys-apps/iproute2
+ sys-fs/lvm2
+ >=sys-apps/baselayout-2.0"
+RDEPEND="${DEPEND}
+ !<app-emulation/ganeti-htools-0.3"
+
+pkg_setup () {
+ confutils_require_any kvm xen
+}
+
+src_prepare () {
+ epatch "${FILESDIR}/${PN}-fix-start-stop.patch"
+}
+
+src_configure () {
+ local myconf
+ if use filestorage ; then
+ myconf="--with-file-storage-dir=/var/lib/ganeti-storage/file"
+ else
+ myconf="--with-file-storage-dir=no"
+ fi
+ if use kvm && [ -f /usr/bin/qemu-kvm ] ; then
+ myconf="--with-kvm-path=/usr/bin/qemu-kvm"
+ fi
+ econf --localstatedir=/var \
+ --docdir=/usr/share/doc/${P} \
+ --with-ssh-initscript=/etc/init.d/sshd \
+ --with-export-dir=/var/lib/ganeti-storage/export \
+ --with-os-search-path=/usr/share/ganeti/os \
+ $(use_enable syslog) \
+ ${myconf}
+}
+
+src_install () {
+ emake DESTDIR="${D}" install || die "emake install failed"
+ newinitd "${FILESDIR}"/ganeti-2.1.initd ganeti
+ newconfd "${FILESDIR}"/ganeti.confd ganeti
+ use kvm && newinitd "${FILESDIR}"/ganeti-kvm-poweroff.initd ganeti-kvm-poweroff
+ use kvm && newconfd "${FILESDIR}"/ganeti-kvm-poweroff.confd ganeti-kvm-poweroff
+ newbashcomp doc/examples/bash_completion ganeti
+ dodoc INSTALL UPGRADE NEWS README doc/*.rst
+ rm -rf "${D}"/usr/share/doc/ganeti
+ docinto examples
+ #dodoc doc/examples/{basic-oob,ganeti.cron,gnt-config-backup}
+ dodoc doc/examples/{ganeti.cron,gnt-config-backup}
+ docinto examples/hooks
+ dodoc doc/examples/hooks/{ipsec,ethers}
+
+ keepdir /var/{lib,log,run}/ganeti/
+ keepdir /usr/share/ganeti/os/
+ keepdir /var/lib/ganeti-storage/{export,file}/
+}
diff --git a/app-emulation/ganeti/metadata.xml b/app-emulation/ganeti/metadata.xml
new file mode 100644
index 000000000000..aed23d1c641c
--- /dev/null
+++ b/app-emulation/ganeti/metadata.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <herd>virtualization</herd>
+ <maintainer>
+ <email>chutzpah@gentoo.org</email>
+ <name>Patrick McLean</name>
+ </maintainer>
+ <longdescription lang="en">
+ Ganeti is a cluster virtual server management software tool built on top of
+ existing virtualization technologies such as Xen or KVM and other Open
+ Source software.
+
+ Ganeti requires pre-installed virtualization software on your servers in
+ order to function. Once installed, the tool will take over the management
+ part of the virtual instances (Xen DomU), e.g. disk creation management,
+ operating system installation for these instances (in co-operation with
+ OS-specific install scripts), and startup, shutdown, failover between
+ physical systems. It has been designed to facilitate cluster management of
+ virtual servers and to provide fast and simple recovery after physical
+ failures using commodity hardware.
+ </longdescription>
+ <use>
+ <flag name='drbd'>Enable DRBD support</flag>
+ <flag name='filestorage'>Enable File Storage</flag>
+ <flag name='haskell-daemons'>Build haskell daemons instead of python</flag>
+ <flag name='htools'>Enable htools support</flag>
+ <flag name='kvm'>Enable KVM support</flag>
+ <flag name='lxc'>Enable Linux Countainers support</flag>
+ <flag name='multiple-users'>Enable support for running VMs as different users.</flag>
+ <flag name='monitoring'>Enable the ganeti monitoring daemon</flag>
+ <flag name='rbd'>Enable rados block device support via sys-cluster/ceph</flag>
+ <flag name='xen'>Enable Xen support</flag>
+ </use>
+</pkgmetadata>
+