#!/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' < ./meshagent.msh >> ./meshagent2.msh
  # Add the startup type to the file
  echo "StartupType=$starttype" >> ./meshagent2.msh
  mv ./meshagent2.msh ./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
    uninstall=$1
    url=$2
    meshid=$3
    if [[ $4 =~ ^--WebProxy= ]];
    then
       webproxy=$4
    fi



    meshidlen=${#meshid}
    if [ $meshidlen -gt 63 ]
    then
      machineid=0
      machinetype=$( uname -m )

      # If we have 3 arguments...
      if [ $# -ge 4 ] &&  [ -z "$webproxy" ]
      then
        # echo "Computer type is specified..."
        machineid=$4
      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
            bitlen=$( getconf LONG_BIT )
            if [ $bitlen == '32' ] 
            then
                # 32 bit OS
                machineid=5
            else
                # 64 bit OS
                machineid=6
            fi
          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
        if [ $machinetype == 'riscv64' ]
        then
          # RISC-V 64 bit
          machineid=45
        fi
        # Add more machine types, detect KVM support... here.
      fi

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

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

DownloadAgent() {
  uninstall=$1
  url=$2
  meshid=$3
  machineid=$4
  echo "Downloading agent #$machineid..."
  wget $url/meshagents?id=$machineid -O ./meshagent || curl -L --output ./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 -O ./meshagent || curl -L --output ./meshagent $url/meshagents?id=$machineid
  fi

  if [ $? -eq 0 ]
  then
    echo "Agent downloaded."
    # TODO: We could check the meshagent sha256 hash, but best to authenticate the server.
    chmod 755 ./meshagent
    wget $url/meshsettings?id=$meshid -O ./meshagent.msh || curl -L --output ./meshagent.msh $url/meshsettings?id=$meshid

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

    if [ $? -eq 0 ]
    then
      # Update the .msh file and run the agent installer/uninstaller
      if [ $uninstall == 'uninstall' ] || [ $uninstall == 'UNINSTALL' ]
      then
        # Uninstall the agent
        ./meshagent -fulluninstall
      else
        # Install the agent
        UpdateMshFile
        ./meshagent -fullinstall --copy-msh=1 $webproxy
      fi
    else
      echo "Unable to download device group settings at: $url/meshsettings?id=$meshid."
    fi
  else
    echo "Unable to download agent at: $url/meshagents?id=$machineid."
  fi
}


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

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