#!/bin/bash

##########################################################################
# systemctl-wrapper - Wrapper for sysv init scripts simulating systemctl #
# Author: Quique Molina                                                  # 
# Contact: emolina@prosodie.com                                          #
# License: GPL 2.0                                                       #
# ########################################################################
VERSION=1.0

# Variable with start-up scripts
path_scripts="/etc/init.d"

# Function to simulate the units and sockets of systemctl
function systemctl_units() {
  list_units=$(ls -1 ${path_scripts})
  echo "UNIT"
  for unit in ${list_units} ; do
    echo "${unit}  --> Script for control boot, stop and status of ${unit} service"
  done
}

# Check if the scripts directory exists
function check_dir_scripts() {
  if [ -d "${path_scripts}" ] ; then
    echo > /dev/null
  else
    echo ""
    echo "systemctl (wrapper) v${VERSION} for sysvinit scripts"
    echo ""
    echo "Failed to check ${path_scripts} directory. Not found"
    echo ""
    exit
  fi
}

# Function to display help
function systemctl_help() {
echo ""
echo "systemctl [OPTIONS...] {COMMAND} ..."
echo ""
echo "-h --help           Show this help"
echo "   --version        Show package version"
echo ""
echo "Unit Commands:"
echo "  list-units                      List loaded units"
echo "  list-sockets                    List loaded sockets ordered by address"
echo "  start NAME...                   Start (activate) one or more units"
echo "  stop NAME...                    Stop (deactivate) one or more units"
echo "  reload NAME...                  Reload one or more units"
echo "  restart NAME...                 Start or restart one or more units"
echo "  status NAME...                  Show runtime status of one or more units"
echo ""
echo "Unit File Commands:"
echo "  list-unit-files                 List installed unit files"
echo "  enable NAME...                  Enable one or more unit files"
echo "  disable NAME...                 Disable one or more unit files"
echo ""
echo "System Commands:"
echo "  halt                            Shut down and halt the system"
echo "  poweroff                        Shut down and power-off the system"
echo "  reboot                          Shut down and reboot the system"
echo ""
}

# Function to display the version
function systemctl_version() {
  echo ""
  echo "systemctl (wrapper) v${VERSION} for sysvinit scripts"
  echo ""
}

# Function for command mapping
function systemctl_map() {
  # Mapping of the start command
  if [ "${1}" == "start" ] ; then
    if [ -f "${path_scripts}/${2}" ] ; then
      "${path_scripts}/${2}" start
    else
      echo "Failed to start ${2}: Unit not found."
    fi
  # Mapping of the enable command
  elif [ "${1}" == "enable" ] ; then
    if [ -f "${path_scripts}/${2}" ] ; then
      "${path_scripts}/${2}" start
    else
      echo "Failed to enable ${2}: Unit not found."
    fi
  # Mapping of the stop command
  elif [ "${1}" == "stop" ] ; then
    if [ -f "${path_scripts}/${2}" ] ; then
      "${path_scripts}/${2}" stop
    else
      echo "Failed to stop ${2}: Unit not found."
    fi
  # Mapping of the disable command
  elif [ "${1}" == "disable" ] ; then
    if [ -f "${path_scripts}/${2}" ] ; then
      "${path_scripts}/${2}" stop
    else
      echo "Failed to disable ${2}: Unit not found."
    fi
  # Mapping of the reload command
  elif [ "${1}" == "reload" ] ; then
    if [ -f "${path_scripts}/${2}" ] ; then
      "${path_scripts}/${2}" reload
    else
      echo "Failed to reload ${2}: Unit not found."
    fi
  # Mapping of the restart command
  elif [ "${1}" == "restart" ] ; then
    if [ -f "${path_scripts}/${2}" ] ; then
      "${path_scripts}/${2}" restart
    else
      echo "Failed to restart ${2}: Unit not found."
    fi
  # Mapping of the status command
  elif [ "${1}" == "status" ] ; then
    if [ -f "${path_scripts}/${2}" ] ; then
      "${path_scripts}/${2}" status
    else
      echo "Failed to status ${2}: Unit not found."
    fi
  # Mapping of the list-units command
  elif [ "${1}" == "list-units" ] ; then
    systemctl_units
  # Mapping of the list-sockets command
  elif [ "${1}" == "list-sockets" ] ; then
    netstat -putan | grep LISTEN
  # Mapping of the list-unit-files command
  elif [ "${1}" == "list-unit-files" ] ; then
    systemctl_units
  # Mapping of the help command
  elif [ "${1}" == "--help" ] ; then
    systemctl_help
  elif [ "${1}" == "-h" ] ; then
    systemctl_help
  # Mapping of the version command
  elif [ "${1}" == "--version" ] ; then
    systemctl_version
  # Mapping of the reboot command
  elif [ "${1}" == "reboot" ] ; then
    reboot
  # Mapping of the halt command
  elif [ "${1}" == "halt" ] ; then
    halt
  # Mapping of the poweroff command
  elif [ "${1}" == "poweroff" ] ; then
    poweroff
  else
    echo "Unknown operation '${1}'."
  fi
}

# Start the script
check_dir_scripts
if [ -z "${1}" ] ; then
  systemctl_units
else
  systemctl_map "${1}" "${2}"
fi
