mirror of https://github.com/IoTcat/PyOne.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.9 KiB
93 lines
2.9 KiB
#-*- coding=utf-8 -*- |
|
from flask import render_template,redirect,abort,make_response,jsonify,request,url_for,Response,session,flash |
|
from flask_sqlalchemy import Pagination |
|
from self_config import * |
|
from ..utils import * |
|
from ..extend import * |
|
from .. import * |
|
from . import admin |
|
import os |
|
import io |
|
import re |
|
import base64 |
|
import subprocess |
|
import random |
|
import string |
|
import math |
|
import urllib |
|
import signal |
|
import time |
|
from shelljob import proc |
|
|
|
|
|
##全局_pid |
|
global _pid |
|
_pid=None |
|
|
|
############视图函数 |
|
@admin.before_request |
|
def before_request(): |
|
if request.endpoint.startswith('admin') and request.endpoint!='admin.login' and session.get('login') is None: #and request.endpoint!='admin.install' |
|
return redirect(url_for('admin.login')) |
|
|
|
|
|
########web console |
|
@admin.route('/web_console') |
|
def web_console(): |
|
g = proc.Group() |
|
action=request.args.get('action') |
|
allow_action=['UpdateFile','UploadDir','Upload'] |
|
if action not in allow_action: |
|
return make_response('error') |
|
if action in ['UploadDir','Upload']: |
|
local=urllib.unquote(request.args.get('local')) |
|
remote=urllib.unquote(request.args.get('remote')) |
|
user=urllib.unquote(request.args.get('user')) |
|
cmd=["python","-u",os.path.join(config_dir,'function.py'),action,local,remote,user] |
|
elif action=='UpdateFile': |
|
type_=request.args.get('type') |
|
cmd=["python","-u",os.path.join(config_dir,'function.py'),'UpdateFile',type_] |
|
else: |
|
cmd=["python","-u",os.path.join(config_dir,'function.py'),action] |
|
p = g.run(cmd) |
|
def read_process(): |
|
while g.is_pending(): |
|
lines = g.readlines() |
|
for proc, line in lines: |
|
yield "data:" + line + "\n\n" |
|
yield "data:end\n\n" |
|
resp=Response(read_process(), mimetype= 'text/event-stream') |
|
return resp |
|
|
|
|
|
@admin.route('/stream',methods=["POST","GET"]) |
|
def stream(): |
|
cmd_dict={ |
|
'upgrade':"cd {} && git pull origin master && sh update.sh".format(config_dir), |
|
'running_log':'tail -30f {}/logs/PyOne.{}.log'.format(config_dir,'running'), |
|
'error_log':'tail -30f {}/logs/PyOne.{}.log'.format(config_dir,'error') |
|
} |
|
command=cmd_dict[request.args.get('command')] |
|
def generate(): |
|
popen=subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) |
|
global _pid |
|
tc=TimeCalculator() |
|
_pid=popen.pid |
|
while not popen.poll(): |
|
msg=popen.stdout.readline() |
|
if msg=='end': |
|
yield "data:end\n\n" |
|
break |
|
yield "data:" + msg + "\n\n" |
|
if tc.PassNow()>=3: |
|
time.sleep(1) |
|
yield "data:end\n\n" |
|
return Response(generate(), mimetype= 'text/event-stream') |
|
|
|
@admin.teardown_request |
|
def teardown(exestr): |
|
global _pid |
|
if _pid is not None: |
|
# InfoLogger().print_r('kill pid {}'.format(_pid)) |
|
os.kill(_pid, signal.SIGINT) |
|
_pid=None
|
|
|