From 01c87f40af2f25f9a6be8e1a2013eb3605ccb261 Mon Sep 17 00:00:00 2001 From: Mathew Guest Date: Sun, 1 Mar 2020 21:36:06 -0700 Subject: [PATCH] first re-impl of python, still linux dependent because of rsync --- smileyface/_util.py | 3 +- smileyface/config.spec | 2 +- smileyface/hub_machine.py | 115 ++++++++++++++++++++++++++++++++------ 3 files changed, 101 insertions(+), 19 deletions(-) diff --git a/smileyface/_util.py b/smileyface/_util.py index 540053c..9c9aaa3 100644 --- a/smileyface/_util.py +++ b/smileyface/_util.py @@ -1,9 +1,10 @@ import hashlib +import functools def md5sum_file(filename): with open(filename, mode='rb') as f: d = hashlib.md5() - for buf in iter(partial(f.read, 128), b''): + for buf in iter(functools.partial(f.read, 128), b''): d.update(buf) h = d.hexdigest() return h diff --git a/smileyface/config.spec b/smileyface/config.spec index 4f66721..5c27b03 100644 --- a/smileyface/config.spec +++ b/smileyface/config.spec @@ -17,7 +17,7 @@ remote_game_host = string(max=255, default='') - remote_game_directory = string(max=255, default='') + remote_game_dir = string(max=255, default='') remote_redirect_host = string(max=255, default='') diff --git a/smileyface/hub_machine.py b/smileyface/hub_machine.py index f181459..bbad18e 100644 --- a/smileyface/hub_machine.py +++ b/smileyface/hub_machine.py @@ -1,14 +1,11 @@ from .config_editor import UnrealIniFile, GameIniSpecial -from . import config_editor -from . import _util +from ._util import md5sum_file from app_skellington import _util -from functools import partial import collections import configobj import configparser import glob -import hashlib import os import pathlib import subprocess @@ -168,7 +165,71 @@ ssh {remote_game_host} {remote_game_dir}/stop-server.sh Upload paks to redirect server. """ self.ctx.log['ut4'].info('Uploading redirects (maps, mutators, etc.) to target hub.') - pass + + project_dir = self.ctx.config['app']['project_dir'] + # paks_dir = os.path.join(project_dir, 'instance/LinuxServer/UnrealTournament/Content/Paks/') + paks_dir = os.path.join(project_dir, 'files/') # trailing slash required + remote_redirect_host = self.ctx.config['app']['remote_redirect_host'] + cwd = project_dir + cmd = ''' +rsync -rvz \ + --delete \ + --exclude "*.md5" \ + --exclude 'unused' \ + --exclude ".KEEP" \ + --exclude Mods.db \ + {paks_dir} {remote_redirect_host} + +'''\ +.format(**{ + 'paks_dir': paks_dir, + 'remote_redirect_host': remote_redirect_host, +}) + # subprocess.run(cmd, cwd=cwd) # should be invoke_command? no because gui will need subprocess.run + self._invoke_command(cmd) + + self._redirect_hide_passwords() + self._redirect_upload_script() + self._redirect_chown() + + def _redirect_hide_passwords(self): + project_dir = self.ctx.config['app']['project_dir'] + remote_redirect_host = self.ctx.config['app']['remote_redirect_host'] + # (on the server): + gameini="/srv/ut4-redirect.zavage.net/config/Game.ini" + engineini="/srv/ut4-redirect.zavage.net/config/Engine.ini" + + cmd = ''' +ssh mathewguest.com sed -i /ServerInstanceID=/c\ServerInstanceID=Hidden {gameini} +'''.format(gameini=gameini) + self._invoke_command(cmd) + + cmd = ''' +ssh mathewguest.com sed -i /RconPassword=/c\RconPassword=Hidden {engineini} +'''.format(engineini=engineini) + self._invoke_command(cmd) + + def _redirect_upload_script(self): + project_dir = self.ctx.config['app']['project_dir'] + remote_redirect_host = self.ctx.config['app']['remote_redirect_host'] + cmd = ''' +rsync -vz {project_dir}/ut4-server-ctl.sh {remote_redirect_host} +'''\ +.format(**{ + 'project_dir': project_dir, + 'remote_redirect_host': remote_redirect_host, +}) + # subprocess.run(cmd, cwd=cwd) # should be invoke_command? no because gui will need subprocess.run + self._invoke_command(cmd) + + def _redirect_chown(self): + project_dir = self.ctx.config['app']['project_dir'] + remote_redirect_host = self.ctx.config['app']['remote_redirect_host'] + + cmd = ''' +ssh mathewguest.com 'chown http.http /srv/ut4-redirect.zavage.net -R' +''' + self._invoke_command(cmd) def upload_server(self): """ @@ -193,32 +254,52 @@ rsync -ravzp \ --exclude "Saved/Crashes/*" \ --exclude "Saved/Logs/*" \ {project_dir}/instance/ \ - {remote_game_host}:{remote_game_dir}" + {remote_game_host}:{remote_game_dir} '''\ .format(**{ 'project_dir': project_dir, 'remote_game_host': remote_game_host, 'remote_game_dir': remote_game_dir }) - subprocess.run(cmd, cwd=cwd) # should be invoke_command? + cmd = cmd.replace(' ', '') + # subprocess.run(cmd, cwd=cwd) # should be invoke_command? no because gui will need subprocess.run + + self._invoke_command(cmd) # transfer #2 cmd = ''' rsync -avzp {project_dir}/ut4-server-ctl.sh {remote_game_host}:{remote_game_dir} -''' - subprocess.run(cmd, cwd=cwd) +'''\ +.format(**{ + 'project_dir': project_dir, + 'remote_game_host': remote_game_host, + 'remote_game_dir': remote_game_dir +}) + # subprocess.run(cmd, cwd=cwd) + self._invoke_command(cmd) # transfer #3 cmd = ''' scp {project_dir}/instance/ut4-server.service {remote_game_host}:/etc/systemd/system/ -''' - subprocess.run(cmd, cwd=cwd) +'''\ +.format(**{ + 'project_dir': project_dir, + 'remote_game_host': remote_game_host, + 'remote_game_dir': remote_game_dir +}) + # subprocess.run(cmd, cwd=cwd) + self._invoke_command(cmd) # transfer #4 cmd = ''' ssh {remote_game_host} chown ut4.ut4 {remote_game_dir} -R -''' - subprocess.run(cmd, cwd=cwd) +'''.format(**{ + 'remote_game_host': remote_game_host, + 'remote_game_dir': remote_game_dir + +}) + # subprocess.run(cmd, cwd=cwd) + self._invoke_command(cmd) def _first_run(self): self.ctx.log['ut4'].info('Starting instance once to get UID.') @@ -280,14 +361,14 @@ ssh {remote_game_host} chown ut4.ut4 {remote_game_dir} -R self.ctx.log['ut4'].info('Installing maps...') cmd = 'rsync -ravzp {src} {dst}'.format(**{ - 'src': '/'.join([project_dir, 'files/maps']), + 'src': '/'.join([project_dir, 'files/maps/']), 'dst': '/'.join([project_dir, 'instance/LinuxServer/UnrealTournament/Content/Paks/']) }) self._invoke_command(cmd) self.ctx.log['ut4'].info('Installing mutators...') cmd = 'rsync -ravzp {src} {dst}'.format(**{ - 'src': '/'.join([project_dir, 'files/mutators']), + 'src': '/'.join([project_dir, 'files/mutators/']), 'dst': '/'.join([project_dir, 'instance/LinuxServer/UnrealTournament/Content/Paks/']) }) self._invoke_command(cmd) @@ -309,7 +390,7 @@ ssh {remote_game_host} chown ut4.ut4 {remote_game_dir} -R for idx, filename in enumerate(files): # if idx > 5: # break - md5sum = _util.md5sum_file(filename) + md5sum = md5sum_file(filename) p = pathlib.Path(filename) relative_path = p.relative_to(mod_dir) pkg_basename = p.name @@ -380,7 +461,7 @@ ssh {remote_game_host} chown ut4.ut4 {remote_game_dir} -R 'redirect_protocol', 'redirect_url', 'remote_game_host', - 'remote_game_directory', + 'remote_game_dir', 'remote_redirect_host' ) for name in variable_names: