ogclone-engine/client/shared/scripts/launchOgagentInstaller.py

147 lines
5.6 KiB
Python

import os
import sys
import subprocess
import json
#!/usr/bin/env python3
def download_file(url, output):
try:
if subprocess.call(['which', 'curl'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) == 0:
subprocess.check_call(['curl', '-k', '-f', '--connect-timeout', '1', '-o', output, url])
else:
subprocess.check_call(['wget', '--no-check-certificate', '-T', '1', '-O', output, url])
except subprocess.CalledProcessError:
return False
return True
def main():
prog = os.path.basename(__file__)
if len(sys.argv) == 2 and sys.argv[1] == "help":
show_help(prog)
if not callable(globals().get('ogRaiseError')):
raise_error(f"{prog}: it can only be executed by an ogLive client.")
if len(sys.argv) not in [3, 4]:
raise_error(f"{prog} ndisk npart [adminuser]")
ndisk, npart = sys.argv[1], sys.argv[2]
windowsadmin = sys.argv[3] if len(sys.argv) == 4 else None
mntdir = ogMount(ndisk, npart)
if not mntdir:
sys.exit(1)
ogversion = None
try:
response = subprocess.check_output(['curl', '-k', '-f', '--connect-timeout', '1', '-o', '-', f'https://{ogGetServerIp()}/opengnsys/rest/info'])
ogversion = json.loads(response).get('version')
except subprocess.CalledProcessError:
pass
if not ogversion:
raise_error(f"GET /rest/info")
os_type = ogGetOsType(ndisk, npart)
if os_type == "Windows":
hive = ogGetHivePath(mntdir, windowsadmin)
if not hive:
raise_error(f"{ndisk} {npart} {windowsadmin}/NTUSER.DAT")
ogagentfile = f"OGAgentSetup-{ogversion.replace('pre', '')}.exe"
tmpdir = ogGetPath(f"{mntdir}/Windows/Temp")
if "opengnsys agent" in ogListSoftware(ndisk, npart).lower():
print("OGAgent for Windows is already installed, you need to uninstall it before re-install.")
else:
if download_file(f"https://{ogGetServerIp()}/opengnsys/descargas/{ogagentfile}", f"{tmpdir}/{ogagentfile}"):
try:
subprocess.check_call(['hivexsh', '-w'], input=f"""
load {hive}
cd \\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce
setval 1
Install OGAgent
string:C:\\Windows\\Temp\\{ogagentfile} /S /server {ogGetServerIp()}
commit
close
exit
""".encode())
print(f'Scheduled OGAgent installation after "{windowsadmin}" logon')
print(" (for connection problems, check configuration file).")
except subprocess.CalledProcessError:
raise_error(f"{ndisk} {npart} .../{windowsadmin}/NTUSER.DAT")
else:
raise_error(f"{ndisk} {npart} /Windows/Temp/{ogagentfile}")
elif os_type == "Linux":
if "ogagent" in ogListSoftware(ndisk, npart).lower():
print("OGAgent for Linux is already installed, you need to uninstall it before re-install.")
else:
systemddir = f"{mntdir}/lib/systemd"
if not (os.path.isdir(systemddir) and os.path.isdir(systemddir.replace('/lib', '/etc'))):
raise_error(f"{ndisk} {npart} systemd")
ogagentfile = None
code = None
if os.path.exists(f"{mntdir}/etc/debian_version"):
ogagentfile = f"ogagent_{ogversion.replace('pre', '')}_all.deb"
code = f"if ! dpkg -l ogagent &>/dev/null && [ -f /var/tmp/{ogagentfile} ]; then apt-get update; apt-get install -y /var/tmp/{ogagentfile}; fi"
elif os.path.exists(f"{mntdir}/etc/redhat-release"):
ogagentfile = f"ogagent-{ogversion.replace('pre', '')}-1.noarch.rpm"
code = f"if ! rpm -q ogagent &>/dev/null && [ -f /var/tmp/{ogagentfile} ]; then yum install -y /var/tmp/{ogagentfile}; fi"
if not ogagentfile:
raise_error(f"{ndisk} {npart} ogagent")
tmpdir = f"{mntdir}/var/tmp"
if download_file(f"https://{ogGetServerIp()}/opengnsys/descargas/{ogagentfile}", f"{tmpdir}/{ogagentfile}"):
with open(f"{systemddir}/systemd-launchogagent", 'w') as f:
f.write(f"""#!/bin/bash
[ $EUID = 0 ] || exit 4
start() {{
{code}
sed -i "0,/remote=/ s,remote=.*,remote=https://{ogGetServerIp()}/opengnsys/rest/," /usr/share/OGAgent/cfg/ogagent.cfg
service ogagent start
}}
restart() {{
service ogagent stop
if [ -f /var/tmp/{ogagentfile} ]; then
apt-get update
apt-get install -y --reinstall /var/tmp/{ogagentfile}
fi
sed -i "0,/remote=/ s,remote=.*,remote=https://{ogGetServerIp()}/opengnsys/rest/," /usr/share/OGAgent/cfg/ogagent.cfg
service ogagent start
}}
case "$1" in
start|restart) "$1" ;;
esac
""")
os.chmod(f"{systemddir}/systemd-launchogagent", 0o755)
with open(f"{systemddir}/system/launchogagent.service", 'w') as f:
f.write(f"""[Unit]
Description=Installing and configuring OGAgent
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/lib/systemd/systemd-launchogagent start
TimeoutStartSec=5min
[Install]
WantedBy=multi-user.target
""")
os.symlink(f"/lib/systemd/system/launchogagent.service", f"{systemddir.replace('/lib', '/etc')}/system/multi-user.target.wants")
print("Scheduled OGAgent installation at next boot")
print(" (process will be executed in the background, do not shutdown until finish).")
else:
raise_error(f"{ndisk} {npart} /var/tmp/{ogagentfile}")
elif os_type == "MacOS":
print("OGAgent installer for macOS is not implemented yet.")
else:
raise_error(f"{ndisk} {npart}")
if __name__ == "__main__":
main()