[Initng-svn] r3627 - initng-ifiles/trunk

svn at initng.thinktux.net svn at initng.thinktux.net
Sun Apr 2 13:06:12 CEST 2006


Author: deac
Date: Sun Apr  2 13:06:11 2006
New Revision: 3627

Modified:
   initng-ifiles/trunk/Makefile.am
   initng-ifiles/trunk/gen_system_runlevel
Log:
new gen_system_runlevel

Modified: initng-ifiles/trunk/Makefile.am
==============================================================================
--- initng-ifiles/trunk/Makefile.am	(original)
+++ initng-ifiles/trunk/Makefile.am	Sun Apr  2 13:06:11 2006
@@ -13,7 +13,7 @@
 
 install-data-hook:
 if GEN_RUNLEVEL
-	$(top_srcdir)/gen_system_runlevel $(DESTDIR)
+	$(top_srcdir)/gen_system_runlevel -all -destdir="$(DESTDIR)"
 endif
 	@echo 
 	@echo "To make sure, initng uses the freshly installed ifiles, run:"

Modified: initng-ifiles/trunk/gen_system_runlevel
==============================================================================
--- initng-ifiles/trunk/gen_system_runlevel	(original)
+++ initng-ifiles/trunk/gen_system_runlevel	Sun Apr  2 13:06:11 2006
@@ -1,22 +1,32 @@
 #!/bin/sh
 
 add_service_to_list() {
-	echo "Add Service ${2} to list ${1}" >&2
-	echo "${2}" >>"${CONFDIR}/${1}"
+	echo "Add Service ${1}" >&2
+	echo "${1}"
 }
 
 add_services_to_list() {
 	list="${1}"
 	shift
-	echo "Add Services ${*} to list ${list}"
 	for s
+	do	add_service_to_list "${list}" "${s}"
+	done
+}
+
+# something like which, but simplier
+find_exe() {
+	for p in ${search_path}
 	do
-		echo "${s}"
-	done >>"${CONFDIR}/${list}"
+		if [ -e "${p}/${1}" ]
+		then
+			return 0
+		fi
+	done
+	return 1
 }
 
-#This function works fine on Fedora. Feel free to use it, just don't
-#sabotage it ;-)
+# This function works fine on Fedora. Feel free to use it, just don't
+# sabotage it ;-)
 get_default_sysvinit_runlevel() {
 	if [ -f /etc/inittab ]
 	then
@@ -26,106 +36,111 @@
 	fi
 }
 
