view piecrust/admin/views/publish.py @ 1185:24413a2963b9

admin: Add hidden system information on publish page for troubleshooting.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 01 Oct 2020 10:58:33 -0700
parents 0d699f04968c
children
line wrap: on
line source

import os
import sys
import copy
import pprint
import logging
from flask import request, g, url_for, render_template, Response
from flask_login import login_required
from ..blueprint import foodtruck_bp
from ..pubutil import PublishLogReader
from ..views import with_menu_context


logger = logging.getLogger(__name__)


@foodtruck_bp.route('/publish', methods=['GET', 'POST'])
@login_required
def publish():
    if request.method == 'POST':
        target = request.form.get('target')
        if not target:
            raise Exception("No target specified.")

        g.site.publish(target)

    site = g.site
    pub_cfg = copy.deepcopy(site.piecrust_app.config.get('publish', {}))
    if not pub_cfg:
        data = {'error': "There are no publish targets defined in your "
                         "configuration file."}
        return render_template('error.html', **data)

    try:
        with open(site.publish_log_file, 'r') as fp:
            last_pub_log = fp.read()
    except OSError:
        last_pub_log = None

    data = {}
    data['url_run'] = url_for('.publish')
    data['site_title'] = site.piecrust_app.config.get('site/title',
                                                      "Unnamed Website")
    data['sysinfo'] = str({
        'sys.base_exec_prefix': sys.base_exec_prefix,
        'sys.base_prefix': sys.base_prefix,
        'sys.exec_prefix': sys.exec_prefix,
        'sys.executable': sys.executable,
        'sys.path': sys.path,
        'sys.platform': sys.platform,
        'sys.prefix': sys.prefix,
        'PYTHONHOME': os.getenv('PYTHONHOME'),
        'PYTHONPATH': os.getenv('PYTHONPATH')
    })
    data['targets'] = []
    for tn in sorted(pub_cfg.keys()):
        tc = pub_cfg[tn]
        desc = None
        if isinstance(tc, dict):
            desc = tc.get('description')

            tc = tc.copy()
            tc.pop('description')
            tc = pprint.pformat(tc, indent=4)

        data['targets'].append({
            'name': tn,
            'description': desc,
            'config': tc
        })

    data['last_log'] = last_pub_log

    with_menu_context(data)

    return render_template('publish.html', **data)


@foodtruck_bp.route('/publish-log')
@login_required
def stream_publish_log():
    pid_path = g.site.publish_pid_file
    log_path = g.site.publish_log_file
    rdr = PublishLogReader(pid_path, log_path)

    response = Response(rdr.run(), mimetype='text/event-stream')
    response.headers['Cache-Control'] = 'no-cache'
    return response