You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							141 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
	
	
							141 lines
						
					
					
						
							4.3 KiB
						
					
					
				#!/bin/sh | 
						|
# --- SDE-COPYRIGHT-NOTE-BEGIN --- | 
						|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch. | 
						|
# | 
						|
# Filename: package/.../runit/stone_mod_runit.sh | 
						|
# Copyright (C) 2008 The OpenSDE Project | 
						|
# Copyright (C) 2004 - 2006 The T2 SDE Project | 
						|
# | 
						|
# More information can be found in the files COPYING and README. | 
						|
# | 
						|
# This program is free software; you can redistribute it and/or modify | 
						|
# it under the terms of the GNU General Public License as published by | 
						|
# the Free Software Foundation; version 2 of the License. A copy of the | 
						|
# GNU General Public License can be found in the file COPYING. | 
						|
# --- SDE-COPYRIGHT-NOTE-END --- | 
						|
# [MAIN] 30 runit Service Manager (runit) | 
						|
 | 
						|
SYSCONFDIR=/etc | 
						|
 | 
						|
if [ -d /service ]; then | 
						|
	SERVICEDIR=/service | 
						|
else | 
						|
	SERVICEDIR=/var/service | 
						|
fi | 
						|
 | 
						|
if [ -x /command/sv ]; then | 
						|
	SV=/command/sv | 
						|
else | 
						|
	SV=sv | 
						|
fi | 
						|
 | 
						|
declare -a runit_installed | 
						|
declare -a runit_available | 
						|
 | 
						|
runit_audit() { | 
						|
	local entry= available= count= | 
						|
 | 
						|
	entry=0 | 
						|
	while read service; do | 
						|
		runit_available[$entry*3+0]="${service##*/}" # service name | 
						|
		runit_available[$entry*3+1]="$service" # service's real location | 
						|
		runit_available[$entry*3+2]= # installed | 
						|
		(( entry++ )) | 
						|
	done < <( find $SYSCONFDIR -type f -name run | sort | sed -e '/\/log\/run$/d;' -e 's,/run$,,g' ) | 
						|
	entry=0 | 
						|
	(( count=${#runit_available[@]}/3 )) | 
						|
	while read service; do | 
						|
		runit_installed[$entry*3+0]="${service##*/}" # service name | 
						|
		runit_installed[$entry*3+1]="$( readlink -f "$service" )" # real location | 
						|
		runit_installed[$entry*3+2]= | 
						|
		available=0 | 
						|
		while [ $available -lt $count ]; do | 
						|
			if [ ${runit_available[$available*3+1]} = ${runit_installed[$entry*3+1]} ]; then | 
						|
				runit_available[$available*3+2]=$entry | 
						|
				runit_installed[$entry*3+2]=$available | 
						|
				break | 
						|
			fi | 
						|
			(( available++ )) | 
						|
		done | 
						|
		(( entry++ )) | 
						|
	done < <( find $SERVICEDIR -maxdepth 1 -type l | sort ) | 
						|
} | 
						|
 | 
						|
# u|d|o|p|c|h|a|i|q|1|2|t|k|x|e | 
						|
runit_svc() { | 
						|
	local service=$1 errno=0 name= dir= | 
						|
	local prefix=${service%/*} location=$(readlink -f $service) | 
						|
 | 
						|
	while [ $errno -eq 0 ]; do | 
						|
		local actions= | 
						|
		for dir in $service/ $service/log/; do | 
						|
			if [ -d $dir ]; then | 
						|
				name=${dir#$prefix/} | 
						|
				[ "$actions" ] && actions="$actions '' ''" | 
						|
 | 
						|
				actions="$actions 'service: $dir' '' \ | 
						|
					'  stats: $( $SV status $dir/ 2> /dev/null | sed -e 's,;.*,,' -e 's,:.*:,,' -e 's,(.*) ,,' )' ''" | 
						|
				actions="$actions 'sv up $name (up)'   '$SV up $dir; sleep 1'" | 
						|
				actions="$actions 'sv down $name(down)' '$SV down $dir; sleep 1'" | 
						|
				actions="$actions 'sv hup $name (HUP)'  '$SV hup $dir; sleep 1'" | 
						|
			fi | 
						|
		done | 
						|
		eval "gui_menu runit_sc_menu '$service -> $location' $actions" | 
						|
		errno=$? | 
						|
	done | 
						|
} | 
						|
 | 
						|
runit_install() { | 
						|
	local entry="$1" count= | 
						|
	(( count=${#runit_installed[@]}/3 )) | 
						|
	runit_installed[$count*3+0]="${runit_available[$entry*3+0]}" | 
						|
	runit_installed[$count*3+1]="${runit_available[$entry*3+1]}" | 
						|
	runit_installed[$count*3+2]=$entry | 
						|
	runit_available[$entry*3+2]=$count | 
						|
	ln -snf "${runit_available[$entry*3+1]}" $SERVICEDIR/"${runit_available[$entry*3+0]}" | 
						|
} | 
						|
 | 
						|
main() { | 
						|
	local errno=0 | 
						|
	local entry= count= | 
						|
 | 
						|
	runit_audit | 
						|
	while [ $errno -eq 0 ]; do | 
						|
		local available= installed= | 
						|
		local text= action= | 
						|
		local i= stats= | 
						|
		declare -a stats | 
						|
		(( count=${#runit_installed[@]}/3 )); entry=0 | 
						|
		while [ $entry -lt $count ]; do | 
						|
			text="${runit_installed[$entry*3+0]}" | 
						|
			action="runit_svc $SERVICEDIR/${runit_installed[$entry*3+0]} ${runit_installed[$entry*3+1]}" | 
						|
			stats[0]=; stats[1]=; i=0 | 
						|
			while read stats[i++]; do :; done < <( \ | 
						|
				$SV status \ | 
						|
				"${runit_installed[$entry*3+1]}" 2> /dev/null | \ | 
						|
				sed -e 's,; ,\n,' | sed -e 's,:.*:,,' -e 's,(.*) ,,' ) | 
						|
			[ "${stats[0]}" ] && text="$text [${stats[0]}]" || text="$text [ERROR]" | 
						|
			[ "${stats[1]}" ] && text="$text log: [${stats[1]}]" | 
						|
			[ "${runit_installed[$entry*3+2]}" ] || text="$text [FOREIGN]" | 
						|
			installed="$installed '$text' '$action'" | 
						|
			(( entry++ )) | 
						|
		done | 
						|
		(( count=${#runit_available[@]}/3 )); entry=0 | 
						|
		while [ $entry -lt $count ]; do | 
						|
			if [ -z "${runit_available[$entry*3+2]}" ]; then | 
						|
				text="${runit_available[$entry*3+0]} (${runit_available[$entry*3+1]})" | 
						|
				if [ -e "$SERVICEDIR/${runit_available[$entry*3+0]}" ]; then | 
						|
					text="$text [BLOCKED]" | 
						|
					action= | 
						|
				else | 
						|
					action="runit_install $entry" | 
						|
				fi | 
						|
				available="$available '$text' '$action'" | 
						|
			fi | 
						|
			(( entry++ )) | 
						|
		done | 
						|
 | 
						|
		eval "gui_menu runit 'Simple $SERVICEDIR Manager' $installed '' '' $available" | 
						|
		errno=$? | 
						|
	done | 
						|
}
 | 
						|
 |