Skip to content

Commit e6e0739

Browse files
committed
3.6.2
1 parent 12ce395 commit e6e0739

File tree

2 files changed

+152
-50
lines changed

2 files changed

+152
-50
lines changed

checkpoint.py

Lines changed: 8 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
from api_manager import APIClient, get_major_version
66
from dotenv import load_dotenv
77
import aio_pika
8-
from aio_pika import connect_robust, ExchangeType
8+
from aio_pika import ExchangeType
99
import aiohttp
1010
import datetime
1111
import re
12-
import zipfile
13-
import io
1412
import sys
13+
import subprocess
1514
from packaging import version # Für robuste Versionsvergleiche
1615

1716
# Konfigurieren des Loggings
@@ -33,7 +32,7 @@
3332
RABBITMQ_PORT = int(os.getenv('RABBITMQ_PORT', '5672'))
3433

3534
# Aktuelle Skript-Version
36-
__version__ = '3.6.1' # Aktualisieren Sie diese Version entsprechend Ihrer aktuellen Version
35+
__version__ = '3.6.2' # Aktualisieren Sie diese Version entsprechend Ihrer aktuellen Version
3736

3837
GITHUB_API_URL = 'https://api.github.com/repos/hackletloose/hall-checkpoint-client/releases/latest'
3938

@@ -407,52 +406,11 @@ async def auto_update():
407406
await asyncio.sleep(3600)
408407
continue
409408

410-
async with session.get(zip_url) as zip_response:
411-
if zip_response.status != 200:
412-
logging.error(f"Auto-Updater: Fehler beim Herunterladen des Updates: {zip_response.status}")
413-
await asyncio.sleep(3600)
414-
continue
415-
zip_content = await zip_response.read()
416-
417-
with zipfile.ZipFile(io.BytesIO(zip_content)) as z:
418-
# Extrahiere alle Dateien in ein temporäres Verzeichnis
419-
temp_dir = os.path.join(os.path.dirname(__file__), 'temp_update')
420-
if not os.path.exists(temp_dir):
421-
os.makedirs(temp_dir)
422-
423-
z.extractall(temp_dir)
424-
logging.info("Auto-Updater: Update-Archiv erfolgreich extrahiert.")
425-
426-
# Da das Zipball einen Unterordner enthält, finden wir den ersten Ordner
427-
extracted_dirs = [name for name in os.listdir(temp_dir) if os.path.isdir(os.path.join(temp_dir, name))]
428-
if not extracted_dirs:
429-
logging.error("Auto-Updater: Kein Verzeichnis im Update-Archiv gefunden.")
430-
await asyncio.sleep(3600)
431-
continue
432-
extracted_path = os.path.join(temp_dir, extracted_dirs[0])
433-
434-
# Kopiere die aktualisierten Dateien über die bestehenden
435-
for root, dirs, files in os.walk(extracted_path):
436-
relative_path = os.path.relpath(root, extracted_path)
437-
destination_dir = os.path.join(os.path.dirname(__file__), relative_path)
438-
if not os.path.exists(destination_dir):
439-
os.makedirs(destination_dir)
440-
for file in files:
441-
source_file = os.path.join(root, file)
442-
dest_file = os.path.join(destination_dir, file)
443-
if file in ['checkpoint.py', 'api_manager.py']:
444-
logging.info(f"Auto-Updater: Aktualisiere Datei {file}.")
445-
os.replace(source_file, dest_file)
446-
else:
447-
# Kopiere andere Dateien nach Bedarf
448-
logging.info(f"Auto-Updater: Kopiere Datei {file}.")
449-
os.replace(source_file, dest_file)
450-
451-
logging.info("Auto-Updater: Update abgeschlossen. Starte das Skript neu...")
452-
# Aktualisiere die Versionsvariable
453-
__version__ = latest_version
454-
# Starte das Skript neu
455-
os.execv(sys.executable, ['python'] + sys.argv)
409+
# Starte das Update-Skript
410+
logging.info("Auto-Updater: Starte updater.py...")
411+
subprocess.Popen(['python', 'updater.py'])
412+
logging.info("Auto-Updater: Update-Skript gestartet. Beende das aktuelle Skript.")
413+
sys.exit()
456414
else:
457415
logging.info("Auto-Updater: Keine neue Version verfügbar.")
458416
except Exception as e:

