fast-build-update-tool/internal/tools/update_script_generator_linux_fleet.go (63 lines of code) (raw):

package tools import ( "io" "path/filepath" "text/template" "github.com/aws/amazon-gamelift-toolkit/fast-build-update-tool/internal/config" ) // generateLinuxUpdateScript is used to generate an update script for a Linux fleet // updateOperation configures which type of update script will be generated func generateLinuxUpdateScript(writer io.Writer, executablePaths []string, localBuildZipPath, lockName string, updateOperation config.UpdateOperation) error { template, err := template.New("linux-update-template").Parse(linuxReplaceBuildTemplate) if err != nil { return err } return template.Execute(writer, map[string]string{ "ArchiveName": filepath.Base(localBuildZipPath), "ExecutablePaths": csvify(executablePaths), "IsReplaceBuild": getIsReplaceBuildTemplateValue(updateOperation), "LockName": lockName, }) } const linuxReplaceBuildTemplate = ` #!/bin/bash set -e ARCHIVE_NAME={{.ArchiveName}} EXE_PATHS={{.ExecutablePaths}} LOCKFILE="/tmp/{{.LockName}}.lock" OLD_IFS="$IFS" # Cleanup script at the end function cleanup { flock -u 200 exec 200>&- IFS="$OLD_IFS" rm -f $ARCHIVE_NAME rm -- "$0" } trap cleanup EXIT echo "attempting to acquire update lock" exec 200>$LOCKFILE flock -n 200 || { echo "failed to acquire update lock another process is holding it"; exit 1; } echo "update lock acquired" {{if .IsReplaceBuild}} IFS="," for EXE_PATH in $EXE_PATHS do echo "deleting existing executable: $EXE_PATH"; sudo rm -f $EXE_PATH; done echo "unzipping the archive: /tmp/$ARCHIVE_NAME"; sudo unzip -o /tmp/$ARCHIVE_NAME -d /local/game && rm /tmp/$ARCHIVE_NAME; echo "changing server permissions"; sudo chown -R gl-user-server:gl-user /local/game/*; {{end}} for EXE_PATH in $EXE_PATHS do sudo chmod -R 774 $EXE_PATH; echo "killing running processes: $EXE_PATH"; KILLED=$(sudo pkill -c -f "sudo -H -E -u gl-user-server $EXE_PATH"); if [ "$KILLED" -gt 0 ]; then echo "killed $KILLED gameserver processes"; else exit 1; fi done `