#!/usr/bin/env bash

CheckStartupType() {
  # 1 = Systemd
  # 2 = Upstart
  # 3 = init.d
  # 5 = BSD

  # echo "Checking if Linux or BSD Platform"
  plattype=`uname | awk '{ tst=tolower($0);a=split(tst, res, "bsd"); if(a==1) { print "LINUX"; } else { print "BSD"; }}'`
  if [[ $plattype == 'BSD' ]]
   then return 5;
  fi

  # echo "Checking process autostart system..."
  starttype1=`cat /proc/1/status | grep 'Name:' | awk '{ print $2; }'`
  starttype2=`ps -p 1 -o command= | awk '{a=split($0,res," "); b=split(res[a],tp,"/"); print tp[b]; }'`
 
  # Systemd
  if [[ $starttype1 == 'systemd' ]]
    then return 1;
  elif [[ $starttype1 == 'init'  ||  $starttype2 == 'init' ]]
	then
		if [ -d "/etc/init" ]
			then
				return 2;
			else
				return 3;
		fi
  fi
  return 0;
}



# Add "StartupType=(type)" to .msh file
UpdateMshFile() {
  # Remove all lines that start with "StartupType="
  sed '/^StartupType=/ d' < /usr/local/mesh/meshagent.msh >> /usr/local/mesh/meshagent2.msh
  # Add the startup type to the file
  echo "StartupType=$starttype" >> /usr/local/mesh/meshagent2.msh
  mv /usr/local/mesh/meshagent2.msh /usr/local/mesh/meshagent.msh
}

