#!/bin/sh

# Find and set DESTDIR
if [ ! -n ${DESTDIR} ]; then
    export DESTDIR="$1"
    if [ ! -n ${DESTDIR} ] || [ "${DESTDIR}" = "overwrite" ]; then
       export DESTDIR=""
       #if unset, it will do $DESTDIR/wherever, resulting in /
    fi
fi
mkdir -p "${DESTDIR}/etc/initng"

#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
    deflevel=`grep ":initdefault:" /etc/inittab`
    deflevel=${deflevel##id:}
    deflevel=${deflevel%%:initdefault:}
    return $deflevel
  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"
copy_sysvinit_services() {
  if [ -d /etc/rc${1}.d ]; then
    for i in /etc/rc${1}.d/S* ; do
      sname=`basename $i`
      sname=${sname##S[0-9][0-9]}
      if [ -f /etc/initng/${3}/${sname}.i ]; then
        grep "${3}/${sname}" ${DESTDIR}/etc/initng/${2}.runlevel > /dev/null
        if [ $? -ne 0 ]; then
          echo "${3}/${sname}" >> ${DESTDIR}/etc/initng/${2}.runlevel
        fi
      fi
    done
  fi
}

#On what distro's does this function do anything good? On Fedora it's just crap...
check_and_add() {
  if [ -f /etc/fedora-release ]; then
    return 0
  fi
  TARGET=""
  ls /etc/rc2.d/S*$1* >/dev/null 2>&1
  if [ "$?" = "0" ] ; then
      TARGET="$2"
  fi
    
  ls /etc/runlevels/*/*$1* >/dev/null 2>&1
  if [ "$?" = "0" ] ; then
      TARGET="$2"
  fi
    
  if [ ! -z "$TARGET" ]; then
      echo "Adding $2 to $3.runlevel"
      echo "$2" >> "${DESTDIR}/etc/initng/$3.runlevel"
  return 1
  fi
  return 0
}


gen_system() {
cat <<END_OF_SYSTEM >${DESTDIR}/etc/initng/system.runlevel
system/udev
system/initial
system/mountroot
system/mountfs
system/bootmisc
system/clock
system/hostname
system/modules
system/static-modules
system/hdparm
system/keymaps
system/urandom
system/usb
system/swap
net/lo
END_OF_SYSTEM

if [ -f /etc/fedora-release ]; then
  echo "system/audit" >> ${DESTDIR}/etc/initng/system.runlevel
  echo "system/anacron" >> ${DESTDIR}/etc/initng/system.runlevel
fi

if [ -x /usr/sbin/readahead ] || [ -x /sbin/readahead ]; then
  if [ -e /etc/readahead ]; then
      echo "Adding readahead, NOTE, if you have /usr mounted on another partition:"
      echo "  cp /usr/sbin/readahead /sbin/readahead"
      echo "system/readahead" >> ${DESTDIR}/etc/initng/system.runlevel
  fi
fi

if [ -e /etc/raidtab ]; then
    echo "system/sraid" >> ${DESTDIR}/etc/initng/system.runlevel
fi

if [ -f /etc/debian_version ] ; then
    echo "system/console-screen" >> ${DESTDIR}/etc/initng/system.runlevel
else
    echo "system/consolefont" >> ${DESTDIR}/etc/initng/system.runlevel
fi

## Getty:
if [ -x /sbin/agetty ]; then
  echo "daemon/agetty" >> ${DESTDIR}/etc/initng/system.runlevel
elif [ -x /sbin/getty ]; then
  echo "daemon/getty" >> ${DESTDIR}/etc/initng/system.runlevel
elif [ -x /sbin/mingetty ]; then
  echo "daemon/mingetty" >> ${DESTDIR}/etc/initng/system.runlevel
else
  echo "Failed to find getty/agetty/mingetty, you must set that manually in /etc/initng/system.runlevel"
fi

get_default_sysvinit_runlevel
copy_sysvinit_services $? "system" "system"
}

gen_default() {
echo "system" > ${DESTDIR}/etc/initng/default.runlevel

#Add default services for Fedora
if [ -f /etc/fedora-release ]; then
echo "daemon/dcron
daemon/hald
daemon/klogd
daemon/portmap" >> ${DESTDIR}/etc/initng/default.runlevel

  #Check network interfaces
  interfaces=`ls /etc/sysconfig/network-scripts/ifcfg* | \
	    LANG=C sed -e '/\(ifcfg-lo\|rpmsave\|:\|rpmorig\|rpmnew\)/d' \
		       -e '/\(~\|\.bak\)$/d'`
  for i in $interfaces ; do
    grep "ONBOOT=yes" $i > /dev/null
    if [ $? -eq 0 ]; then
      i=`basename $i`
      i=${i##ifcfg-}
      echo "net/$i" >> ${DESTDIR}/etc/initng/default.runlevel
    fi
  done

  # Check SELinux status
  selinuxfs=`LC_ALL=C awk '/ selinuxfs / { print $2 }' /proc/mounts`
  SELINUX=
  if [ -n "$selinuxfs" ] && [ "`cat /proc/self/attr/current`" != "kernel" ]; then
    if [ -r $selinuxfs/enforce -a `cat $selinuxfs/enforce` -eq 1 ] ; then
      echo "system/selinux/dev" >> ${DESTDIR}/etc/initng/default.runlevel
      echo "system/selinux/relabel" >> ${DESTDIR}/etc/initng/default.runlevel
    fi
  fi

  #Below is because dm isn't started as SysVinit service in fedora :-/
  get_default_sysvinit_runlevel
  if [ $? == "5" ]; then
    preferred=
    if [ -f /etc/sysconfig/desktop ]; then
      . /etc/sysconfig/desktop
      if [ "$DISPLAYMANAGER" = GNOME ] && [ -x /usr/sbin/gdm ] ; then
        preferred=gdm
      elif [ "$DISPLAYMANAGER" = KDE ] && [ -x /usr/sbin/kdm ] ; then
        preferred=kdm
      elif [ -n "$DISPLAYMANAGER" ] ; then
        preferred=$DISPLAYMANAGER
      fi
    fi
    if [ ! -n "$preferred" ] ; then
      preferred=gdm
    fi
    echo "Adding daemon/${preferred} to default.runlevel"
    echo "daemon/${preferred}" >> ${DESTDIR}/etc/initng/default.runlevel
  fi
fi

#Add the correct dm for Debian/Ubuntu
if [ -f /etc/debian_version ] ; then
    dm=`sed -ne 's:^/usr/bin/::p' /etc/X11/default-display-manager`
    case "${dm}" in
        gdm) 
            echo "Adding daemon/gdm to default.runlevel"
            echo "daemon/gdm" >> ${DESTDIR}/etc/initng/default.runlevel
        ;;
        kdm)
            echo "Adding daemon/kdm to default.runlevel"
           echo "daemon/kdm" >> ${DESTDIR}/etc/initng/default.runlevel
        ;;
        xdm)
           echo "Adding daemon/xdm to default.runlevel"
            echo "daemon/xdm" >> ${DESTDIR}/etc/initng/default.runlevel
        ;;
    esac  
else
    check_and_add gdm daemon/gdm default
    check_and_add kdm daemon/kdm default
    check_and_add xdm daemon/xdm default
fi

check_and_add ssh daemon/sshd default
check_and_add samba daemon/samba default

#add acpid
if [ -e /usr/sbin/acpid ]; then
    echo "Adding daemon/acpid to default.runlevel"
    echo "daemon/acpid" >> ${DESTDIR}/etc/initng/default.runlevel
fi

#add dbus
if [ -e /usr/bin/dbus-daemon ]; then
    echo "Adding daemon/dbus to default.runlevel"
    echo "daemon/dbus" >> ${DESTDIR}/etc/initng/default.runlevel
fi

# add hald
if ls /etc/dbus*/event.d/*hal* >/dev/null 2>&1; then
    echo "Adding daemon/hald to default.runlevel"
    echo "daemon/hald" >> ${DESTDIR}/etc/initng/default.runlevel
fi

# Add cron
if [ -e /usr/sbin/cron ]; then
    check_and_add cron daemon/vixie-cron default
elif [ -e /usr/sbin/dcron ]; then
    check_and_add cron daemon/dcron default
fi

# Networks thru ifplugd
if [ -e /usr/sbin/ifplugd ]; then
    echo "Adding daemon/ifplugd to default.runlevel"
	echo "daemon/ifplugd" >> ${DESTDIR}/etc/initng/default.runlevel
fi
if [ -f /etc/debian_version ] ; then
   echo "Adding net/all to default.runlevel"
   echo "net/all" >> ${DESTDIR}/etc/initng/default.runlevel
elif [ ! -f /etc/fedora-release ]; then
    echo "Adding net/eth0 to default.runlevel"
	echo "net/eth0" >> ${DESTDIR}/etc/initng/default.runlevel
fi
    
# Alsasound
if [ -d /proc/asound ]; then
        echo "Adding system/alsasound to default.runlevel"
	echo "system/alsasound" >> ${DESTDIR}/etc/initng/default.runlevel
fi

# Speed freq.
if [ -d /sys/devices/system/cpu/cpu0/cpufreq ]; then
        echo "Adding system/speedfreq to default.runlevel"
	echo "system/speedstep" >> ${DESTDIR}/etc/initng/default.runlevel
fi

# Laptop Mode (Less hardrive on battery)
if [ -e /usr/sbin/laptop-mode ] || [ -e /usr/sbin/laptop_mode ]; then
        echo "Adding system/laptop-mode to default.runlevel"
	echo "system/laptop-mode" >> ${DESTDIR}/etc/initng/default.runlevel
fi

#Syslogd
if [ -e /sbin/syslogd ]; then
        echo "Adding daemon/syslogd to default.runlevel"
        echo "daemon/syslogd" >> ${DESTDIR}/etc/initng/default.runlevel
fi

if [ -x /usr/sbin/syslog-ng ] && [ -z "$(grep 'daemon/syslogd' ${DESTDIR}/etc/initng/default.runlevel)" ] ; then
	echo "Adding daemon/syslog-ng to default.runlevel"
	echo "daemon/syslog-ng" >> ${DESTDIR}/etc/initng/default.runlevel
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 ] ; then
    get_default_sysvinit_runlevel
    copy_sysvinit_services $? "default" "daemon"
fi
}

echo "Automatically generating system,runlevel and default.runlevel"
if [ -e ${DESTDIR}/etc/initng/system.runlevel ] && [ -e ${DESTDIR}/etc/initng/default.runlevel ] && [ "$1" != "overwrite" ]; then
  echo "Runlevels already exists, force overwrite with ./gen_system_runlevel overwrite"
#  exit 0
fi

if [ -e ${DESTDIR}/etc/initng/system.runlevel ] && [ "$1" != "overwrite" ]; then
  if which udevd >/dev/null 2>/dev/null && pgrep udevd >/dev/null && ! grep system/udev ${DESTDIR}/etc/initng/system.runlevel; then
    echo "Adding system/udev to existing system runlevel"
    echo "system/udev" >> ${DESTDIR}/etc/initng/system.runlevel
  else
    echo "system.runlevel already exists, skipping..."
  fi
else
  gen_system
fi

if [ -e ${DESTDIR}/etc/initng/default.runlevel ] && [ "$1" != "overwrite" ]; then
  echo "default.runlevel already exists, skipping..."
else
  gen_default
fi

echo "Done generating files."
