From ec4a373c8f05419e1b36560aaf3e2b09692fc927 Mon Sep 17 00:00:00 2001 From: zebra Date: Sat, 6 Jan 2024 06:09:58 +0000 Subject: [PATCH] Upload files to "/" --- LICENSE | 21 ++++ README.md | 110 +++++++++++++++++ rmmagent-linux.sh | 294 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 425 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 rmmagent-linux.sh diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0b856b9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 ZoLuSs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9b20b18 --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +# rmmagent-script +Script for one-line installing and update of tacticalRMM agent + +> Now x64, x86, arm64 and armv6 scripts are available but only x64 and i386 tested on Debian 11 and Debian 10 on baremetal, VM (Proxmox) and VPS(OVH) +> Tested on raspberry 2B+ with armv7l (chose armv6 on install) + +Script for other platform will be available futher as I adapt script on other platform. +Feel free to adapt script and submit me ! + +# Usage +Download the script that match your configuration + +### Tips + +Download script with this url: `https://git.zepheris.com/zepheris/LinuxRMM-Script/raw/branch/main/rmmagent-linux.sh` + +### Fix Blank Screen for Ubuntu Workstations (Ubuntu 16+) +Ubuntu uses the wayland display manager instead of the regular x11 server. This causes MeshCentral to show a blank screen when trying to access the remote desktop feature. You can't login, view or control the client. There is a neat fix for this, so don't worry: +``` +sudo sed -i '/WaylandEnable/s/^#//g' /etc/gdm3/custom.conf +sudo systemctl restart gdm +``` +This will cause your screen to go blank for a second. You will be able to use remote desktop afterwards. +> If you get an error like "file not found", you are probably still using Ubuntu 19 or below. On these machines, the config file will be located on /etc/gdm/custom.conf. Modify the command above accordingly. < +Please note that remote desktop features are only installed when you used the workstation agent. You may need to reinstall your mesh agent. + +## Install +To install agent launch the script with this arguement: + +```bash +./rmmagent-linux.sh install 'System type' 'Mesh agent' 'API URL' 'Client ID' 'Site ID' 'Auth Key' 'Agent Type' +``` +The compiling can be quite long, don't panic and wait few minutes... USE THE 'SINGLE QUOTES' IN ALL FIELDS! + +The argument are: + +2. System type + + Type of system. Can be 'amd64' 'x86' 'arm64' 'armv6' + +3. Mesh agent + + The url given by mesh for installing new agent. + Go to mesh.fqdn.com > Add agent > Installation Executable Linux / BSD / macOS > **Select the good system type** + Copy **ONLY** the URL with the quote. + +4. API URL + + Your api URL for agent communication usually https://api.fqdn.com. + +5. Client ID + + The ID of the client in wich agent will be added. + Can be view by hovering the name of the client in the dashboard. + +6. Site ID + + The ID of the site in wich agent will be added. + Can be view by hovering the name of the site in the dashboard. + +7. Auth Key + + Authentification key given by dashboard by going to dashboard > Agents > Install agent (Windows) > Select manual and show + Copy **ONLY** the key after *--auth*. + +8. Agent Type + + Can be *server* or *workstation* and define the type of agent. + +### Example +```bash +./rmmagent-linux.sh install amd64 "https://mesh.fqdn.com/meshagents?id=XXXXX&installflags=X&meshinstall=X" "https://api.fqdn.com" 3 1 "XXXXX" server +``` + +## Update + +Simply launch the script that match your system with *update* as argument. + +```bash +./rmmagent-linux.sh update +``` + +## Uninstall +To uninstall agent launch the script with this arguement: + +```bash +./rmmagent-linux.sh uninstall 'Mesh FQDN' 'Mesh ID' +``` +Note: Single quotes must be around the Mesh ID for it to uninstall the mesh agent properly + +The argument are: + +2. Mesh FQDN + + Example of FQDN: mesh.fqdn.com + +3. Mesh ID + + The ID given by mesh for installing new agent. + Go to mesh.fqdn.com > Add agent > Linux / BSD (Uninstall) > Copy **ONLY** the last value with the single quotes. + You are looking for a 64 charaters long value of random letter case, numbers, and special characters. + +### Example +```bash +./rmmagent-linux.sh uninstall mesh.fqdn.com 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' +``` + +### WARNING +- You should **only** attempt this if the agent removal feaure on TacticalRMM is not working. +- Running uninstall will **not** remove the connections from the TacticalRMM and MeshCentral Dashboard. You will need to manually remove them. It only forcefully removes the agents from your linux box. diff --git a/rmmagent-linux.sh b/rmmagent-linux.sh new file mode 100644 index 0000000..2ba226b --- /dev/null +++ b/rmmagent-linux.sh @@ -0,0 +1,294 @@ +#!/bin/bash +check_zip=$(which unzip 2> /dev/null) +if [[ $check_zip == "" || $check_zip =~ .*"no unzip".* ]]; then + echo "unzip could not be found. Please install unzip." + exit 0 +fi + +if [[ $1 == "" ]]; then + echo "First argument is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "help" ]]; then + echo "There is help but more information is available at github.com/ZoLuSs/rmmagent-script" + echo "" + echo "List of INSTALL argument (no argument name):" + echo "Arg 1: 'install'" + echo "Arg 2: System type 'amd64' 'x86' 'arm64' 'armv6'" + echo "Arg 3: Mesh agent URL" + echo "Arg 4: API URL" + echo "Arg 5: Client ID" + echo "Arg 6: Site ID" + echo "Arg 7: Auth Key" + echo "Arg 8: Agent Type 'server' or 'workstation'" + echo "" + echo "List of UPDATE argument (no argument name)" + echo "Arg 1: 'update'" + echo "Arg 2: System type 'amd64' 'x86' 'arm64' 'armv6'" + echo "" + echo "List of UNINSTALL argument (no argument name):" + echo "Arg 1: 'uninstall'" + echo "Arg 2: Mesh agent FQDN (i.e. mesh.domain.com)" + echo "Arg 3: Mesh agent id (The id needs to have single quotes around it)" + echo "" + exit 0 +fi + +if [[ $1 != "install" && $1 != "update" && $1 != "uninstall" ]]; then + echo "First argument can only be 'install' or 'update' or 'uninstall' !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $2 == "" ]]; then + echo "Argument 2 (System type) is empty !" + echo "Type help for more information" + exit 1 +fi + + +if [[ $1 == "update" && $2 == "" ]]; then + echo "Argument 2 (System type) is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $2 != "amd64" && $2 != "x86" && $2 != "arm64" && $2 != "armv6" ]]; then + echo "This argument can only be 'amd64' 'x86' 'arm64' 'armv6' !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $3 == "" ]]; then + echo "Argument 3 (Mesh agent URL) is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $4 == "" ]]; then + echo "Argument 4 (API URL) is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $5 == "" ]]; then + echo "Argument 5 (Client ID) is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $6 == "" ]]; then + echo "Argument 6 (Site ID) is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $7 == "" ]]; then + echo "Argument 7 (Auth Key) is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $8 == "" ]]; then + echo "Argument 8 (Agent Type) is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "install" && $8 != "server" && $8 != "workstation" ]]; then + echo "First argument can only be 'server' or 'workstation' !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "uninstall" && $2 == "" ]]; then + echo "Argument 2 (Mesh agent FQDN) is empty !" + echo "Type help for more information" + exit 1 +fi + +if [[ $1 == "uninstall" && $3 == "" ]]; then + echo "Argument 3 (Mesh agent id) is empty !" + echo "Type help for more information" + exit 1 +fi + +## Setting var for easy scription +system=$2 +mesh_url=$3 +rmm_url=$4 +rmm_client_id=$5 +rmm_site_id=$6 +rmm_auth=$7 +rmm_agent_type=$8 +## Uninstall var for easy scription +mesh_fqdn=$2 +mesh_id=$3 + +go_url_amd64="https://go.dev/dl/go1.20.11.linux-amd64.tar.gz" +go_url_x86="https://go.dev/dl/go1.20.11.linux-386.tar.gz" +go_url_arm64="https://go.dev/dl/go1.20.11.linux-arm64.tar.gz" +go_url_armv6="https://go.dev/dl/go1.20.11.linux-armv6l.tar.gz" + +function go_install() { + if ! command -v go &> /dev/null; then + ## Installing golang + case $system in + amd64) + wget -O /tmp/golang.tar.gz $go_url_amd64 + ;; + x86) + wget -O /tmp/golang.tar.gz $go_url_x86 + ;; + arm64) + wget -O /tmp/golang.tar.gz $go_url_arm64 + ;; + armv6) + wget -O /tmp/golang.tar.gz $go_url_armv6 + ;; + esac + + tar -xvzf /tmp/golang.tar.gz -C /usr/local/ + rm /tmp/golang.tar.gz + export GOPATH=/usr/local/go + export GOCACHE=/root/.cache/go-build + + echo "Golang Install Done !" + else + echo "Go is already installed" + fi +} + +function agent_compile() { + ## Compiling and installing tactical agent from github + echo "Agent Compile begin" + wget -O /tmp/rmmagent.zip "https://github.com/amidaware/rmmagent/archive/refs/heads/master.zip" + unzip /tmp/rmmagent -d /tmp/ + rm /tmp/rmmagent.zip + cd /tmp/rmmagent-master + case $system in + amd64) + env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o /tmp/temp_rmmagent + ;; + x86) + env CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w" -o /tmp/temp_rmmagent + ;; + arm64) + env CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w" -o /tmp/temp_rmmagent + ;; + armv6) + env CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags "-s -w" -o /tmp/temp_rmmagent + ;; + esac + + cd /tmp + rm -R /tmp/rmmagent-master +} + +function update_agent() { + systemctl stop tacticalagent + + cp /tmp/temp_rmmagent /usr/local/bin/rmmagent + rm /tmp/temp_rmmagent + + systemctl start tacticalagent +} +function install_agent() { + cp /tmp/temp_rmmagent /usr/local/bin/rmmagent + /tmp/temp_rmmagent -m install -api $rmm_url -client-id $rmm_client_id -site-id $rmm_site_id -agent-type $rmm_agent_type -auth $rmm_auth + rm /tmp/temp_rmmagent + + cat << "EOF" > /etc/systemd/system/tacticalagent.service +[Unit] +Description=Tactical RMM Linux Agent +[Service] +Type=simple +ExecStart=/usr/local/bin/rmmagent -m svc +User=root +Group=root +Restart=always +RestartSec=5s +LimitNOFILE=1000000 +KillMode=process +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload + systemctl enable --now tacticalagent + systemctl start tacticalagent +} + +function install_mesh() { + ## Installing mesh agent + wget -O /tmp/meshagent $mesh_url + chmod +x /tmp/meshagent + mkdir /opt/tacticalmesh + /tmp/meshagent -install --installPath="/opt/tacticalmesh" + rm /tmp/meshagent + rm /tmp/meshagent.msh +} + +function check_profile () { + source /etc/environment + profile_file="/root/.profile" + path_count=$(cat $profile_file | grep -o "export PATH=/usr/local/go/bin" | wc -l) + if [[ $path_count -ne 0 ]]; then + echo "Removing incorrect \$PATH variable\(s\)" + sed -i "/export\ PATH\=\/usr\/local\/go\/bin/d" $profile_file + fi + + path_count=$(cat $profile_file | grep -o "export PATH=\$PATH:/usr/local/go/bin" | wc -l) + if [[ $path_count -ne 1 ]]; then + echo "Fixing \$PATH Variable" + sed -i "/export\ PATH\=\$PATH\:\/usr\/local\/go\/bin/d" $profile_file + echo "export PATH=\$PATH:/usr/local/go/bin" >> $profile_file + fi + source $profile_file +} + +function uninstall_agent() { + systemctl stop tacticalagent + systemctl disable tacticalagent + rm /etc/systemd/system/tacticalagent.service + systemctl daemon-reload + rm /usr/local/bin/rmmagent + rm /etc/tacticalagent + sed -i "/export\ PATH\=\$PATH\:\/usr\/local\/go\/bin/d" /root/.profile +} + +function uninstall_mesh() { + (wget "https://$mesh_fqdn/meshagents?script=1" -O /tmp/meshinstall.sh || wget "https://$mesh_fqdn/meshagents?script=1" --no-proxy -O /tmp/meshinstall.sh) + chmod 755 /tmp/meshinstall.sh + (/tmp/meshinstall.sh uninstall https://$mesh_fqdn $mesh_id || /tmp/meshinstall.sh uninstall uninstall uninstall https://$mesh_fqdn $mesh_id) + rm /tmp/meshinstall.sh + rm meshagent + rm meshagent.msh +} + +case $1 in +install) + check_profile + go_install + install_mesh + agent_compile + install_agent + echo "Tactical Agent Install is done" + exit 0;; +update) + check_profile + go_install + agent_compile + update_agent + echo "Tactical Agent Update is done" + exit 0;; +uninstall) + check_profile + uninstall_agent + uninstall_mesh + echo "Tactical Agent Uninstall is done" + echo "You may need to manually remove the agents orphaned connections on TacticalRMM and MeshCentral" + exit 0;; +esac