* gnu/packages/virtualization.scm (system->qemu-target, ganeti): New variables. * gnu/packages/patches/ganeti-deterministic-manual.patch, gnu/packages/patches/ganeti-disable-version-symlinks.patch, gnu/packages/patches/ganeti-drbd-compat.patch, gnu/packages/patches/ganeti-haskell-pythondir.patch, gnu/packages/patches/ganeti-os-disk-size.patch, gnu/packages/patches/ganeti-preserve-PYTHONPATH.patch, gnu/packages/patches/ganeti-shepherd-master-failover.patch, gnu/packages/patches/ganeti-shepherd-support.patch: New files. * gnu/local.mk (dist_patch_DATA): Adjust accordingly.
		
			
				
	
	
		
			87 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Ganeti uses an internal tool to start/stop daemons during init and
 | |
| upgrade.  This patch makes the tool use native Shepherd facilities.
 | |
| 
 | |
| diff --git a/daemons/daemon-util.in b/daemons/daemon-util.in
 | |
| --- a/daemons/daemon-util.in
 | |
| +++ b/daemons/daemon-util.in
 | |
| @@ -184,6 +184,21 @@ use_systemctl() {
 | |
|    return 1
 | |
|  }
 | |
|  
 | |
| +# Checks if we should use the Shepherd to start/stop daemons
 | |
| +use_shepherd() {
 | |
| +  # Is Shepherd running as PID 1?
 | |
| +  ps --no-headers -p 1 -o cmd | grep -q shepherd || return 1
 | |
| +
 | |
| +  type -p herd >/dev/null || return 1
 | |
| +
 | |
| +  # Does Shepherd know about Ganeti at all?
 | |
| +  if herd status | grep -q ganeti; then
 | |
| +    return 0
 | |
| +  fi
 | |
| +
 | |
| +  return 1
 | |
| +}
 | |
| +
 | |
|  # Prints path to PID file for a daemon.
 | |
|  daemon_pidfile() {
 | |
|    if [[ "$#" -lt 1 ]]; then
 | |
| @@ -261,6 +276,13 @@ check() {
 | |
|      else
 | |
|        return 1
 | |
|      fi
 | |
| +  elif use_shepherd; then
 | |
| +    activestate="$(herd status ${name})"
 | |
| +    if echo $activestate | grep -q Running ; then
 | |
| +      return 0
 | |
| +    else
 | |
| +      return 1
 | |
| +    fi
 | |
|    elif type -p start-stop-daemon >/dev/null; then
 | |
|      start-stop-daemon --stop --signal 0 --quiet \
 | |
|        --pidfile $pidfile --name "$name"
 | |
| @@ -291,6 +313,20 @@ start() {
 | |
|      return $?
 | |
|    fi
 | |
|  
 | |
| +  if use_shepherd; then
 | |
| +    if herd status "$name" | grep -q "disabled"; then
 | |
| +      # The Shepherd will disable a service that has stopped, even if it exits
 | |
| +      # gracefully.  Thus, we must re-enable it in case of a master failover.
 | |
| +      herd enable "${name}"
 | |
| +    fi
 | |
| +    # Note: unlike systemd, which happily starts a service and returns success
 | |
| +    # even if the daemon immediately exits, the Shepherd actually waits for it
 | |
| +    # to come up.  Thus, ignore the exit status from 'herd start' in case of
 | |
| +    # master daemons running on the wrong node, or ganeti-kvmd disabled, etc.
 | |
| +    herd start "${name}"
 | |
| +    return 0
 | |
| +  fi
 | |
| +
 | |
|    # Read $<daemon>_ARGS and $EXTRA_<daemon>_ARGS
 | |
|    eval local args="\"\$${ucname}_ARGS \$EXTRA_${ucname}_ARGS\""
 | |
|  
 | |
| @@ -336,6 +372,13 @@ stop() {
 | |
|  
 | |
|    if use_systemctl; then
 | |
|      systemctl stop "${name}.service"
 | |
| +  elif use_shepherd; then
 | |
| +    if herd status | grep -q "$name"; then
 | |
| +      herd stop "$name"
 | |
| +    else
 | |
| +      # Do not raise an error if the service has not been enabled.
 | |
| +      return 0
 | |
| +    fi
 | |
|    elif type -p start-stop-daemon >/dev/null; then
 | |
|      start-stop-daemon --stop --quiet --oknodo --retry 30 \
 | |
|        --pidfile $pidfile --name "$name"
 | |
| @@ -352,6 +395,9 @@ check_and_start() {
 | |
|      if use_systemctl; then
 | |
|        echo "${name} supervised by systemd but not running, will not restart."
 | |
|        return 1
 | |
| +    elif use_shepherd; then
 | |
| +      echo "${name} supervised by shepherd but not running, will not restart."
 | |
| +      return 1
 | |
|      fi
 | |
|  
 | |
|      start $name
 |