Mercurial > piecrust2
annotate piecrust/admin/siteinfo.py @ 955:a4f1eafd1964
admin: Show more info from the publishing process.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 05 Oct 2017 21:31:11 -0700 |
parents | 94fd4f07da83 |
children | 8101692fdc11 |
rev | line source |
---|---|
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import os |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os.path |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import sys |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import copy |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 import logging |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 import threading |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 import subprocess |
955
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
8 from flask import request, flash |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 from piecrust.app import PieCrustFactory |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 logger = logging.getLogger(__name__) |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 class UnauthorizedSiteAccessError(Exception): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 pass |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 class InvalidSiteError(Exception): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 pass |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 class SiteInfo: |
952
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
24 def __init__(self, root_dir, *, url_prefix='', debug=False): |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 self.root_dir = root_dir |
952
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
26 self.url_prefix = url_prefix |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 self.debug = debug |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 self._piecrust_factory = None |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 self._piecrust_app = None |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 self._scm = None |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 |
935
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
32 def make_url(self, rel_url): |
952
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
33 prefix = self.url_prefix |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
34 if not prefix: |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
35 return rel_url |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
36 return prefix + rel_url |
935
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
37 |
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
38 @property |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 def piecrust_factory(self): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 if self._piecrust_factory is None: |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 self._piecrust_factory = PieCrustFactory( |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 self.root_dir, |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 cache_key='admin', |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 debug=self.debug, |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 config_values=[ |
935
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
46 ('site/root', self.make_url('/preview/')), |
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
47 ('site/asset_url_format', self.make_url( |
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
48 '/preview/_asset/%path%'))] |
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
886
diff
changeset
|
49 ) |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 return self._piecrust_factory |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 @property |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 def piecrust_app(self): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 if self._piecrust_app is None: |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 logger.debug("Creating PieCrust admin app: %s" % self.root_dir) |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 self._piecrust_app = self.piecrust_factory.create() |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 return self._piecrust_app |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 @property |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 def scm(self): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 if self._scm is None: |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 cfg = copy.deepcopy(self.piecrust_app.config.get('scm', {})) |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 if os.path.isdir(os.path.join(self.root_dir, '.hg')): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 from .scm.mercurial import MercurialSourceControl |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 self._scm = MercurialSourceControl(self.root_dir, cfg) |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 elif os.path.isdir(os.path.join(self.root_dir, '.git')): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 from .scm.git import GitSourceControl |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 self._scm = GitSourceControl(self.root_dir, cfg) |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 else: |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 self._scm = False |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 return self._scm |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 @property |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 def publish_pid_file(self): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 return os.path.join(self.piecrust_app.cache_dir, 'publish.pid') |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 @property |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 def publish_log_file(self): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 return os.path.join(self.piecrust_app.cache_dir, 'publish.log') |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 |
955
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
83 def getPublishTargetLogFile(self, target): |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
84 target = target.replace(' ', '_').lower() |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
85 return os.path.join(self.piecrust_app.cache_dir, |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
86 'publish.%s.log' % target) |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
87 |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 def publish(self, target): |
952
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
89 chef_path = os.path.realpath(os.path.join( |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
90 os.path.dirname(__file__), |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
91 '../../chef.py')) |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 args = [ |
952
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
93 sys.executable, chef_path, |
955
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
94 '--no-color', |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 '--pid-file', self.publish_pid_file, |
955
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
96 '--log', self.publish_log_file, |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 'publish', |
955
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
98 '--log-publisher', self.getPublishTargetLogFile(target), |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
99 '--log-debug-info', |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 target] |
952
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
101 env = {} |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
102 for k, v in os.environ.items(): |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
103 env[k] = v |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
104 env['PYTHONHOME'] = sys.prefix |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
105 logger.info("Running publishing command: %s" % args) |
94fd4f07da83
admin: Fix more URL prefix issues, improve publishing.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
106 proc = subprocess.Popen(args, cwd=self.root_dir, env=env) |
955
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
107 logger.info("Publishing process ID: %s" % proc.pid) |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
108 try: |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
109 proc.wait(timeout=2) |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
110 if proc.returncode == 0: |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
111 flash("Publish process ran successfully!") |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
112 else: |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
113 flash("Publish process returned '%s'... check the log." % |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
114 proc.returncode) |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
115 except subprocess.TimeoutExpired: |
a4f1eafd1964
admin: Show more info from the publishing process.
Ludovic Chabant <ludovic@chabant.com>
parents:
952
diff
changeset
|
116 flash("Publish process is still running... check the log later.") |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 |