GameServerManagers / LinuxGSM

The command-line tool for quick, simple deployment and management of Linux dedicated game servers.
https://linuxgsm.com
MIT License
4.25k stars 813 forks source link

[Feature]: LGSM would utilize user-provided file for CRONTAB jobs #4584

Open irobot73 opened 4 months ago

irobot73 commented 4 months ago

User story

As a LGSM user, I want LGSM to create its instance of CRONTAB jobs from a user-provided file to allow customization & rapid (re)deployment

Game

7Days2Die

Linux distro

Ubuntu 22.04

Command

command: console

Further information

Would like to be able to create a file {EG: '.crontab'} in the /DATA folder that, if present, will be used to generate that docker's instance of all scheduled jobs via CRONTAB.

As, upon every STOP/START+ of the container, I have to manually modify CRONTAB via the console (miss a few & becomes quite tedious, running multiple servers) since it resets.

Keep the .YML clean(er) as well.

Default upon starting-up:

linuxgsm@599e2cfa8d46:/app$ crontab -l
*/60 * * * * /app/sdtdserver update > /dev/null 2>&1

vs. (mock code change)

[ -f "${CRONTAB_FILE}" ]]; then
     cat /data/.config|crontab -
fi

Giving (mock from file):

linuxgsm@599e2cfa8d46:/app$ crontab -l
## EVERY SUN @ 00:00
0 0 * * 0 /usr/bin/truncate --size 0 /data/log/crontab.log /data/log/rcon.log
## EVERY SUN @ 00:30
30 0 * * 0 /app/*server update-lgsm >> /data/log/crontab.log 2>&1
## EVERY DAY @ 05:00
1 5 * * * /data/RCON/rcon_send_backup_msg.sh sdtd 1 >> /data/log/crontab.log 2>&1
2 5 * * * /data/my_backup.sh >> /data/log/crontab.log 2>&1
## EVERY M,W,F @ 05:30
0 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 30 >> /data/log/crontab.log 2>&1
15 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 15 >> /data/log/crontab.log 2>&1
20 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 10 >> /data/log/crontab.log 2>&1
25 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 5 >> /data/log/crontab.log 2>&1
29 5 * * 1,3,5 /data/RCON/rcon_send_reboot_msg.sh sdtd 1 >> /data/log/crontab.log 2>&1
30 5 * * 1,3,5 /app/*server restart >> /data/log/crontab.log 2>&1

Edit (6/9/24) Hand-jammed a proof of concept:

sudo nano /app/lgsm/modules/command_start.sh

Find:

fn_print_dots "${servername}"
if [ "${shortname}" == "jk2" ]; then
        fn_start_jk2
else
        fn_start_tmux
fi

New code to add just below:

# If user defined CRONTAB is present, ingest
if [ -f "${HOME}/.crontab" ]; then
        fn_script_log_info "Importing CRONTAB file"
        cat "${HOME}/.crontab" | crontab -
else
        fn_script_log_info "No CRONTAB file to import"
fi

Post-Addition:

...
fn_print_dots "${servername}"
if [ "${shortname}" == "jk2" ]; then
        fn_start_jk2
else
        fn_start_tmux
fi

# If user defined CRONTAB is present, ingest
#
#     Better to utilize 'config-lgsm/_default.cfg' for cross-server usage, ease of use?
#
if [ -f "${HOME}/.crontab" ]; then
        fn_script_log_pass "Importing CRONTAB file"
        cat "${HOME}/.crontab" | crontab -
else
        fn_script_log_info "No CRONTAB file to import"
fi

# Remove starting lockfile when command ends.
...

Test output:

Jun 09 13:42:24.719 pwserver: START: PASS: Started LinuxGSM
Jun 09 13:42:24.822 pwserver: START: PASS: Started LinuxGSM
Jun 09 13:42:24.824 pwserver: START: PASS: Importing CRONTAB file
Jun 09 13:42:24.834 pwserver: RESTART: INFO: LinuxGSM version: v24.2.1
Jun 09 13:42:24.835 pwserver: RESTART: PASS: core_exit.sh exiting with code: 0