updater.py

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import os
2+
import sys
3+
import zipfile
4+
import io
5+
import aiohttp
6+
import asyncio
7+
import logging
8+
import shutil
9+
import subprocess
10+
11+
from packaging import version # Für robuste Versionsvergleiche
12+
13+
# Konfigurieren des Loggings
14+
logging.basicConfig(level=logging.INFO,
15+
format='%(asctime)s - %(levelname)s - %(message)s',
16+
handlers=[
17+
logging.FileHandler('updater.log'),
18+
logging.StreamHandler()
19+
])
20+
21+
GITHUB_API_URL = 'https://api.github.com/repos/hackletloose/hall-checkpoint-client/releases/latest'
22+
23+
async def download_update(zip_url, temp_dir):
24+
logging.info(f"Updater: Starte Download des Updates von {zip_url}...")
25+
async with aiohttp.ClientSession() as session:
26+
async with session.get(zip_url) as response:
27+
if response.status != 200:
28+
logging.error(f"Updater: Fehler beim Herunterladen des Updates: {response.status}")
29+
return False
30+
zip_content = await response.read()
31+
with zipfile.ZipFile(io.BytesIO(zip_content)) as z:
32+
z.extractall(temp_dir)
33+
logging.info("Updater: Update-Archiv erfolgreich extrahiert.")
34+
return True
35+
36+
def replace_files(extracted_path, destination_dir):
37+
logging.info("Updater: Ersetze alte Dateien durch die neuen Dateien...")
38+
for root, dirs, files in os.walk(extracted_path):
39+
relative_path = os.path.relpath(root, extracted_path)
40+
dest_dir = os.path.join(destination_dir, relative_path)
41+
if not os.path.exists(dest_dir):
42+
os.makedirs(dest_dir)
43+
for file in files:
44+
source_file = os.path.join(root, file)
45+
dest_file = os.path.join(dest_dir, file)
46+
temp_dest_file = dest_file + ".tmp"
47+
logging.info(f"Updater: Kopiere Datei {file}...")
48+
shutil.copy2(source_file, temp_dest_file)
49+
shutil.move(temp_dest_file, dest_file)
50+
logging.info("Updater: Alle Dateien wurden erfolgreich ersetzt.")
51+
return True
52+
53+
def restart_main_script():
54+
logging.info("Updater: Starte das Hauptskript neu...")
55+
try:
56+
subprocess.Popen(['python', 'checkpoint.py'])
57+
logging.info("Updater: Hauptskript erfolgreich neu gestartet.")
58+
except Exception as e:
59+
logging.error(f"Updater: Fehler beim Neustarten des Hauptskripts: {e}")
60+
61+
async def main():
62+
try:
63+
# Abrufen der neuesten Version und des Zip-URL
64+
async with aiohttp.ClientSession() as session:
65+
async with session.get(GITHUB_API_URL) as response:
66+
if response.status != 200:
67+
logging.error(f"Updater: Fehler beim Abrufen der GitHub-API: {response.status}")
68+
return
69+
data = await response.json()
70+
latest_version = data.get('tag_name', '').lstrip('v')
71+
zip_url = data.get('zipball_url')
72+
if not latest_version or not zip_url:
73+
logging.error("Updater: Konnte die neueste Version oder Zipball-URL nicht ermitteln.")
74+
return
75+
76+
# Feststellen der aktuellen Version aus dem Hauptskript
77+
current_dir = os.path.dirname(os.path.abspath(__file__))
78+
checkpoint_path = os.path.join(current_dir, 'checkpoint.py')
79+
if not os.path.exists(checkpoint_path):
80+
logging.error("Updater: Hauptskript checkpoint.py nicht gefunden.")
81+
return
82+
83+
with open(checkpoint_path, 'r') as f:
84+
for line in f:
85+
if line.startswith('__version__'):
86+
current_version = line.split('=')[1].strip().strip("'\"")
87+
break
88+
else:
89+
logging.error("Updater: Aktuelle Version nicht in checkpoint.py gefunden.")
90+
return
91+
92+
logging.info(f"Updater: Aktuelle Version: {current_version}, Neueste Version: {latest_version}")
93+
94+
# Versionsvergleich
95+
if version.parse(latest_version) <= version.parse(current_version):
96+
logging.info("Updater: Keine neue Version verfügbar. Beende das Updater-Skript.")
97+
return
98+
99+
# Temporäres Verzeichnis für das Update
100+
temp_dir = os.path.join(current_dir, 'temp_update')
101+
if not os.path.exists(temp_dir):
102+
os.makedirs(temp_dir)
103+
104+
# Download und Extraktion des Updates
105+
success = await download_update(zip_url, temp_dir)
106+
if not success:
107+
return
108+
109+
# Finden des extrahierten Verzeichnisses
110+
extracted_dirs = [name for name in os.listdir(temp_dir) if os.path.isdir(os.path.join(temp_dir, name))]
111+
if not extracted_dirs:
112+
logging.error("Updater: Kein Verzeichnis im Update-Archiv gefunden.")
113+
return
114+
extracted_path = os.path.join(temp_dir, extracted_dirs[0])
115+
116+
# Ersetzen der alten Dateien durch die neuen Dateien
117+
replace_files(extracted_path, current_dir)
118+
119+
# Bereinigung des temporären Verzeichnisses
120+
shutil.rmtree(temp_dir)
121+
logging.info("Updater: Temporäres Verzeichnis bereinigt.")
122+
123+
# Aktualisieren der Versionsvariable in checkpoint.py
124+
with open(checkpoint_path, 'r') as f:
125+
lines = f.readlines()
126+
with open(checkpoint_path, 'w') as f:
127+
for line in lines:
128+
if line.startswith('__version__'):
129+
f.write(f"__version__ = '{latest_version}'\n")
130+
else:
131+
f.write(line)
132+
logging.info("Updater: Versionsvariable in checkpoint.py aktualisiert.")
133+
134+
# Neustarten des Hauptskripts
135+
restart_main_script()
136+
137+
except Exception as e:
138+
logging.error(f"Updater: Unerwarteter Fehler: {e}")
139+
140+
if __name__ == '__main__':
141+
try:
142+
asyncio.run(main())
143+
except Exception as e:
144+
logging.error(f"Updater: Fehler beim Ausführen des Updater-Skripts: {e}")

0 commit comments

Comments
 (0)