CheckInstallAgent() {
  # echo "Checking mesh identifier..."
  if [ -e "/usr/local" ]
  then
    installpath="/usr/local/mesh"
  else
    installpath="/usr/mesh"
  fi
  if [ $# -ge 2 ]
  then
    url=$1
    meshid=$2
    meshidlen=${#meshid}
    if [ $meshidlen -eq 64 ]
    then
      machineid=0
      machinetype=$( uname -m )

      # If we have 3 arguments...
      if [ $# -ge 3 ]
      then
        # echo "Computer type is specified..."
        machineid=$3
      else
        # echo "Detecting computer type..."
        if [ $machinetype == 'x86_64' ] || [ $machinetype == 'amd64' ]
        then
		  if [ $starttype -eq 5 ]
		  then
			# FreeBSD x86, 64 bit
			machineid=30
		  else
			# Linux x86, 64 bit
			machineid=6
		  fi
        fi
        if [ $machinetype == 'x86' ] || [ $machinetype == 'i686' ] || [ $machinetype == 'i586' ]
        then
			if [ $starttype -eq 5 ]
			then
				# FreeBSD x86, 32 bit
				machineid=31
			else
				# Linux x86, 32 bit
				machineid=5
			fi
        fi
        if [ $machinetype == 'armv6l' ] || [ $machinetype == 'armv7l' ]
        then
          # RaspberryPi 1 (armv6l) or RaspberryPi 2/3 (armv7l)
          machineid=25
        fi
        if [ $machinetype == 'aarch64' ]
        then
          # RaspberryPi 3B+ running Ubuntu 64 (aarch64)
          machineid=26
        fi
        # Add more machine types, detect KVM support... here.
      fi

      if [ $machineid -eq 0 ]
      then
        echo "Unsupported machine type: $machinetype."
      else
        DownloadAgent $url $meshid $machineid
      fi

    else
      echo "MeshID is not correct, must be 64 characters long."
    fi
  else
    echo "URI and/or MeshID have not been specified, must be passed in as arguments."
    return 0;
  fi
}

DownloadAgent() {
  url=$1
  meshid=$2
  machineid=$3
  # Create folder
  mkdir -p /usr/local/mesh
  cd /usr/local/mesh
  echo "Downloading Mesh agent #$machineid..."
  wget $url/meshagents?id=$machineid {{{wgetoptionshttps}}}-O /usr/local/mesh/meshagent || curl {{{curloptionshttps}}}--output /usr/local/mesh/meshagent $url/meshagents?id=$machineid

  # If it did not work, try again using http
  if [ $? != 0 ]
  then
    url=${url/"https://"/"http://"}
    wget $url/meshagents?id=$machineid {{{wgetoptionshttp}}}-O /usr/local/mesh/meshagent || curl {{{curloptionshttp}}}--output /usr/local/mesh/meshagent $url/meshagents?id=$machineid
  fi

  if [ $? -eq 0 ]
  then
    echo "Mesh agent downloaded."
    # TODO: We could check the meshagent sha256 hash, but best to authenticate the server.
    chmod 755 /usr/local/mesh/meshagent
    wget $url/meshsettings?id=$meshid {{{wgetoptionshttps}}}-O /usr/local/mesh/meshagent.msh || curl {{{curloptionshttps}}}--output /usr/local/mesh/meshagent.msh $url/meshsettings?id=$meshid

    # If it did not work, try again using http
    if [ $? -ne 0 ]
    then
      wget $url/meshsettings?id=$meshid {{{wgetoptionshttp}}}-O /usr/local/mesh/meshagent.msh || curl {{{curloptionshttp}}}--output /usr/local/mesh/meshagent.msh $url/meshsettings?id=$meshid
    fi

    if [ $? -eq 0 ]
    then
      UpdateMshFile
      if [ $starttype -eq 1 ]
      then
        # systemd
        if [ -d "/lib/systemd/system/" ]
        then
            echo -e "[Unit]\nDescription=MeshCentral Agent\n[Service]\nExecStart=/usr/local/mesh/meshagent\nStandardOutput=null\nRestart=always\nRestartSec=3\n[Install]\nWantedBy=multi-user.target\nAlias=meshagent.service\n" > /lib/systemd/system/meshagent.service
        else
            # Some distros have the systemd folder at a different place
            if [ -d "/usr/lib/systemd/system/" ]
            then
                echo -e "[Unit]\nDescription=MeshCentral Agent\n[Service]\nExecStart=/usr/local/mesh/meshagent\nStandardOutput=null\nRestart=always\nRestartSec=3\n[Install]\nWantedBy=multi-user.target\nAlias=meshagent.service\n" > /usr/lib/systemd/system/meshagent.service
            else
                echo "Unable to find systemd folder."
            fi
        fi
        systemctl enable meshagent
        systemctl start meshagent
        echo 'meshagent installed as systemd service.'
        echo 'To start service: sudo systemctl start meshagent'
        echo 'To stop service: sudo systemctl stop meshagent'
      elif [ $starttype -eq 3 ]
          then
          # initd
          wget $url/meshagents?script=2 {{{wgetoptionshttps}}}-O /etc/init.d/meshagent || curl {{{curloptionshttps}}}--output /etc/init.d/meshagent $url/meshagents?script=2
          chmod +x /etc/init.d/meshagent
          # creates symlinks for rc.d
          update-rc.d meshagent defaults
          service meshagent start
          echo 'meshagent installed as init.d service.'
          echo 'To start service: sudo service meshagent start'
          echo 'To stop service: sudo service meshagent stop'
      elif [ $starttype -eq 2 ]
          then
          # upstart
          echo -e "start on runlevel [2345]\nstop on runlevel [016]\n\nrespawn\n\nchdir /usr/local/mesh\nexec /usr/local/mesh/meshagent\n\n" > /etc/init/meshagent.conf
          initctl start meshagent
          echo 'meshagent installed as upstart/init.d service.'
          echo 'To start service: sudo initctl start meshagent'
          echo 'To stop service: sudo initctl stop meshagent'
	  elif [ $starttype -eq 5 ]
          then
		  # FreeBSD
          wget $url/meshagents?script=5 {{{wgetoptionshttps}}}-O /usr/local/etc/rc.d/meshagent || curl {{{curloptionshttps}}}--output /usr/local/etc/rc.d/meshagent $url/meshagents?script=5
          chmod +x /usr/local/etc/rc.d/meshagent
          service meshagent start
          echo 'meshagent installed as BSD service.'
          echo 'To start service: sudo service meshagent start'
          echo 'To stop service: sudo service meshagent stop'
      else
          # unknown
          echo "Unknown Service Platform Type. (ie: init, systemd, etc)"
          echo "Installing as Pseudo Service (Mesh Daemon)"
		  /usr/local/mesh/meshagent -exec "require('service-manager').manager.installService({name: 'meshagent', servicePath: process.execPath, files: ['/usr/local/mesh/meshagent.msh']});process.exit();"
		  /usr/local/mesh_daemons/daemon start meshagent
		  echo 'To start service: /usr/local/mesh_daemons/daemon start meshagent'
		  echo 'To stop service: /usr/local/mesh_daemons/daemon stop meshagent'
      fi
      echo "Mesh agent started."
    else
      echo "Unable to download mesh settings at: $url/meshsettings?id=$meshid."
    fi
  else
    echo "Unable to download mesh agent at: $url/meshagents?id=$machineid."
  fi
}

UninstallAgent() {
# Uninstall agent
  if [ -e "/usr/local" ]
  then
    installpath="/usr/local/mesh"
  else
    installpath="/usr/mesh"
  fi

  if [ $starttype -eq 1 ]
  then
    # systemd
    systemctl disable meshagent
    systemctl stop meshagent
    rm -f /sbin/meshcmd /lib/systemd/system/meshagent.service
    systemctl stop meshagentDiagnostic &> /dev/null
    rm -f /lib/systemd/system/meshagentDiagnostic.service &> /dev/null
  else
    if [ $starttype -eq 3 ]; then
        # initd
        service meshagent stop
        update-rc.d -f meshagent remove
        rm -f /sbin/meshcmd /etc/init.d/meshagent
        service meshagentDiagnostic stop &> /dev/null
        rm -f /etc/init.d/meshagentDiagnostic &> /dev/null
    elif [ $starttype -eq 2 ]; then
        # upstart 
        initctl stop meshagent
        rm -f /sbin/meshcmd 
        rm -f /etc/init/meshagent.conf
        rm -f /etc/rc2.d/S20mesh /etc/rc3.d/S20mesh /etc/rc5.d/S20mesh
        initctl stop meshagentDiagnostic &> /dev/null
        rm -f /etc/init/meshagentDiagnostic.conf &> /dev/null
    elif [ $starttype -eq 5 ]; then
		# FreeBSD
		service meshagent stop
		service meshagentDiagnostic stop &> /dev/null
		rm -f /usr/local/etc/rc.d/meshagent
		rm -f /usr/local/etc/rc.d/meshagentDiagnostic &> /dev/null
	fi
  fi

  if [ -e $installpath ]
  then
    rm -rf $installpath/*
    rmdir $installpath
  fi
  rm -rf /usr/local/mesh_services/meshagentDiagnostic &> /dev/null
  rm -f /etc/cron.d/meshagentDiagnostic_periodicStart &> /dev/null
  echo "Agent uninstalled."
}


CheckStartupType
starttype=$?
#echo "Type: $starttype"

currentuser=$( whoami )
if [ $currentuser == 'root' ]
then
  if [ $# -eq 0 ]
  then
    echo -e "This script will install or uninstall a mesh agent, usage:\n  $0 [serverurl] [meshid] (machineid)\n  $0 uninstall"
  else
    if [ $# -eq 1 ]
    then
      if [ $1 == 'uninstall' ] || [ $1 == 'UNINSTALL' ]
      then
        UninstallAgent
      fi
    else
      UninstallAgent
      CheckInstallAgent $1 $2 $3
    fi
  fi
else
  echo "Must be root to install or uninstall mesh agent."
fi
