Changeset - e3469b4d532f
[Not reviewed]
0 1 0
Branko Majic (branko) - 4 years ago 2021-02-10 21:22:57
branko@majic.rs
Noticket: [factorio_manager.sh] Added commands for renaming and resetting the server map:

- Bumped the version as well.
- Added check for validating that a directory contains a server
instance.
- Minor cleanup of an extra blank line and variable assignment.
1 file changed with 176 insertions and 4 deletions:
0 comments (0 inline, 0 general) First comment
games/factorio_manager.sh
Show inline comments
 
@@ -19,29 +19,31 @@
 
#
 

	
 
# Treat unset variables as errors.
 
set -u
 

	
 
program="factorio_manager.sh"
 
version="0.3.1"
 
version="0.4.0"
 

	
 
function synopsis() {
 
cat <<EOF
 
$program $version, helper tool for managing Factorio instances
 

	
 
Usage:
 
  $program [OPTIONS] launch INSTANCE
 
  $program [OPTIONS] info INSTANCE
 
  $program [OPTIONS] list
 

	
 
  $program [OPTIONS] create INSTANCE
 
  $program [OPTIONS] create-server INSTANCE
 
  $program [OPTIONS] rename CURRENT_NAME NEW_NAME
 
  $program [OPTIONS] copy SOURCE_INSTANCE DESTINATION_INSTANCE
 
  $program [OPTIONS] remove INSTANCE
 
  $program [OPTIONS] import INSTANCE SOURCE_DIRECTORY
 
  $program [OPTIONS] set-version INSTANCE
 
  $program [OPTIONS] reset-server-map INSTANCE
 

	
 
  $program [OPTIONS] versions
 
  $program [OPTIONS] install GAME_ARCHIVE
 

	
 
  $program [OPTIONS] list-backups INSTANCE
 
  $program [OPTIONS] backup INSTANCE [DESCRIPTION]
 
@@ -93,13 +95,12 @@ backup INSTANCE [DESCRIPTION]
 
    Creates backup of an instance. All backups will be stored as
 
    subdirectories under the .bak directory within the instance
 
    directory. An optional description can be passed-in to make it
 
    easier to distinguish between different backups. Hidden files
 
    (names starting with '.') will be omitted from the backup.
 

	
 

	
 
copy SOURCE_INSTANCE DESTINATION_INSTANCE
 

	
 
    Creates a copy of an existing instance. Requires name of an
 
    existing instance and name of the new instance to be passed-in as
 
    arguments. Command will refuse to overwrite destination instance
 
    if it already exists. Command will prompt user to specify desired
 
@@ -172,12 +173,18 @@ remove-backup INSTANCE BACKUP_NAME
 

	
 
remove INSTANCE
 

	
 
    Removes the specified instance. User must confirm the action prior
 
    to any files being removed.
 

	
 
rename CURRENT_NAME NEW_NAME
 

	
 
    Renames an existing instnace. Requires current name of an
 
    instance, as well as a new name. Command will refuse to rename the
 
    instance if an instance with specified new name already exists.
 

	
 
restore INSTANCE BACKUP_NAME
 

	
 
    Restores the specified instance from the specified backup. User
 
    must confirm the action prior to any files being replaced.
 

	
 
set-game-dir GAME_INSTALLATIONS_DIRECTORY
 
@@ -937,12 +944,15 @@ function read_server_settings() {
 
#       instance_import_source
 
#         Checks if path is usable as source for importing an instance.
 
#
 
#       game_archive
 
#         Checks if file at designated path is a valid game archive.
 
#
 
#       server_instance_directory
 
#         Checks if path contains a valid server instance.
 
#
 
#   $2 (path)
 
#     Path that should be validated.
 
#
 
#   $3 (exit_code)
 
#     Exit code to use when terminating the program.
 
#
 
@@ -1032,12 +1042,34 @@ function validate_path_or_terminate() {
 
        fi
 

	
 
        if ! tar --occurrence=1 --list --file "$game_archive" "factorio/bin/x64/factorio" > /dev/null; then
 
            error "Supplied path does not point to a valid game archive."
 
            exit "$ERROR_ARGUMENTS"
 
        fi
 

	
 
    elif [[ $path_test == "server_instance_directory" ]]; then
 
        if [[ ! -d $path ]]; then
 
            error "Missing instance directory: $path"
 
            error "Perhaps you have misstyped the instance name or forgot to create one first?"
 
            exit "$exit_code"
 
        fi
 

	
 
        if [[ ! -f $path/instance.conf ]]; then
 
            error "Missing instance configuration file: $path/instance.conf"
 
            exit "$exit_code"
 
        fi
 

	
 
        if [[ ! -f $path/config.ini ]]; then
 
            error "Missing game configuration file: $path/config.ini"
 
            exit "$exit_code"
 
        fi
 

	
 
        if [[ ! -f $path/server-settings.json ]]; then
 
            error "Missing server settings file: $path/server-settings.json"
 
            exit "$exit_code"
 
        fi
 
    else
 
        error "Unable to validate path '$path', unsupported test requested: '$path_test'."
 
        exit "$ERROR_GENERAL"
 
    fi
 
}
 

	
 
@@ -2284,14 +2316,12 @@ EOF
 
#===============#
 
elif [[ $command == create-server ]]; then
 

	
 
    # Make sure game installations directory has been set.
 
    validate_path_or_terminate "game_installations_directory" "$game_installations_directory" "$ERROR_CONFIGURATION"
 

	
 
    instance="${1-}"
 

	
 
    # Read positional arguments.
 
    instance="${1-}"
 
    shift
 

	
 
    # Calculate derived variables.
 
    instance_directory="$manager_directory/$instance"
 
@@ -2497,11 +2527,153 @@ elif [[ $command == install ]]; then
 
    if ! chmod -R u-w,g-w,o-w "$game_destination_directory"; then
 
        error "Could not write-protect the game directory ($game_destination_directory). Manual intervention might be required."
 
        exit "$ERROR_GENERAL"
 
    fi
 

	
 
    success "Successfully installed game version: $(colorecho -n green "$game_version")"
 

	
 

	
 
#==================#
 
# reset-server-map #
 
#==================#
 
elif [[ $command == reset-server-map ]]; then
 

	
 
    # Make sure game installations directory has been set.
 
    validate_path_or_terminate "game_installations_directory" "$game_installations_directory" "$ERROR_CONFIGURATION"
 

	
 
    # Read positional arguments.
 
    instance="${1-}"
 
    shift
 

	
 
    # Calculate derived variables.
 
    instance_directory="$manager_directory/$instance"
 
    instance_config="$instance_directory/instance.conf"
 
    game_config="$instance_directory/config.ini"
 
    server_config="$instance_directory/server-settings.json"
 
    main_save="$instance_directory/saves/default.zip"
 

	
 
    # Verify arguments.
 
    if [[ -z $instance ]]; then
 
        error "Missing argument: INSTANCE"
 
        exit "$ERROR_ARGUMENTS"
 
    fi
 

	
 
    # Validate that instance directory contains valid instance.
 
    validate_path_or_terminate "server_instance_directory" "$instance_directory" "$ERROR_ARGUMENTS"
 

	
 
    # Update instance write directory prior to launching - this is a
 
    # failsafe in case it got changed by hand or perhaps the value
 
    # comes from backups of a copied instance.
 
    current_write_data=$(grep "^write-data=" "$game_config")
 
    expected_write_data="write-data=${instance_directory}"
 

	
 
    if [[ $current_write_data != "$expected_write_data" ]]; then
 
        warning "Incorrect path specified for write-data in game configuration file: $game_config"
 
        warning "Current configuration is: $current_write_data"
 
        warning "Configuration will be replaced with: $expected_write_data"
 
        sed -i -e "s#^write-data=.*#$expected_write_data#" "$game_config"
 
    fi
 

	
 
    # Read launcher configuration for the instance.
 
    # shellcheck source=/dev/null
 
    source "$instance_config"
 

	
 
    if [[ -z $game_version ]]; then
 
        error "Missing game version information in $game_config."
 
        exit "$ERROR_CONFIGURATION"
 
    fi
 

	
 
    # Set-up paths for launching the game, and ensure they still exist
 
    # (versions can be removed by user).
 
    game_directory="${game_installations_directory}/${game_version}"
 
    factorio_bin="$game_directory/bin/x64/factorio"
 

	
 
    if [[ ! -e $factorio_bin ]]; then
 
        error "Could not locate Factorio binary under: $factorio_bin"
 
        error "Factorio $game_version installation may have been removed from game installations directory:"
 
        error "   $(readlink -f "$game_installations_directory")"
 
        exit "$ERROR_CONFIGURATION"
 
    fi
 

	
 
    # Request from user to confirm the destructive action.
 
    critical_confirmation "Resetting the server map will wipe the default save game as well." \
 
                          "Aborted server map reset, no changes have been made to instance files." \
 
                          "$ERROR_GENERAL"
 

	
 
    if ! rm -f "$main_save"; then
 
        error "Could not remove the default save game."
 
        exit "$ERROR_GENERAL"
 
    fi
 

	
 
    if ! "$factorio_bin" --config "$game_config" --create "$main_save"; then
 
        error "Failed to generate default savegame/map under: $main_save"
 
        exit "$ERROR_GENERAL"
 
    fi
 

	
 

	
 
#========#
 
# rename #
 
#========#
 
elif [[ $command == rename ]]; then
 

	
 
    # Make sure game installations directory has been set.
 
    validate_path_or_terminate "game_installations_directory" "$game_installations_directory" "$ERROR_CONFIGURATION"
 

	
 
    # Read positional arguments.
 
    current_name="${1-}"
 
    new_name="${2-}"
 
    shift 2
 

	
 
    # Verify positional arguments.
 
    if [[ -z $current_name ]]; then
 
        error "Missing argument: CURRENT_NAME"
 
        exit "$ERROR_ARGUMENTS"
 
    fi
 

	
 
    if [[ -z $new_name ]]; then
 
        error "Missing argument: NEW_NAME"
 
        exit "$ERROR_ARGUMENTS"
 
    fi
 

	
 
    if [[ $current_name == "$new_name" ]]; then
 
        error "New name must differ from current name."
 

	
 
        exit "$ERROR_ARGUMENTS"
 
    fi
 

	
 
    # Calculate derived variables.
 
    current_instance_directory="$manager_directory/$current_name"
 
    current_instance_config="$current_instance_directory/instance.conf"
 
    current_instance_lock_file="$current_instance_directory/.lock"
 
    new_instance_directory="$manager_directory/$new_name"
 

	
 
    # Validate that source instance directory contains valid instance.
 
    validate_path_or_terminate "instance_directory" "$current_instance_directory" "$ERROR_ARGUMENTS"
 

	
 
    # Make sure destination instance directory can be used.
 
    validate_path_or_terminate "instance_directory_new" "$new_instance_directory" "$ERROR_ARGUMENTS"
 

	
 
    (
 
        # shellcheck disable=SC2094 # Lock file is not being read from.
 
        lock "$current_instance_lock_file" 200
 

	
 
        # Load source instance configuration.
 
        # shellcheck source=/dev/null
 
        source "$current_instance_config"
 

	
 
        # Rename the instance.
 
        mv "$current_instance_directory" "$new_instance_directory"
 

	
 
        # Update write-data directory of destination instance,
 
        # including the backups.
 
        write_data="write-data=${new_instance_directory}"
 
        find "$new_instance_directory/" -type f -name config.ini -exec \
 
             sed -i -e "s#^write-data=.*#$write_data#" '{}' \;
 

	
 
        success "Renamed instance $(colorecho -n green "$current_name") to $(colorecho -n green "$new_name")."
 

	
 
    ) 200>"$current_instance_lock_file"
 
else
 
    error "Invalid command: $command"
 

	
 
    exit "$ERROR_ARGUMENTS"
 
fi
0 comments (0 inline, 0 general) First comment
You need to be logged in to comment. Login now