-#See comment above
-#Usage: Send sysvinit runlevel as first argument. The function will scan through
-#the runlevel and add all started services to initng's runlevels (depending
-#on the second argument, which is normally "default" or "system". The third
-#argument is the directory in which to check if the initng service exists,
-#this would normally be "daemon" or "system"
+# See comment above
+# Usage:
+#	Send sysvinit runlevel as first argument. The function will scan through
+#	the runlevel and add all started services to initng's runlevels (depending
+#	on the second argument, which is normally "default" or "system". The third
+#	argument is the directory in which to check if the initng service exists,
+#	this would normally be "daemon" or "system"
 copy_sysvinit_services() {
-	if [ -d "/etc/rc${1}.d" ]
+	if [ -d "/etc/rc${2}.d" ]
 	then
-		for i in /etc/rc${1}.d/S*
+		for i in /etc/rc${2}.d/S*
 		do
-			sname=`basename $i`
+			sname=`basename ${i}`
 			sname=${sname##S[0-9][0-9]}
-			if [ -f "/etc/initng/${3}/${sname}.i" ]
-			then
-				grep "${3}/${sname}" "${CONFDIR}/${2}" >/dev/null && \
-						add_service_to_list "${2}" "${3}/${sname}"
-			fi
+			[ -f "/etc/initng/${1}/${sname}.i" ] && \
+				echo "${1}/${sname}"
 		done
 	fi
 }
 
-#On what distro's does this function do anything good? On Fedora it's just crap...
+copy_gentoo_services() {
+	for s in /etc/runlevels/${2}/*
+	do
+		[ -f "/etc/initng/${1}/${s}.i" ] && \
+			echo "${1}/${s}"
+	done
+}
+
+# On what distro's does this function do anything good?
+# On Fedora it's just crap...
 check_and_add() {
-	[ -f /etc/fedora-release ] && return 0
+	[ "${dist}" = fedora ] && return 0
 
 	TARGET=""
-	ls /etc/rc2.d/S*${1}* >/dev/null 2>&1 TARGET="${2}"
-	ls /etc/runlevels/*/*${1}* >/dev/null 2>&1 && TARGET="${2}"
+	ls /etc/rc2.d/S*${2}* >/dev/null 2>&1 TARGET="${1}"
+	ls /etc/runlevels/*/*${2}* >/dev/null 2>&1 && TARGET="${1}"
 
-	if [ "$TARGET" ]
-	then
-		add_service_to_list "${3}" "${2}"
-		return 1
-	fi
-	return 0
+	echo "${TARGET}"
 }
 
 gen_system() {
-	rm "${CONFDIR}/system.virtual" 2>/dev/null
-	add_services_to_list system.virtual system/udev system/clock \
-		system/hostname system/urandom system/usb
+	local services="system/udev system/clock \
+		system/hostname system/urandom system/usb"
 
-	[ -f /etc/fedora-release ] && \
-		add_services_to_list system.virtual system/audit system/anacron
+	[ fedora = "${dist}" ] && \
+		services="${services} system/audit system/anacron"
 
 	if [ \( -x /usr/sbin/readahead -o -x /sbin/readahead \) -a -e /etc/readahead ]
 	then
-		add_service_to_list system.virtual system/readahead
-		echo "NOTE, if you have /usr mounted on another partition:"
-		echo "  cp /usr/sbin/readahead /sbin/readahead"
+		services="${services} system/readahead"
+		echo "NOTE, if you have /usr mounted on another partition:" >&2
+		echo "  cp /usr/sbin/readahead /sbin/readahead" >&2
 	fi
 
-	[ -e /etc/raidtab ] && add_service_to_list system.virtual system/sraid
+	[ -e /etc/raidtab ] && services="${services} system/sraid"
 
 	if [ -f /etc/debian_version ]
 	then
-		add_service_to_list system.virtual "system/console-screen"
+		services="${services} system/console-screen"
 		[ -x /etc/init.d/ifupdown ] && \
-			add_service_to_list system.virtual system/ifupdown-debian
+			services="${services} system/ifupdown-debian"
 	else
-		add_service_to_list system.virtual system/consolefont
+		services="${services} system/consolefont"
 	fi
 
-	## Getty:
-	if which agetty
-	then
-		add_service_to_list system.virtual "daemon/agetty"
-	elif which getty
-	then
-		add_service_to_list system.virtual "daemon/getty"
-	elif which mingetty
+	# Getty:
+	if find_exe agetty
+	then services="${services} daemon/agetty"
+	elif find_exe getty
+	then services="${services} daemon/getty"
+	elif find_exe mingetty
+	then services="${services} daemon/mingetty"
+	else
+		echo "Failed to find getty/agetty/mingetty, you must set that " \
+			"manually in /etc/initng/system.virtual" >&2
+	fi
+
+	if [ "${dist}" = gentoo ]
 	then
-		add_service_to_list system.virtual "daemon/mingetty"
+		copy_gentoo_services system boot
 	else
-		echo "Failed to find getty/agetty/mingetty, you must set that manually in /etc/initng/system.virtual"
+		get_default_sysvinit_runlevel
+		copy_sysvinit_services ${?} system.virtual system
 	fi
 
-	get_default_sysvinit_runlevel
-	copy_sysvinit_services ${?} "system.virtual" "system"
+	echo ${services} | tr ' ' '\n' | sort -u
 }
 
 gen_default() {
-	add_service_to_list default.runlevel system
+	services="${services} system"
 
-	#Add default.runlevel services for Fedora
-	if [ -f /etc/fedora-release ]
-	then
-		add_services_to_list default.runlevel \
-			daemon/dcron daemon/hald daemon/klogd daemon/portmap
+	# Add ${1} services for Fedora
+	case "${dist}" in
+	fedora)
+		services="${services} daemon/dcron daemon/hald daemon/klogd daemon/portmap"
 
-		#Check network interfaces
+		# Check network interfaces
 		for i in $(ls /etc/sysconfig/network-scripts/ifcfg* | \
 			LANG=C sed -e '/\(ifcfg-lo\|rpmsave\|:\|rpmorig\|rpmnew\)/d' \
 				-e '/\(~\|\.bak\)$/d')
 		do
-			if grep "ONBOOT=yes" "${i}" > /dev/null
+			if grep "ONBOOT=yes" "${i}" >/dev/null
 			then
 				i=$(basename "${i}")
-				add_service_to_list default.runlevel "net/${i#ifcfg-}"
+				services="${services} net/${i#ifcfg-}"
 			fi
 		done
 
@@ -135,20 +150,19 @@
 		[ "${selinuxfs}" -a "`cat /proc/self/attr/current`" != 'kernel' \
 			-a -r "${selinuxfs}/enforce" \
 			-a "`cat ${selinuxfs}/enforce`" -eq 1 ] && \
-				add_services_to_list default.runlevel \
-						system/selinux/dev system/selinux/relabel
+				services="${services} system/selinux/dev system/selinux/relabel"
 
-		#Below is because dm isn't started as SysVinit service in fedora :-/
+		# Below is because dm isn't started as SysVinit service in fedora :-/
 		if get_default_sysvinit_runlevel
 		then
 			preferred=
 			if [ -f /etc/sysconfig/desktop ]
 			then
 				. /etc/sysconfig/desktop
-				if [ "${DISPLAYMANAGER}" = GNOME ] && which gdm
+				if [ "${DISPLAYMANAGER}" = GNOME ] && find_exe gdm >/dev/null
 				then
 					preferred=gdm
-				elif [ "${DISPLAYMANAGER}" = KDE ] && which kdm
+				elif [ "${DISPLAYMANAGER}" = KDE ] && find_exe kdm >/dev/null
 				then
 					preferred=kdm
 				elif [ -n "${DISPLAYMANAGER}" ]
@@ -157,127 +171,208 @@
 				fi
 			fi
 			[ "${preferred}" ] || preferred=xdm
-			add_service_to_list default.runlevel "daemon/${preferred}"
+			services="${services} daemon/${preferred}"
 		fi
-	fi
-
-	#Add the correct dm for Debian/Ubuntu
-	if [ -f /etc/debian_version ]
-	then
+	;;
+	# Add the 
+	gentoo)
+	;;
+	# Add the correct dm for Debian/Ubuntu
+	debian)
 		dm=`sed -ne 's:^/usr/bin/::p' /etc/X11/default-display-manager`
 		case "${dm}" in
-			gdm) add_service_to_list default.runlevel daemon/gdm ;;
-			kdm) add_service_to_list default.runlevel daemon/kdm ;;
-			xdm) add_service_to_list default.runlevel daemon/xdm ;;
+			gdm) services="${services} daemon/gdm" ;;
+			kdm) services="${services} daemon/kdm" ;;
+			xdm) services="${services} daemon/xdm" ;;
 		esac  
-	else
-		check_and_add gdm daemon/gdm default.runlevel
-		check_and_add kdm daemon/kdm default.runlevel
-		check_and_add xdm daemon/xdm default.runlevel
-	fi
-
-	check_and_add ssh daemon/sshd default.runlevel
-	check_and_add samba daemon/samba default.runlevel
+	;;
+	*)
+		services="${services}
+			$(check_and_add daemon/gdm gdm)
+			$(check_and_add daemon/kdm kdm)
+			$(check_and_add daemon/xdm xdm)"
+	;;
+	esac
+
+	services="${serices}
+		$(check_and_add daemon/sshd ssh)
+		$(check_and_add daemon/samba samba)"
 
-	#add acpid
-	which acpid && add_service_to_list default.runlevel daemon/acpid
+	# add acpid
+	find_exe acpid >/dev/null && services="${services} daemon/acpid"
 
-	#add dbus
-	which dbus-daemon && add_service_to_list default.runlevel daemon/dbus
+	# add dbus
+	find_exe dbus-daemon >/dev/null && services="${services} daemon/dbus"
 
 	# add hald
 	ls /etc/dbus*/event.d/*hal* >/dev/null 2>&1 && \
-			add_service_to_list default.runlevel daemon/hald
+			services="${services} daemon/hald"
 
 	# Add cron
-	if which cron
+	if find_exe cron
 	then
-		check_and_add cron daemon/vixie-cron default.runlevel
-	elif which dcron
+		services="${services} $(check_and_add daemon/vixie-cron cron)"
+	elif find_exe dcron
 	then
-		check_and_add cron daemon/dcron default.runlevel
+		services="${services} $(check_and_add daemon/dcron cron)"
 	fi
 
 	# Networks thru ifplugd
-	which ifplugd && \
-		add_service_to_list default.runlevel daemon/ifplugd
-	if [ -f /etc/debian_version ]
+	find_exe ifplugd && \
+		services="${services} daemon/ifplugd"
+	if [ "${dist}" = debian ]
 	then
-		add_service_to_list default.runlevel net/all
-	elif [ ! -f /etc/fedora-release ]
+		services="${services} net/all"
+	elif [ ! "${dist}" = fedora ]
 	then
-		add_service_to_list default.runlevel net/eth0
+		services="${services} net/eth0"
 	fi
 		
 	# Alsasound
 	[ -d /proc/asound ] && \
-			add_service_to_list default.runlevel system/alsasound
+			services="${services} system/alsasound"
+	if echo "${services}" | grep -q 'system/alsasound'
+	then
+		echo ${services} | grep -q 'system/coldplug' || 
+			services="${services} system/alsasound/cards"
+		services="${services} system/alsasound/mixerstate"
+	fi
 
 	# Speed freq.
 	[ -d /sys/devices/system/cpu/cpu0/cpufreq ] && \
-			add_service_to_list default.runlevel system/speedstep
+			services="${services} system/speedstep"
 
 	# Laptop Mode (Less hardrive on battery)
-	if which laptop-mode || which laptop_mode
-	then
-		add_service_to_list default.runlevel system/laptop-mode
+	if find_exe laptop-mode || find_exe laptop_mode
+	then services="${services} system/laptop-mode"
 	fi
 
-	#Syslogd
-	if which syslog-ng >/dev/null
-	then
-		add_service_to_list default.runlevel daemon/syslog-ng
-	elif which metalog >/dev/null
-	then
-		add_service_to_list default.runlevel daemon/metalog
-	elif which syslogd >/dev/null
-	then
-		add_service_to_list default.runlevel daemon/syslogd
+	# Syslogd
+	if find_exe syslog-ng >/dev/null
+	then services="${services} daemon/syslog-ng"
+	elif find_exe metalog >/dev/null
+	then services="${services} daemon/metalog"
+	elif find_exe syslogd >/dev/null
+	then services="${services} daemon/syslogd"
 	fi
 
 	# These calls SHOULD work on every distro, I've just tested it on Fedora
 	# this far. If/when this works on all other thistros, we should be able
 	# to obsolete some of the crap above. /Daniel
-	if [ ! -f /etc/debian_version ]
+	if ! [ "${dist}" = debian -o "${dist}" = gentoo ]
 	then
 		get_default_sysvinit_runlevel
-		copy_sysvinit_services ${?} default.runlevel daemon
+		copy_sysvinit_services ${?} daemon
+	fi
+
+	echo "${services}" | sed -e 's/[ 	][ 	]*/\n/g' | grep -v '^$' | sort -u
+}
+
+gen_gentoo_list() {
+	echo 'Not implemented' >&2
+	return 1
+}
+
+create_list() {
+	if
+		if [ "${overwrite}" ]
+		then true
+		else [ \! -e "${CONFDIR}/${1}" ]
+		fi
+	then
+		echo "Automatically generating ${1}" >&2
+		if [ "${1}" = system.virtual ]
+		then gen_system  >"${CONFDIR}/${1}"
+		elif [ "${1}" = default.runlevel ]
+		then gen_default >"${CONFDIR}/${1}"
+		elif [ "${dist}" = gentoo ]
+		then gen_gentoo_list ${1}
+		else return 1
+		fi
+	else
+		echo "${1} already exists, skipping..."
+		return 1
 	fi
 }
 
-export overwrite=
-if [ "${1}" = "--overwrite" ]
-then
-	export overwrite=true
+overwrite=
+all=
+search_path=
+dist=
+# DESTDIR=${DESTDIR}
+
+[ -e /etc/gentoo-release ] && dist=gentoo
+[ -e /etc/debian_version ] && dist=debian
+[ -e /etc/fedora-release ] && dist=fedora
+
+while [ ${#} -gt 0 ]
+do
+	case "${1}" in
+	-all) all=true ;;
+	-overwrite) overwrite=true ;;
+	-dist=*) dist=${1#-dist=} ;;
+	-dist)
+		shift
+		dist=${1}
+		;;
+	-path=*) search_path=${1#-path=} ;;
+	-path)
+		shift
+		search_path=${1}
+		;;
+	-destdir=*) DESTDIR=${1#-destdir=} ;;
+	-destdir)
+		shift
+		DESTDIR=${1}
+		;;
+	-confdir=*) CONFDIR=${1#-confdir=} ;;
+	-confdir)
+		shift
+		CONFDIR=${1}
+		;;
+	-help)
+		exe=$(basename "${0}")
+		echo 'USAGE:' >&2
+		echo " ${exe} [-overwrite] [-path=PATH] [-destdir=PATH] [-confdir=PATH] -all" >&2
+		echo " ${exe} [-overwrite] [-path=PATH] [-destdir=PATH] [-confdir=PATH] FILE" >&2
+		echo " ${exe} -help" >&2
+		exit 0
+		;;
+	--)
+		shift
+		break
+		;;
+	*) break ;;
+	esac
 	shift
