Spaces:
Paused
Paused
Update pc_agent.py
Browse files- pc_agent.py +37 -11
pc_agent.py
CHANGED
|
@@ -1,26 +1,52 @@
|
|
| 1 |
import subprocess, os, tempfile, shutil
|
| 2 |
from pathlib import Path
|
| 3 |
|
| 4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
def run_command(cmd: str, timeout: int = 30) -> dict:
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
try:
|
| 11 |
result = subprocess.run(
|
| 12 |
-
cmd, shell=True, cwd=str(
|
| 13 |
-
capture_output=True, text=True, timeout=timeout
|
| 14 |
)
|
| 15 |
out = result.stdout.strip() or result.stderr.strip() or "(لا يوجد مخرج)"
|
| 16 |
-
return {"output": out, "error": result.returncode != 0}
|
| 17 |
except subprocess.TimeoutExpired:
|
| 18 |
-
return {"output": "⏳ انتهى الوقت المحدد للأمر (30 ثانية).", "error": True}
|
| 19 |
except Exception as e:
|
| 20 |
-
return {"output": f"❌ خطأ: {str(e)}", "error": True}
|
| 21 |
|
| 22 |
def list_files():
|
| 23 |
-
|
|
|
|
| 24 |
|
| 25 |
def cleanup():
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import subprocess, os, tempfile, shutil
|
| 2 |
from pathlib import Path
|
| 3 |
|
| 4 |
+
# مجلد عمل مرن يُفحص ويُعاد إنشاؤه تلقائياً عند الحاجة
|
| 5 |
+
WORKSPACE_ROOT = Path(tempfile.gettempdir()) / "zai_workspace"
|
| 6 |
+
|
| 7 |
+
def ensure_workspace():
|
| 8 |
+
WORKSPACE_ROOT.mkdir(parents=True, exist_ok=True)
|
| 9 |
+
(WORKSPACE_ROOT / "uploads").mkdir(exist_ok=True)
|
| 10 |
+
return WORKSPACE_ROOT
|
| 11 |
|
| 12 |
def run_command(cmd: str, timeout: int = 30) -> dict:
|
| 13 |
+
ws = ensure_workspace()
|
| 14 |
+
|
| 15 |
+
# قائمة سوداء شاملة + منع تجاوز الصلاحيات
|
| 16 |
+
dangerous_patterns = [
|
| 17 |
+
"rm -rf", "mkfs", "dd if=", "shutdown", "reboot", "curl", "wget",
|
| 18 |
+
"pip install", "pip3", "python -c", "python3 -c", "bash -c", "sh -c",
|
| 19 |
+
"eval(", "exec(", "sudo", "chmod 777", "chown", "nc ", "nmap", "base64 -d"
|
| 20 |
+
]
|
| 21 |
+
cmd_lower = cmd.lower()
|
| 22 |
+
if any(p in cmd_lower for p in dangerous_patterns):
|
| 23 |
+
return {"output": "⛔ أمر محظور لأسباب أمنية.", "error": True, "code": 403}
|
| 24 |
+
|
| 25 |
+
# عزل البيئة لمنع الوصول لمتغيرات النظام الحساسة
|
| 26 |
+
safe_env = {"PATH": "/usr/local/bin:/usr/bin:/bin", "HOME": str(ws), "TERM": "xterm"}
|
| 27 |
+
|
| 28 |
try:
|
| 29 |
result = subprocess.run(
|
| 30 |
+
cmd, shell=True, cwd=str(ws),
|
| 31 |
+
capture_output=True, text=True, timeout=timeout, env=safe_env
|
| 32 |
)
|
| 33 |
out = result.stdout.strip() or result.stderr.strip() or "(لا يوجد مخرج)"
|
| 34 |
+
return {"output": out, "error": result.returncode != 0, "code": 200 if result.returncode == 0 else 400}
|
| 35 |
except subprocess.TimeoutExpired:
|
| 36 |
+
return {"output": "⏳ انتهى الوقت المحدد للأمر (30 ثانية).", "error": True, "code": 408}
|
| 37 |
except Exception as e:
|
| 38 |
+
return {"output": f"❌ خطأ تنفيذ: {str(e)}", "error": True, "code": 500}
|
| 39 |
|
| 40 |
def list_files():
|
| 41 |
+
ws = ensure_workspace()
|
| 42 |
+
return [str(p.relative_to(ws)) for p in ws.rglob("*") if p.is_file()]
|
| 43 |
|
| 44 |
def cleanup():
|
| 45 |
+
ws = ensure_workspace()
|
| 46 |
+
# حذف المحتويات فقط مع الحفاظ على مجلد العمل نفسه
|
| 47 |
+
for item in ws.iterdir():
|
| 48 |
+
if item.is_dir():
|
| 49 |
+
shutil.rmtree(item)
|
| 50 |
+
else:
|
| 51 |
+
item.unlink()
|
| 52 |
+
return True
|