Add big_maniger_gita.py
This commit is contained in:
149
big_maniger_gita.py
Normal file
149
big_maniger_gita.py
Normal file
@@ -0,0 +1,149 @@
|
||||
import os,shutil
|
||||
import time
|
||||
import subprocess
|
||||
import json
|
||||
from datetime import datetime
|
||||
import psutil
|
||||
|
||||
# اطلاعات Gitea شما
|
||||
# نام کاربری: pythonkoft
|
||||
# توکن شخصی: 2f135dee41b069f92413dd3f234e12cb8c20a96a
|
||||
# آدرس ریپازیتوری: http://188.245.173.247:3080/pythonkoft/ea_shadow.git
|
||||
|
||||
REPO_DIR = "bot_ea_db"
|
||||
GIT_REPO = "http://pythonkoft:2f135dee41b069f92413dd3f234e12cb8c20a96a@188.245.173.247:3080/pythonkoft/ea_shadow.git"
|
||||
LOG_FILE = "log.json"
|
||||
LAST_COMMIT_FILE = "last_commit.txt"
|
||||
PROCESS_NAME = "main.bat"
|
||||
PID_FILE = "main_pid.txt"
|
||||
|
||||
def write_log(event, message):
|
||||
log_entry = {
|
||||
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"event": event,
|
||||
"message": message
|
||||
}
|
||||
if not os.path.exists(LOG_FILE):
|
||||
with open(LOG_FILE, "w", encoding="utf-8") as f:
|
||||
json.dump([log_entry], f, ensure_ascii=False, indent=2)
|
||||
else:
|
||||
with open(LOG_FILE, "r+", encoding="utf-8") as f:
|
||||
logs = json.load(f)
|
||||
logs.append(log_entry)
|
||||
f.seek(0)
|
||||
json.dump(logs, f, ensure_ascii=False, indent=2)
|
||||
|
||||
def kill_old_process():
|
||||
if not os.path.exists(PID_FILE):
|
||||
write_log("kill", "هیچ PIDی برای بستن وجود نداشت.")
|
||||
return
|
||||
|
||||
try:
|
||||
with open(PID_FILE, "r") as f:
|
||||
pid = int(f.read().strip())
|
||||
|
||||
parent = psutil.Process(pid)
|
||||
children = parent.children(recursive=True)
|
||||
|
||||
for child in children:
|
||||
child.terminate()
|
||||
|
||||
gone, still_alive = psutil.wait_procs(children, timeout=5)
|
||||
write_log("kill", f"{len(gone)} تا subprocess بسته شد. هنوز زندهها: {len(still_alive)}")
|
||||
|
||||
os.remove(PID_FILE)
|
||||
|
||||
except (psutil.NoSuchProcess, ValueError):
|
||||
write_log("kill", "PID معتبر نبود یا پروسه پیدا نشد.")
|
||||
except Exception as e:
|
||||
write_log("kill", f"خطا در بستن subprocessها: {str(e)}")
|
||||
|
||||
def get_latest_commit():
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["git", "-C", REPO_DIR, "rev-parse", "HEAD"],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
return result.stdout.strip()
|
||||
except Exception as e:
|
||||
write_log("error", f"get commit error: {str(e)}")
|
||||
return None
|
||||
|
||||
def save_last_commit(commit_hash):
|
||||
with open(LAST_COMMIT_FILE, "w") as f:
|
||||
f.write(commit_hash)
|
||||
|
||||
def load_last_commit():
|
||||
if os.path.exists(LAST_COMMIT_FILE):
|
||||
with open(LAST_COMMIT_FILE, "r") as f:
|
||||
return f.read().strip()
|
||||
return None
|
||||
|
||||
def clone_or_update_repo():
|
||||
if os.path.exists(REPO_DIR):
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["git", "-C", REPO_DIR, "pull"],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
if result.returncode == 0:
|
||||
write_log("pull", "مخزن آپدیت شد.")
|
||||
else:
|
||||
write_log("error", f"خطا در git pull: {result.stderr}")
|
||||
except Exception as e:
|
||||
write_log("error", f"git pull failed: {str(e)}")
|
||||
else:
|
||||
result = subprocess.run(
|
||||
["git", "clone", GIT_REPO, REPO_DIR],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
if result.returncode == 0:
|
||||
write_log("clone", "مخزن کلون شد.")
|
||||
else:
|
||||
write_log("error", f"خطا در کلون کردن: {result.stderr}")
|
||||
|
||||
def run_main_bat():
|
||||
try:
|
||||
shutil.copy(os.path.join(os.getcwd(),'.env'),os.path.join(os.getcwd(),'bot_ea_db'))
|
||||
process = subprocess.Popen(
|
||||
["cmd.exe", "/c", "main.bat"],
|
||||
cwd=REPO_DIR,
|
||||
creationflags=subprocess.CREATE_NEW_CONSOLE
|
||||
)
|
||||
|
||||
with open(PID_FILE, "w") as f:
|
||||
f.write(str(process.pid))
|
||||
|
||||
write_log("run", f"main.bat اجرا شد با PID={process.pid}.")
|
||||
except Exception as e:
|
||||
write_log("error", f"main.bat اجرا نشد: {str(e)}")
|
||||
|
||||
def main_loop():
|
||||
while True:
|
||||
print('1')
|
||||
clone_or_update_repo()
|
||||
print('2')
|
||||
latest_commit = get_latest_commit()
|
||||
print('3')
|
||||
saved_commit = load_last_commit()
|
||||
print('4')
|
||||
if latest_commit and latest_commit != saved_commit:
|
||||
print('5')
|
||||
write_log("update", f"کمیت جدید: {latest_commit}")
|
||||
print('6')
|
||||
kill_old_process()
|
||||
print('7')
|
||||
run_main_bat()
|
||||
print('8')
|
||||
save_last_commit(latest_commit)
|
||||
else:
|
||||
print(("check", "تغییری نبود."))
|
||||
write_log("check", "تغییری نبود.")
|
||||
print(60)
|
||||
time.sleep(60)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main_loop()
|
Reference in New Issue
Block a user