# Remove some system services that don't make sense in live sessions.
# The user can add more items by declaring space separated RM_SYSTEM_SERVICES
# or RM_THIN_SYSTEM_SERVICES lists in lts.conf. The RM_THIN_SYSTEM_SERVICES list
# is ignored by fat clients.
# KEEP_SYSTEM_SERVICES is a space separated whitelist of services.

allowed_services() {
    local service description

    echo "$@" | while read service description; do
        case " $KEEP_SYSTEM_SERVICES " in
            *" $service "*)
                ;;
            *)
                echo -n " $service"
                ;;
        esac
    done
}

# $RM_SYSTEM_SERVICES are removed for all clients
rm_services="$RM_SYSTEM_SERVICES $(allowed_services "
alsa-restore          # Restore sound card(s') mixer state(s)
alsa-store            # Save sound card(s') mixer state(s)
exim4                 # exim4 Mail Transport Agent
grub-common           # Record successful boot for GRUB
lightdm               # Light Display Manager
ModemManager          # Modem manager
modemmanager          # Modem manager (older versions)
nbd-client            # Network Block Device client (we use nbd-disconnect)
plymouth-stop         # Hide the splash screen
rfkill-store          # Store software rfkill state
tty2                  # Getty
tty3                  # Getty
tty4                  # Getty
tty5                  # Getty
tty6                  # Getty
unattended-upgrades   # Check if unattended upgrades are being applied
urandom               # Save and restore random seed between restarts
ureadahead            # Read required files in advance
ureadahead-other      # Read required files in advance for other mountpoints
")"

# $RM_THIN_SYSTEM_SERVICES are removed for thin clients
if ! boolean_is_true "$LTSP_FATCLIENT"; then
    rm_services="$rm_services $RM_THIN_SYSTEM_SERVICES $(allowed_services "
acpid                 # ACPI daemon
apparmor              # AppArmor initialization
apport                # Automatic crash report generation
atd                   # Deferred execution scheduler
avahi-daemon          # mDNS/DNS-SD daemon
bluetooth             # Bluetooth daemon
brltty                # Braille terminal driver
cups                  # CUPS Printing spooler and server
cups-browsed          # CUPS browse daemon
kerneloops            # Collects and submits kernel crash signatures
network-manager       # Network connection manager
ufw                   # Uncomplicated Firewall
upstart-socket-bridge # Bridge socket events into upstart
")"

    # For low RAM thin clients, disable whatever isn't essential for booting
    memtotal=$(sed -n 's/MemTotal: *\([0-9]*\) .*/\1/p' /proc/meminfo)
    memtotal=$(($memtotal / 1024))
    RM_RAM_THRESHOLD=${RM_RAM_THRESHOLD:-128}
    if [ "$memtotal" -le "$RM_RAM_THRESHOLD" ]; then
        rm_services="$rm_services $RM_LOW_RAM_SERVICES $(allowed_services "
anacron               # anac(h)ronistic cron
dbus                  # D-Bus system message bus
cron                  # Regular background program processing daemon
rsyslog               # System logging daemon
tty1                  # Getty
upstart-udev-bridge   # Bridge udev events into upstart
")"
    fi
fi

# We don't need NFS-related services if we're not using nfs
if ! grep -q nfs /etc/fstab; then
    rm_services="$rm_services $(allowed_services "
idmapd                # NFSv4 id <-> name mapper
portmap               # RPC portmapper replacement
rpcbind-boot          # RPC portmapper replacement
")"
fi

for service in $rm_services; do
    rm -f /etc/rc?.d/???"$service" "/etc/init.d/$service" "/etc/init/$service.conf"
done

if [ -x /bin/systemctl ]; then
   for service in $rm_services ; do
       systemctl --quiet disable "$service"
   done
fi
