summaryrefslogtreecommitdiff
path: root/app-emulation/ganeti/files
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/files
downloadgentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.gz
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.xz
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/files')
-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
38 files changed, 1391 insertions, 0 deletions
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 00000000000..111f7546899
--- /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 00000000000..a723f2b63d8
--- /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 00000000000..b0a8bd99cc0
--- /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 00000000000..b60a8505776
--- /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 00000000000..09b10cd3354
--- /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 00000000000..134b9d7bcac
--- /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 00000000000..42b90deb659
--- /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 00000000000..f2cce0c759d
--- /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 00000000000..08ef3778ca5
--- /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 00000000000..6f90233847e
--- /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 00000000000..fd0a9f60671
--- /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 00000000000..d546921bd9b
--- /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 00000000000..42841f90593
--- /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 00000000000..79bda3c989f
--- /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 00000000000..b199ff09367
--- /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 00000000000..463ff26095a
--- /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 00000000000..dcf9b5184a0
--- /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 00000000000..2f6bfa3208d
--- /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 00000000000..5d8dedfe89d
--- /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 00000000000..6e81b515d83
--- /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 00000000000..4001ac5aa4d
--- /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 00000000000..ced966fbe6e
--- /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 00000000000..a270ac831e9
--- /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 00000000000..c69128229a6
--- /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 00000000000..6fb5bd0df62
--- /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 00000000000..b3b5ad17f2b
--- /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 00000000000..932258b93a3
--- /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 00000000000..f9aba9d4e2e
--- /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 00000000000..7e1badc96fc
--- /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 00000000000..e53161a00b2
--- /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 00000000000..6ab21c3709a
--- /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 00000000000..967f0acff78
--- /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 00000000000..dad084fa430
--- /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 00000000000..3b71d7ee44a
--- /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 00000000000..0f2e69f3d5e
--- /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 00000000000..8d31f169849
--- /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 00000000000..d425fd0dccc
--- /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 00000000000..74a748a73e3
--- /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
+}