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

#-*- 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