Add big_maniger_gita.py

This commit is contained in:
2025-08-16 13:57:08 +00:00
commit 18b59fe5a5

149
big_maniger_gita.py Normal file
View 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()