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)