AcidWeb / CurseBreaker

TUI/CLI addon updater for World of Warcraft.
GNU General Public License v3.0
766 stars 72 forks source link

Running headless in a cron job not working #207

Closed cars10 closed 3 years ago

cars10 commented 3 years ago

Hi, i tried running a CurseBreaker cronjob for daily addon updates. Sadly it does not work:

Cron command:

0 8 * * * ~/Games/world-of-warcraft/drive_c/Program\ Files\ \(x86\)/World\ of\ Warcraft/_retail_/CurseBreaker headless > /home/cars10/addon.log

Cron systemd service log:

Okt 22 14:00:01 cars10-pc CROND[39616]: (cars10) CMD (~/Games/world-of-warcraft/drive_c/Program\ Files\ \(x86\)/World\ of\ Warcraft/_retail_/CurseBreaker headless > /home/cars10/addon.log)
Okt 22 14:00:01 cars10-pc CROND[39615]: (cars10) CMDOUT (Warning: Output is not a terminal (fd=1).)
Okt 22 14:00:01 cars10-pc CROND[39615]: (cars10) CMDOUT (Warning: Input is not a terminal (fd=0).)
Okt 22 14:00:01 cars10-pc CROND[39615]: (cars10) CMDOUT (TERM environment variable not set.)
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT (╭───────────────────── Traceback (most recent call last) ──────────────────────╮)
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT (│ CurseBreaker.py:862 in <module>                                              │)
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT (│                                                                              │)
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT (│ CurseBreaker.py:132 in start                                                 │)
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT (│                                                                              │)
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT (│ CB/Compat.py:19 in __init__                                                  │)
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT (╰──────────────────────────────────────────────────────────────────────────────╯)
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT (error: (25, 'Inappropriate ioctl for device'))
Okt 22 14:00:02 cars10-pc CROND[39615]: (cars10) CMDOUT ([39618] Failed to execute script CurseBreaker)

addon.log:

0;CurseBreaker v3.13.0^G
CurseBreaker v3.13.0 | 2020-10-22 14:00:01.953898

Am i missing something?

AcidWeb commented 3 years ago

I don't think anybody tried to run in with cron. Error log is quite clear - it require real terminal. You might also try to set TERM.

AcidWeb commented 3 years ago

I presume you get it working.

z0n commented 3 years ago

@AcidWeb I have the same issue, I'm running CurseBreaker periodically in a systemd service. This actually worked fine before this commit: 302b46c9481c9e21bbb4560696286c91d6ec4bc1

On newer versions, it looks like this:

Nov 01 19:21:24 Markus-Desktop systemd[1015]: Started WoW Retail addon updater.
Nov 01 19:21:24 Markus-Desktop python3[75375]: 
Nov 01 19:21:24 Markus-Desktop python3[75345]: Warning: Output is not a terminal (fd=1).
Nov 01 19:21:24 Markus-Desktop python3[75345]: Warning: Input is not a terminal (fd=0).
Nov 01 19:21:24 Markus-Desktop python3[75345]: ───────────────────────────── CurseBreaker v3.14.1 ─────────────────────────────
Nov 01 19:21:24 Markus-Desktop python3[75345]: Automatic update of all addons will start in 5 seconds.
Nov 01 19:21:24 Markus-Desktop python3[75345]: Press any button to enter interactive mode.
Nov 01 19:21:25 Markus-Desktop python3[75345]: ╭───────────────────── Traceback (most recent call last) ──────────────────────╮
Nov 01 19:21:25 Markus-Desktop python3[75345]: │ /mnt/data_ssd/Games/world-of-warcraft/drive_c/Program Files (x86)/World of   │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │ Warcraft/_retail_/CurseBreaker.py:876 in <module>                            │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │                                                                              │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   873 │   │   os.chdir(os.path.dirname(os.path.abspath(sys.executable)))     │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   874 │   set_terminal_title(f'CurseBreaker v{__version__}')                 │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   875 │   app = TUI()                                                        │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │ ❱ 876 │   app.start()                                                        │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │                                                                              │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │ /mnt/data_ssd/Games/world-of-warcraft/drive_c/Program Files (x86)/World of   │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │ Warcraft/_retail_/CurseBreaker.py:134 in start                               │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │                                                                              │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   131 │   │   │   if not self.headless:                                      │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   132 │   │   │   │   self.console.print('Automatic update of all addons wil │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   133 │   │   │   │   │   │   │   │      'Press any button to enter interact │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │ ❱ 134 │   │   │   kb = KBHit()                                               │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   135 │   │   │   starttime = time.time()                                    │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   136 │   │   │   keypress = None                                            │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   137 │   │   │   while True:                                                │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │                                                                              │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │ /home/markus/Applications/CurseBreaker/CB/Compat.py:19 in __init__           │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │                                                                              │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   16 │   def __init__(self):                                                 │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   17 │   │   if system != 'Windows':                                         │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   18 │   │   │   self.fd = sys.stdin.fileno()                                │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │ ❱ 19 │   │   │   self.new_term = termios.tcgetattr(self.fd)                  │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   20 │   │   │   self.old_term = termios.tcgetattr(self.fd)                  │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   21 │   │   │   self.new_term[3] = (self.new_term[3] & ~termios.ICANON & ~t │
Nov 01 19:21:25 Markus-Desktop python3[75345]: │   22 │   │   │   termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.new_term │
Nov 01 19:21:25 Markus-Desktop python3[75345]: ╰──────────────────────────────────────────────────────────────────────────────╯
Nov 01 19:21:25 Markus-Desktop python3[75345]: error: (25, 'Inappropriate ioctl for device')

systemd service:

[Unit]
Description=WoW Retail addon updater
After=network-online.target
[Service]
Type=simple
WorkingDirectory=/mnt/data_ssd/Games/world-of-warcraft/drive_c/Program Files (x86)/World of Warcraft/_retail_/
ExecStart=/usr/bin/python3 CurseBreaker.py headless
[Install]
WantedBy=multi-user.target
AcidWeb commented 3 years ago

Thanks @z0n. I will try to workaround it for headless mode.

z0n commented 3 years ago

Short feedback, it's working now!

cars10 commented 3 years ago

Running via cron also works now. Thanks!