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.
 
 
 
 
 

96 lines
3.0 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
import urllib3
urllib3.disable_warnings()
##全局_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 && bash 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