Spaces:
Sleeping
Sleeping
File size: 3,041 Bytes
5c6037b e96a62a 5c6037b e96a62a 3a2ce2a 5c6037b e96a62a 5c6037b cd03aa3 5c6037b e96a62a 5c6037b 3a2ce2a cd03aa3 5c6037b 3a2ce2a cd03aa3 5c6037b cd03aa3 5c6037b 3a2ce2a e96a62a cd03aa3 e96a62a cd03aa3 5c6037b 3a2ce2a 5c6037b 3a2ce2a 5c6037b 3a2ce2a 5c6037b 3a2ce2a 5c6037b 3a2ce2a cd03aa3 3a2ce2a cd03aa3 5c6037b cd03aa3 5c6037b 3a2ce2a e96a62a cd03aa3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
from flask import Flask, render_template_string
from apscheduler.schedulers.background import BackgroundScheduler
import subprocess
from datetime import datetime
app = Flask(__name__)
execution_logs = []
MAX_LOG_ENTRIES = 20
def run_cli_script():
timestamp = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC")
log_entry = {'time': timestamp, 'output': '', 'error': ''}
try:
result = subprocess.run(
["python", "cli.py"],
capture_output=True,
text=True,
timeout=300
)
log_entry['output'] = result.stdout
log_entry['error'] = result.stderr
except Exception as e:
log_entry['error'] = str(e)
finally:
execution_logs.append(log_entry)
if len(execution_logs) > MAX_LOG_ENTRIES:
execution_logs.pop(0)
# Initialize scheduler with a named job
scheduler = BackgroundScheduler(daemon=True)
scheduler.add_job(
run_cli_script,
'interval',
hours=3,
id='main_job',
next_run_time=datetime.now() # Initial run time
)
scheduler.start()
run_cli_script() # Initial run
@app.route('/')
def home():
# Get the specific job by ID
job = scheduler.get_job('main_job')
next_run = job.next_run_time.strftime('%Y-%m-%d %H:%M:%S UTC') if job else 'N/A'
return render_template_string('''
<!DOCTYPE html>
<html>
<head>
<title>Script Scheduler</title>
<meta http-equiv="refresh" content="10">
<style>
body { font-family: Arial, sans-serif; padding: 20px; }
.log-box {
background: #000;
color: #0f0;
padding: 15px;
border-radius: 5px;
margin-top: 20px;
white-space: pre-wrap;
}
.timestamp { color: #888; margin-bottom: 10px; }
.error { color: #ff4444; }
</style>
</head>
<body>
<h1>Script Scheduler</h1>
<p>Next run: {{ next_run }}</p>
<h2>Latest Execution Logs</h2>
<div class="log-box">
{% for log in logs|reverse %}
<div class="timestamp">{{ log.time }}</div>
{% if log.output %}
<div class="output">{{ log.output }}</div>
{% endif %}
{% if log.error %}
<div class="error">{{ log.error }}</div>
{% endif %}
<hr>
{% else %}
<div>No logs available yet</div>
{% endfor %}
</div>
<p><a href="/force-run">Trigger Manual Run</a></p>
</body>
</html>
''', next_run=next_run, logs=execution_logs)
@app.route('/force-run')
def force_run():
run_cli_script()
return "Script executed manually", 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860) |