Mercurial > piecrust2
annotate piecrust/admin/pubutil.py @ 1188:a7c43131d871
bake: Fix file write flushing problem with Python 3.8+
Writing the cache files fails in Python 3.8 because it looks like flushing
behaviour has changed. We need to explicitly flush. And even then, in very
rare occurrences, it looks like it can still run into racing conditions,
so we do a very hacky and ugly "retry" loop when fetching cached data :(
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 15 Jun 2021 22:36:23 -0700 |
parents | 82509bce94ca |
children |
rev | line source |
---|---|
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import os |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os.path |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import time |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
4 import errno |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 import signal |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 import logging |
772
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
7 from .blueprint import foodtruck_bp |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 logger = logging.getLogger(__name__) |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 server_shutdown = False |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 |
772
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
15 def _shutdown_server_and_raise_sigint(is_app_debug): |
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
16 if (not is_app_debug or |
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
17 os.environ.get('WERKZEUG_RUN_MAIN') == 'true'): |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 # This is needed when hitting CTRL+C to shutdown the Werkzeug server, |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 # otherwise SSE generators will keep it alive. |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 logger.debug("Shutting down SSE generators...") |
776
3799621cd25b
admin: Correctly flush loggers before exiting.
Ludovic Chabant <ludovic@chabant.com>
parents:
772
diff
changeset
|
21 for h in logger.handlers: |
3799621cd25b
admin: Correctly flush loggers before exiting.
Ludovic Chabant <ludovic@chabant.com>
parents:
772
diff
changeset
|
22 h.flush() |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 global server_shutdown |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 server_shutdown = True |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 raise KeyboardInterrupt() |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 |
772
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
28 def record_pipeline(state): |
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
29 if state.app.config.get('FOODTRUCK_CMDLINE_MODE', False): |
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
30 # Make sure CTRL+C works correctly. |
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
31 logger.debug("Adding SIGINT callback for pipeline thread.") |
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
32 signal.signal( |
812
82509bce94ca
internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents:
778
diff
changeset
|
33 signal.SIGINT, |
82509bce94ca
internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents:
778
diff
changeset
|
34 lambda *args: _shutdown_server_and_raise_sigint( |
82509bce94ca
internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents:
778
diff
changeset
|
35 state.app.debug)) |
772
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
36 |
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
37 |
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
669
diff
changeset
|
38 foodtruck_bp.record(record_pipeline) |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
41 def _read_pid_file(pid_file): |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
42 logger.debug("Reading PID file: %s" % pid_file) |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
43 try: |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
44 with open(pid_file, 'r') as fp: |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
45 pid_str = fp.read() |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
46 |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
47 return int(pid_str.strip()) |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
48 except Exception: |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
49 logger.error("Error reading PID file.") |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
50 raise |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
51 |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
52 |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
53 def _pid_exists(pid): |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
54 logger.debug("Checking if process ID %d is running" % pid) |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
55 try: |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
56 os.kill(pid, 0) |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
57 except OSError as ex: |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
58 if ex.errno == errno.ESRCH: |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
59 # No such process. |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
60 return False |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
61 elif ex.errno == errno.EPERM: |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
62 # No permission, so process exists. |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
63 return True |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
64 else: |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
65 raise |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
66 else: |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
67 return True |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
68 |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
69 |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 class PublishLogReader(object): |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
71 _poll_interval = 1 # Check the process every 1 seconds. |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 _ping_interval = 30 # Send a ping message every 30 seconds. |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 def __init__(self, pid_path, log_path): |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 self.pid_path = pid_path |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 self.log_path = log_path |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 def run(self): |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 logger.debug("Opening publish log...") |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
80 pid = None |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
81 pid_mtime = 0 |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
82 is_running = False |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
83 last_seek = -1 |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
84 last_ping_time = 0 |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 try: |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 while not server_shutdown: |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 # PING! |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
88 interval = time.time() - last_ping_time |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 if interval > self._ping_interval: |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 logger.debug("Sending ping...") |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
91 last_ping_time = time.time() |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 yield bytes("event: ping\ndata: 1\n\n", 'utf8') |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
94 # Check the PID file timestamp. |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 try: |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
96 new_mtime = os.path.getmtime(self.pid_path) |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 except OSError: |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
98 new_mtime = 0 |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
99 |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
100 # If there's a valid PID file and we either just started |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
101 # streaming (pid_mtime == 0) or we remember an older version |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
102 # of that PID file (pid_mtime != new_mtime), let's read the |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
103 # PID from the file. |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
104 is_pid_file_prehistoric = False |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
105 if new_mtime > 0 and new_mtime != pid_mtime: |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
106 is_pid_file_prehistoric = (pid_mtime == 0) |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
107 pid_mtime = new_mtime |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
108 pid = _read_pid_file(self.pid_path) |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
109 |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
110 if is_pid_file_prehistoric: |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
111 logger.debug("PID file is pre-historic, we will skip the " |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
112 "first parts of the log.") |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
113 |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
114 # If we have a valid PID, let's check if the process is |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
115 # currently running. |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
116 was_running = is_running |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
117 if pid: |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
118 is_running = _pid_exists(pid) |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
119 logger.debug( |
812
82509bce94ca
internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents:
778
diff
changeset
|
120 "Process %d is %s" % |
82509bce94ca
internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents:
778
diff
changeset
|
121 (pid, 'running' if is_running else 'not running')) |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
122 if not is_running: |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
123 # Let's forget this PID file until it changes. |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
124 pid = None |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
125 else: |
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
126 is_running = False |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
128 # Read new data from the log file. |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 new_data = None |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
130 if is_running or was_running: |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
131 if last_seek < 0: |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
132 # Only send the "publish started" message if we |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
133 # actually caught the process as it was starting, not |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
134 # if we started streaming after it started. |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
135 # This means we saw the PID file get changed. |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
136 if not is_pid_file_prehistoric: |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
137 outstr = ( |
812
82509bce94ca
internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents:
778
diff
changeset
|
138 'event: message\n' |
82509bce94ca
internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents:
778
diff
changeset
|
139 'data: Publish started.\n\n') |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
140 yield bytes(outstr, 'utf8') |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
141 last_seek = 0 |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 try: |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 with open(self.log_path, 'r', encoding='utf8') as fp: |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
145 fp.seek(last_seek) |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 new_data = fp.read() |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
147 last_seek = fp.tell() |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 except OSError: |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 pass |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
150 if not is_running: |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
151 # Process is not running anymore, let's reset our seek |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
152 # marker back to the beginning. |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
153 last_seek = -1 |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 |
615
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
155 # Stream the new data to the client, but don't send old stuff |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
156 # that happened before we started this stream. |
cbb170d9c894
admin: Improve publish logs showing as alerts in the admin panel.
Ludovic Chabant <ludovic@chabant.com>
parents:
613
diff
changeset
|
157 if new_data and not is_pid_file_prehistoric: |
613
e2e955a3bb25
publish: Add publish command.
Ludovic Chabant <ludovic@chabant.com>
parents:
609
diff
changeset
|
158 logger.debug("SSE: %s" % new_data) |
602
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 for line in new_data.split('\n'): |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 outstr = 'event: message\ndata: %s\n\n' % line |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 yield bytes(outstr, 'utf8') |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 time.sleep(self._poll_interval) |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 except GeneratorExit: |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 pass |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 logger.debug("Closing publish log...") |
c6bc0ef03f82
admin: Better UI for publishing websites.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 |