-fi
-# Find and set DESTDIR
+done
 
-[ "${DESTDIR}" ] || export DESTDIR="${1}"
-export CONFDIR="${DESTDIR}/etc/initng"
+[ "${CONFDIR}" ] || CONFDIR="${DESTDIR}/etc/initng"
 mkdir -p "${CONFDIR}"
 
-echo "Automatically generating system.virtual and default.runlevel"
-
-if	if [ "${overwrite}" ]
-	then true
-	else [ -e "${CONFDIR}/system.virtual" ]
-	fi
-then gen_system
-else
-	skipped=true
-	echo 'system.virtual already exists, skipping...'
+# for find_exe
+[ "${search_path}" ] || search_path=$(echo $(
+	for dir in $()/bin /sbin /usr/bin /usr/sbin /usr/kde/\*/bin \
+			/usr/kde/\*/sbin /opt/bin /opt/sbin /opt/\*/bin /opt/\*/sbin
+	do [ "$(echo ${dir})" ] && echo ${dir}
+	done | grep -v '*')
+)
+
+if [ "${all}" ]
+then 
+	if [ "${dist}" = gentoo ]
+	then
+		set -- $({
+			ls --color=none /etc/runlevels | sed -e 's/$/.runlevel/'
+			echo system.virtual
+		} | grep -v boot.runlevel | sort -u)
+	else set -- system.virtual default.runlevel
+	fi
 fi
 
-if	if [ "${overwrite}" ]
-	then true
-	else [ -e "${CONFDIR}/default.runlevel" ]
-	fi
-then gen_default
-else
-	skipped=true
-	echo 'default.runlevel already exists, skipping...'
-fi
+for l
+do create_list ${l}
+done
 
 [ "${skipped}" ] && \
 	echo "Runlevels already exists, force overwrite with: '${0}' --overwrite"


More information about the Initng-svn mailing list