change the user module to an independent http server.
This commit is contained in:
parent
eca0fe949c
commit
1a8eef9867
|
@ -13,6 +13,7 @@ LXC_SCRIPT=$DOCKLET_CONF/lxc-script
|
|||
DOCKLET_SRC=$DOCKLET_HOME/src
|
||||
DOCKLET_LIB=$DOCKLET_SRC
|
||||
DOCKLET_WEB=$DOCKLET_HOME/web
|
||||
DOCKLET_USER=$DOCKLET_HOME/user
|
||||
|
||||
# default working directory, default to /opt/docklet
|
||||
FS_PREFIX=/opt/docklet
|
||||
|
@ -32,6 +33,7 @@ ETCD=localhost:2379
|
|||
CLUSTER_NAME=docklet-vc
|
||||
#web port, default is 8888
|
||||
WEB_PORT=8888
|
||||
USER_PORT=9100
|
||||
#cluster net, default is 172.16.0.1/16
|
||||
CLUSTER_NET="172.16.0.1/16"
|
||||
|
||||
|
@ -61,6 +63,12 @@ DAEMON_NAME_WEB=docklet-web
|
|||
PIDFILE_WEB=$RUN_DIR/docklet-web.pid
|
||||
DAEMON_OPTS_WEB=
|
||||
|
||||
# settings for docklet user
|
||||
DAEMON_USER_MODULE=$DOCKLET_USER/user.py
|
||||
DAEMON_NAME_USER=docklet-user
|
||||
PIDFILE_USER=$RUN_DIR/docklet-user.pid
|
||||
DAEMON_OPTS_USER=
|
||||
|
||||
RUNNING_CONFIG=$FS_PREFIX/local/docklet-running.conf
|
||||
export CONFIG=$RUNNING_CONFIG
|
||||
|
||||
|
@ -121,7 +129,7 @@ do_start_proxy () {
|
|||
}
|
||||
|
||||
pre_start_web () {
|
||||
log_daemon_msg "Starting $DAEMON_NAME_WEB in $FS_PREFIX"
|
||||
log_daemon_msg "Starting $DAEMON_NAME_WEB in $FS_PREFIX"
|
||||
|
||||
webip=$(ip addr show $NETWORK_DEVICE | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+")
|
||||
|
||||
|
@ -144,6 +152,14 @@ do_start_web () {
|
|||
log_end_msg $?
|
||||
}
|
||||
|
||||
do_start_user () {
|
||||
log_daemon_msg "Starting $DAEMON_NAME_USER in $FS_PREFIX"
|
||||
|
||||
DAEMON_OPTS_USER="-p $USER_PORT"
|
||||
|
||||
start-stop-daemon --start --background --pidfile $PIDFILE_USER --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON_USER_MODULE -- $DAEMON_OPTS_USER
|
||||
log_end_msg $?
|
||||
}
|
||||
|
||||
do_stop_master () {
|
||||
log_daemon_msg "Stopping $DAEMON_NAME_MASTER daemon"
|
||||
|
@ -164,22 +180,31 @@ do_stop_web () {
|
|||
log_end_msg $?
|
||||
}
|
||||
|
||||
do_stop_user () {
|
||||
log_daemon_msg "Stopping $DAEMON_NAME_USER daemon"
|
||||
start-stop-daemon --stop --quiet --oknodo --remove-pidfile --pidfile $PIDFILE_USER --retry 10
|
||||
log_end_msg $?
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
init)
|
||||
do_start_master "new"
|
||||
do_start_proxy
|
||||
do_start_web
|
||||
do_start_user
|
||||
;;
|
||||
start)
|
||||
do_start_master "recovery"
|
||||
do_start_proxy
|
||||
do_start_web
|
||||
do_start_user
|
||||
;;
|
||||
|
||||
stop)
|
||||
do_stop_web
|
||||
do_stop_proxy
|
||||
do_stop_master
|
||||
do_stop_user
|
||||
;;
|
||||
|
||||
restart)
|
||||
|
@ -221,6 +246,7 @@ case "$1" in
|
|||
status_of_proc -p $PIDFILE_MASTER "$DAEMON_MASTER" "$DAEMON_NAME_MASTER" || status=$?
|
||||
status_of_proc -p $PIDFILE_PROXY "$DAEMON_PROXY" "$DAEMON_NAME_PROXY" || status=$?
|
||||
status_of_proc -p $PIDFILE_WEB "$DAEMON_WEB" "$DAEMON_NAME_WEB" || status=$?
|
||||
status_of_proc -p $PIDFILE_USER "$DAEMON_USER" "$DAEMON_NAME_USER" || status=$?
|
||||
exit $status
|
||||
;;
|
||||
|
||||
|
|
456
src/httprest.py
456
src/httprest.py
|
@ -27,12 +27,19 @@ import userManager
|
|||
import monitor,traceback
|
||||
import threading
|
||||
import sysmgr
|
||||
import requests
|
||||
|
||||
#default EXTERNAL_LOGIN=False
|
||||
external_login = env.getenv('EXTERNAL_LOGIN')
|
||||
if (external_login == 'TRUE'):
|
||||
from userDependence import external_auth
|
||||
|
||||
#userpoint = env.getenv('USER_IP') + ":" + env.getenv('USER_PORT')
|
||||
userpoint = "http://0.0.0.0:9100"
|
||||
|
||||
def post_to_user(url = '/', data={}):
|
||||
return requests.post(userpoint+url,data=data).json()
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
from functools import wraps
|
||||
|
@ -41,95 +48,38 @@ from functools import wraps
|
|||
def login_required(func):
|
||||
@wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
global G_usermgr
|
||||
logger.info ("get request, path: %s" % request.path)
|
||||
token = request.form.get("token", None)
|
||||
if (token == None):
|
||||
return json.dumps({'success':'false', 'message':'user or key is null'})
|
||||
cur_user = G_usermgr.auth_token(token)
|
||||
if (cur_user == None):
|
||||
return json.dumps({'success':'false', 'message':'token failed or expired', 'Unauthorized': 'True'})
|
||||
return func(cur_user, cur_user.username, request.form, *args, **kwargs)
|
||||
result = post_to_user("/authtoken/", {'token':token})
|
||||
if result.get('success') == 'true':
|
||||
username = result.get('username')
|
||||
beans = result.get('beans')
|
||||
else:
|
||||
return result
|
||||
#if (cur_user == None):
|
||||
# return json.dumps({'success':'false', 'message':'token failed or expired', 'Unauthorized': 'True'})
|
||||
return func(username, beans, request.form, *args, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
@app.route("/login/", methods=['POST'])
|
||||
def login():
|
||||
global G_usermgr
|
||||
logger.info ("handle request : user login")
|
||||
user = request.form.get("user", None)
|
||||
key = request.form.get("key", None)
|
||||
if user == None or key == None:
|
||||
return json.dumps({'success':'false', 'message':'user or key is null'})
|
||||
auth_result = G_usermgr.auth(user, key)
|
||||
if auth_result['success'] == 'false':
|
||||
return json.dumps({'success':'false', 'message':'auth failed'})
|
||||
return json.dumps({'success':'true', 'action':'login', 'data': auth_result['data']})
|
||||
|
||||
@app.route("/external_login/", methods=['POST'])
|
||||
def external_login():
|
||||
global G_usermgr
|
||||
logger.info ("handle request : external user login")
|
||||
try:
|
||||
result = G_usermgr.auth_external(request.form)
|
||||
return json.dumps(result)
|
||||
except:
|
||||
result = {'success': 'false', 'reason': 'Something wrong happened when auth an external account'}
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/register/", methods=['POST'])
|
||||
def register():
|
||||
global G_usermgr
|
||||
if request.form.get('activate', None) == None:
|
||||
logger.info ("handle request : user register")
|
||||
username = request.form.get('username', '')
|
||||
password = request.form.get('password', '')
|
||||
email = request.form.get('email', '')
|
||||
description = request.form.get('description','')
|
||||
if (username == '' or password == '' or email == ''):
|
||||
return json.dumps({'success':'false'})
|
||||
newuser = G_usermgr.newuser()
|
||||
newuser.username = request.form.get('username')
|
||||
newuser.password = request.form.get('password')
|
||||
newuser.e_mail = request.form.get('email')
|
||||
newuser.student_number = request.form.get('studentnumber')
|
||||
newuser.department = request.form.get('department')
|
||||
newuser.nickname = request.form.get('truename')
|
||||
newuser.truename = request.form.get('truename')
|
||||
newuser.description = request.form.get('description')
|
||||
newuser.status = "init"
|
||||
newuser.auth_method = "local"
|
||||
result = G_usermgr.register(user = newuser)
|
||||
return json.dumps(result)
|
||||
else:
|
||||
logger.info ("handle request, user activating")
|
||||
token = request.form.get("token", None)
|
||||
if (token == None):
|
||||
return json.dumps({'success':'false', 'message':'user or key is null'})
|
||||
cur_user = G_usermgr.auth_token(token)
|
||||
if (cur_user == None):
|
||||
return json.dumps({'success':'false', 'message':'token failed or expired', 'Unauthorized': 'True'})
|
||||
newuser = G_usermgr.newuser()
|
||||
newuser.username = cur_user.username
|
||||
newuser.nickname = cur_user.truename
|
||||
newuser.status = 'applying'
|
||||
newuser.user_group = cur_user.user_group
|
||||
newuser.auth_method = cur_user.auth_method
|
||||
newuser.e_mail = request.form.get('email','')
|
||||
newuser.student_number = request.form.get('studentnumber', '')
|
||||
newuser.department = request.form.get('department', '')
|
||||
newuser.truename = request.form.get('truename', '')
|
||||
newuser.tel = request.form.get('tel', '')
|
||||
newuser.description = request.form.get('description', '')
|
||||
result = G_usermgr.register(user = newuser)
|
||||
userManager.send_remind_activating_email(newuser.username)
|
||||
return json.dumps(result)
|
||||
def beans_check(func):
|
||||
@wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
beans = args[1]
|
||||
if beans <= 0:
|
||||
return json.dumps({'success':'false','message':'user\'s beans are less than or equal to zero!'})
|
||||
else:
|
||||
return func(*args, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
@app.route("/cluster/create/", methods=['POST'])
|
||||
@login_required
|
||||
def create_cluster(cur_user, user, form):
|
||||
global G_usermgr
|
||||
@beans_check
|
||||
def create_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
|
@ -138,7 +88,7 @@ def create_cluster(cur_user, user, form):
|
|||
image['name'] = form.get("imagename", None)
|
||||
image['type'] = form.get("imagetype", None)
|
||||
image['owner'] = form.get("imageowner", None)
|
||||
user_info = G_usermgr.selfQuery(cur_user = cur_user)
|
||||
user_info = post_to_user("/user/selfQuery/", {'token':form.get("token")})
|
||||
user_info = json.dumps(user_info)
|
||||
logger.info ("handle request : create cluster %s with image %s " % (clustername, image['name']))
|
||||
setting = {
|
||||
|
@ -146,20 +96,22 @@ def create_cluster(cur_user, user, form):
|
|||
'memory': form.get('memorySetting'),
|
||||
'disk': form.get('diskSetting')
|
||||
}
|
||||
[status, result] = G_usermgr.usageInc(cur_user = cur_user, modification = setting)
|
||||
res = post_to_user("/user/usageInc/", {'token':form.get('token'), 'setting':json.dumps(setting)})
|
||||
status = res.get('success')
|
||||
result = res.get('result')
|
||||
if not status:
|
||||
return json.dumps({'success':'false', 'action':'create cluster', 'message':result})
|
||||
[status, result] = G_vclustermgr.create_cluster(clustername, user, image, user_info, setting)
|
||||
if status:
|
||||
return json.dumps({'success':'true', 'action':'create cluster', 'message':result})
|
||||
else:
|
||||
G_usermgr.usageRecover(cur_user = cur_user, modification = setting)
|
||||
post_to_user("/user/usageRecover/", {'token':form.get('token'), 'setting':json.dumps(setting)})
|
||||
return json.dumps({'success':'false', 'action':'create cluster', 'message':result})
|
||||
|
||||
@app.route("/cluster/scaleout/", methods=['POST'])
|
||||
@login_required
|
||||
def scaleout_cluster(cur_user, user, form):
|
||||
global G_usermgr
|
||||
@beans_check
|
||||
def scaleout_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
|
@ -169,33 +121,35 @@ def scaleout_cluster(cur_user, user, form):
|
|||
image['name'] = form.get("imagename", None)
|
||||
image['type'] = form.get("imagetype", None)
|
||||
image['owner'] = form.get("imageowner", None)
|
||||
user_info = G_usermgr.selfQuery(cur_user = cur_user)
|
||||
user_info = post_to_user("/user/selfQuery/", {'token':form.get("token")})
|
||||
user_info = json.dumps(user_info)
|
||||
setting = {
|
||||
'cpu': form.get('cpuSetting'),
|
||||
'memory': form.get('memorySetting'),
|
||||
'disk': form.get('diskSetting')
|
||||
}
|
||||
[status, result] = G_usermgr.usageInc(cur_user = cur_user, modification = setting)
|
||||
res = post_to_user("/user/usageInc/", {'token':form.get('token'), 'setting':json.dumps(setting)})
|
||||
status = res.get('success')
|
||||
result = res.get('result')
|
||||
if not status:
|
||||
return json.dumps({'success':'false', 'action':'scale out', 'message': result})
|
||||
[status, result] = G_vclustermgr.scale_out_cluster(clustername, user, image, user_info, setting)
|
||||
if status:
|
||||
return json.dumps({'success':'true', 'action':'scale out', 'message':result})
|
||||
else:
|
||||
G_usermgr.usageRecover(cur_user = cur_user, modification = setting)
|
||||
post_to_user("/user/usageRecover/", {'token':form.get('token'), 'setting':json.dumps(setting)})
|
||||
return json.dumps({'success':'false', 'action':'scale out', 'message':result})
|
||||
|
||||
@app.route("/cluster/scalein/", methods=['POST'])
|
||||
@login_required
|
||||
def scalein_cluster(cur_user, user, form):
|
||||
def scalein_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
return json.dumps({'success':'false', 'message':'clustername is null'})
|
||||
logger.info("handle request : scale in %s" % clustername)
|
||||
containername = form.get("containername", None)
|
||||
G_usermgr.usageRelease(cur_user = cur_user, clustername = clustername, containername = containername, allcontainer = False)
|
||||
post_to_user("/user/usageRelease/", {'token':form.get('token'), 'clustername':clustername, 'containername':containername, 'allcontainer':False})
|
||||
[status, result] = G_vclustermgr.scale_in_cluster(clustername, user, containername)
|
||||
if status:
|
||||
return json.dumps({'success':'true', 'action':'scale in', 'message':result})
|
||||
|
@ -204,7 +158,8 @@ def scalein_cluster(cur_user, user, form):
|
|||
|
||||
@app.route("/cluster/start/", methods=['POST'])
|
||||
@login_required
|
||||
def start_cluster(cur_user, user, form):
|
||||
@beans_check
|
||||
def start_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
|
@ -218,7 +173,7 @@ def start_cluster(cur_user, user, form):
|
|||
|
||||
@app.route("/cluster/stop/", methods=['POST'])
|
||||
@login_required
|
||||
def stop_cluster(cur_user, user, form):
|
||||
def stop_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
|
@ -232,16 +187,15 @@ def stop_cluster(cur_user, user, form):
|
|||
|
||||
@app.route("/cluster/delete/", methods=['POST'])
|
||||
@login_required
|
||||
def delete_cluster(cur_user, user, form):
|
||||
def delete_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
global G_usermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
return json.dumps({'success':'false', 'message':'clustername is null'})
|
||||
logger.info ("handle request : delete cluster %s" % clustername)
|
||||
user_info = G_usermgr.selfQuery(cur_user=cur_user)
|
||||
user_info = post_to_user("/user/selfQuery/" , {'token':form.get("token")})
|
||||
user_info = json.dumps(user_info)
|
||||
G_usermgr.usageRelease(cur_user = cur_user, clustername = clustername, containername = "all", allcontainer = True)
|
||||
post_to_user("/user/usageRelease/", {'token':form.get('token'), 'clustername':clustername, 'containername':'all', 'allcontainer':True})
|
||||
[status, result] = G_vclustermgr.delete_cluster(clustername, user, user_info)
|
||||
if status:
|
||||
return json.dumps({'success':'true', 'action':'delete cluster', 'message':result})
|
||||
|
@ -250,7 +204,7 @@ def delete_cluster(cur_user, user, form):
|
|||
|
||||
@app.route("/cluster/info/", methods=['POST'])
|
||||
@login_required
|
||||
def info_cluster(cur_user, user, form):
|
||||
def info_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
|
@ -264,7 +218,7 @@ def info_cluster(cur_user, user, form):
|
|||
|
||||
@app.route("/cluster/list/", methods=['POST'])
|
||||
@login_required
|
||||
def list_cluster(cur_user, user, form):
|
||||
def list_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
logger.info ("handle request : list clusters for %s" % user)
|
||||
[status, clusterlist] = G_vclustermgr.list_clusters(user)
|
||||
|
@ -273,9 +227,22 @@ def list_cluster(cur_user, user, form):
|
|||
else:
|
||||
return json.dumps({'success':'false', 'action':'list cluster', 'message':clusterlist})
|
||||
|
||||
@app.route("/cluster/stopall/",methods=['POST'])
|
||||
@login_required
|
||||
def stopall_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
logger.info ("handle request : stop all clusters for %s" % user)
|
||||
[status, clusterlist] = G_vclustermgr.list_clusters(user)
|
||||
if status:
|
||||
for cluster in clusterlist:
|
||||
G_vclustermgr.stop_cluster(cluster,user)
|
||||
return json.dumps({'success':'true', 'action':'stop all cluster'})
|
||||
else:
|
||||
return json.dumps({'success':'false', 'action':'stop all cluster', 'message':clusterlist})
|
||||
|
||||
@app.route("/cluster/flush/", methods=['POST'])
|
||||
@login_required
|
||||
def flush_cluster(cur_user, user, form):
|
||||
def flush_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
|
@ -286,9 +253,8 @@ def flush_cluster(cur_user, user, form):
|
|||
|
||||
@app.route("/cluster/save/", methods=['POST'])
|
||||
@login_required
|
||||
def save_cluster(cur_user, user, form):
|
||||
def save_cluster(user, beans, form):
|
||||
global G_vclustermgr
|
||||
global G_usermgr
|
||||
clustername = form.get('clustername', None)
|
||||
if (clustername == None):
|
||||
return json.dumps({'success':'false', 'message':'clustername is null'})
|
||||
|
@ -302,7 +268,7 @@ def save_cluster(cur_user, user, form):
|
|||
if not status:
|
||||
return json.dumps({'success':'false','reason':'exists', 'message':message})
|
||||
|
||||
user_info = G_usermgr.selfQuery(cur_user = cur_user)
|
||||
user_info = post_to_user("/user/selfQuery/", {'token':form.get("token")})
|
||||
[status,message] = G_vclustermgr.create_image(user,clustername,containername,imagename,description,user_info["data"]["groupinfo"]["image"])
|
||||
if status:
|
||||
logger.info("image has been saved")
|
||||
|
@ -314,14 +280,22 @@ def save_cluster(cur_user, user, form):
|
|||
|
||||
@app.route("/image/list/", methods=['POST'])
|
||||
@login_required
|
||||
def list_image(cur_user, user, form):
|
||||
def list_image(user, beans, form):
|
||||
global G_imagemgr
|
||||
images = G_imagemgr.list_images(user)
|
||||
return json.dumps({'success':'true', 'images': images})
|
||||
|
||||
@app.route("/image/updatebase/", methods=['POST'])
|
||||
@login_required
|
||||
def update_base(user, beans, form):
|
||||
global G_imagemgr
|
||||
global G_vclustermgr
|
||||
[success, status] = G_imagemgr.update_base_image(user, G_vclustermgr, form.get('image'))
|
||||
return json.dumps({'success':'true', 'message':status})
|
||||
|
||||
@app.route("/image/description/", methods=['POST'])
|
||||
@login_required
|
||||
def description_image(cur_user, user, form):
|
||||
def description_image(user, beans, form):
|
||||
global G_imagemgr
|
||||
image = {}
|
||||
image['name'] = form.get("imagename", None)
|
||||
|
@ -332,7 +306,7 @@ def description_image(cur_user, user, form):
|
|||
|
||||
@app.route("/image/share/", methods=['POST'])
|
||||
@login_required
|
||||
def share_image(cur_user, user, form):
|
||||
def share_image(user, beans, form):
|
||||
global G_imagemgr
|
||||
image = form.get('image')
|
||||
G_imagemgr.shareImage(user,image)
|
||||
|
@ -340,7 +314,7 @@ def share_image(cur_user, user, form):
|
|||
|
||||
@app.route("/image/unshare/", methods=['POST'])
|
||||
@login_required
|
||||
def unshare_image(cur_user, user, form):
|
||||
def unshare_image(user, beans, form):
|
||||
global G_imagemgr
|
||||
image = form.get('image', None)
|
||||
G_imagemgr.unshareImage(user,image)
|
||||
|
@ -348,7 +322,7 @@ def unshare_image(cur_user, user, form):
|
|||
|
||||
@app.route("/image/delete/", methods=['POST'])
|
||||
@login_required
|
||||
def delete_image(cur_user, user, form):
|
||||
def delete_image(user, beans, form):
|
||||
global G_imagemgr
|
||||
image = form.get('image', None)
|
||||
G_imagemgr.removeImage(user,image)
|
||||
|
@ -356,7 +330,7 @@ def delete_image(cur_user, user, form):
|
|||
|
||||
@app.route("/addproxy/", methods=['POST'])
|
||||
@login_required
|
||||
def addproxy(cur_user, user, form):
|
||||
def addproxy(user, beans, form):
|
||||
global G_vclustermgr
|
||||
logger.info ("handle request : add proxy")
|
||||
proxy_ip = form.get("ip", None)
|
||||
|
@ -370,7 +344,7 @@ def addproxy(cur_user, user, form):
|
|||
|
||||
@app.route("/deleteproxy/", methods=['POST'])
|
||||
@login_required
|
||||
def deleteproxy(cur_user, user, form):
|
||||
def deleteproxy(user, beans, form):
|
||||
global G_vclustermgr
|
||||
logger.info ("handle request : delete proxy")
|
||||
clustername = form.get("clustername", None)
|
||||
|
@ -379,7 +353,7 @@ def deleteproxy(cur_user, user, form):
|
|||
|
||||
@app.route("/monitor/hosts/<com_id>/<issue>/", methods=['POST'])
|
||||
@login_required
|
||||
def hosts_monitor(cur_user, user, form, com_id, issue):
|
||||
def hosts_monitor(user, beans, form, com_id, issue):
|
||||
global G_clustername
|
||||
|
||||
logger.info("handle request: monitor/hosts")
|
||||
|
@ -421,7 +395,7 @@ def hosts_monitor(cur_user, user, form, com_id, issue):
|
|||
|
||||
@app.route("/monitor/vnodes/<con_id>/<issue>/", methods=['POST'])
|
||||
@login_required
|
||||
def vnodes_monitor(cur_user, user, form, con_id, issue):
|
||||
def vnodes_monitor(user, beans, form, con_id, issue):
|
||||
global G_clustername
|
||||
logger.info("handle request: monitor/vnodes")
|
||||
res = {}
|
||||
|
@ -436,7 +410,7 @@ def vnodes_monitor(cur_user, user, form, con_id, issue):
|
|||
res['basic_info'] = fetcher.get_basic_info()
|
||||
elif issue == 'owner':
|
||||
names = con_id.split('-')
|
||||
result = G_usermgr.query(username = names[0], cur_user = cur_user)
|
||||
result = post_to_user("/user/query/", data = {"token": form.get(token)})
|
||||
if result['success'] == 'false':
|
||||
res['username'] = ""
|
||||
res['truename'] = ""
|
||||
|
@ -450,246 +424,32 @@ def vnodes_monitor(cur_user, user, form, con_id, issue):
|
|||
|
||||
@app.route("/monitor/user/quotainfo/", methods=['POST'])
|
||||
@login_required
|
||||
def user_quotainfo_monitor(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: monitor/user/quotainfo/")
|
||||
user_info = G_usermgr.selfQuery(cur_user = cur_user)
|
||||
quotainfo = user_info['data']['groupinfo']
|
||||
return json.dumps({'success':'true', 'quotainfo':quotainfo})
|
||||
def user_quotainfo_monitor(user, beans, form, issue):
|
||||
global G_historymgr
|
||||
if issue == 'quotainfo':
|
||||
logger.info("handle request: monitor/user/quotainfo/")
|
||||
user_info = post_to_user("/user/selfQuery/", {'token':form.get("token")})
|
||||
quotainfo = user_info['data']['groupinfo']
|
||||
return json.dumps({'success':'true', 'quotainfo':quotainfo})
|
||||
elif issue == 'createdvnodes':
|
||||
logger.info("handle request: monitor/user/createdvnodes/")
|
||||
res = G_historymgr.getCreatedVNodes(user)
|
||||
return json.dumps({'success':'true', 'createdvnodes':res})
|
||||
else:
|
||||
return json.dumps({'success':'false', 'message':"Unspported Method!"})
|
||||
|
||||
@app.route("/monitor/listphynodes/", methods=['POST'])
|
||||
@login_required
|
||||
def listphynodes_monitor(cur_user, user, form):
|
||||
def listphynodes_monitor(user, beans, form):
|
||||
global G_nodemgr
|
||||
logger.info("handle request: monitor/listphynodes/")
|
||||
res = {}
|
||||
res['allnodes'] = G_nodemgr.get_allnodes()
|
||||
return json.dumps({'success':'true', 'monitor':res})
|
||||
|
||||
|
||||
@app.route("/user/modify/", methods=['POST'])
|
||||
@login_required
|
||||
def modify_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/modify/")
|
||||
result = G_usermgr.modify(newValue = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/groupModify/", methods=['POST'])
|
||||
@login_required
|
||||
def groupModify_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupModify/")
|
||||
result = G_usermgr.groupModify(newValue = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/query/", methods=['POST'])
|
||||
@login_required
|
||||
def query_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/query/")
|
||||
result = G_usermgr.query(ID = form.get("ID"), cur_user = cur_user)
|
||||
if (result.get('success', None) == None or result.get('success', None) == "false"):
|
||||
return json.dumps(result)
|
||||
else:
|
||||
result = G_usermgr.queryForDisplay(user = result['token'])
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/add/", methods=['POST'])
|
||||
@login_required
|
||||
def add_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/add/")
|
||||
user = G_usermgr.newuser(cur_user = cur_user)
|
||||
user.username = form.get('username', None)
|
||||
user.password = form.get('password', None)
|
||||
user.e_mail = form.get('e_mail', '')
|
||||
user.status = "normal"
|
||||
result = G_usermgr.register(user = user, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupadd/", methods=['POST'])
|
||||
@login_required
|
||||
def groupadd_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupadd/")
|
||||
result = G_usermgr.groupadd(form = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/chdefault/", methods=['POST'])
|
||||
@login_required
|
||||
def chdefault(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/chdefault/")
|
||||
result = G_usermgr.change_default_group(form = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/quotaadd/", methods=['POST'])
|
||||
@login_required
|
||||
def quotaadd_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/quotaadd/")
|
||||
result = G_usermgr.quotaadd(form = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupdel/", methods=['POST'])
|
||||
@login_required
|
||||
def groupdel_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupdel/")
|
||||
result = G_usermgr.groupdel(name = form.get('name', None), cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/data/", methods=['POST'])
|
||||
@login_required
|
||||
def data_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/data/")
|
||||
result = G_usermgr.userList(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupNameList/", methods=['POST'])
|
||||
@login_required
|
||||
def groupNameList_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupNameList/")
|
||||
result = G_usermgr.groupListName(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupList/", methods=['POST'])
|
||||
@login_required
|
||||
def groupList_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupList/")
|
||||
result = G_usermgr.groupList(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupQuery/", methods=['POST'])
|
||||
@login_required
|
||||
def groupQuery_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupQuery/")
|
||||
result = G_usermgr.groupQuery(name = form.get("name"), cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/selfQuery/", methods=['POST'])
|
||||
@login_required
|
||||
def selfQuery_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/selfQuery/")
|
||||
result = G_usermgr.selfQuery(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/selfModify/", methods=['POST'])
|
||||
@login_required
|
||||
def selfModify_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/selfModify/")
|
||||
result = G_usermgr.selfModify(cur_user = cur_user, newValue = form)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/usageQuery/" , methods=['POST'])
|
||||
@login_required
|
||||
def usageQuery_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/usageQuery/")
|
||||
result = G_usermgr.usageQuery(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/lxcsettingList/", methods=['POST'])
|
||||
@login_required
|
||||
def lxcsettingList_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/lxcsettingList/")
|
||||
result = G_usermgr.lxcsettingList(cur_user = cur_user, form = form)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/chlxcsetting/", methods=['POST'])
|
||||
@login_required
|
||||
def chlxcsetting_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/chlxcsetting/")
|
||||
result = G_usermgr.chlxcsetting(cur_user = cur_user, form = form)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/notification/list/", methods=['POST'])
|
||||
@login_required
|
||||
def list_notifications(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/list/")
|
||||
result = G_notificationmgr.list_notifications(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/create/", methods=['POST'])
|
||||
@login_required
|
||||
def create_notification(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/create/")
|
||||
result = G_notificationmgr.create_notification(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/modify/", methods=['POST'])
|
||||
@login_required
|
||||
def modify_notification(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/modify/")
|
||||
result = G_notificationmgr.modify_notification(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/delete/", methods=['POST'])
|
||||
@login_required
|
||||
def delete_notification(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/delete/")
|
||||
result = G_notificationmgr.delete_notification(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/query_self/", methods=['POST'])
|
||||
@login_required
|
||||
def query_self_notification_simple_infos(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/query_self/")
|
||||
result = G_notificationmgr.query_self_notification_simple_infos(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/query/", methods=['POST'])
|
||||
@login_required
|
||||
def query_notification(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/query/")
|
||||
result = G_notificationmgr.query_notification(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/query/all/", methods=['POST'])
|
||||
@login_required
|
||||
def query_self_notifications_infos(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/query/all/")
|
||||
result = G_notificationmgr.query_self_notifications_infos(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/system/parmList/", methods=['POST'])
|
||||
@login_required
|
||||
def parmList_system(cur_user, user, form):
|
||||
def parmList_system(user, beans, form):
|
||||
global G_sysmgr
|
||||
logger.info("handle request: system/parmList/")
|
||||
result = G_sysmgr.getParmList()
|
||||
|
@ -697,7 +457,7 @@ def parmList_system(cur_user, user, form):
|
|||
|
||||
@app.route("/system/modify/", methods=['POST'])
|
||||
@login_required
|
||||
def modify_system(cur_user, user, form):
|
||||
def modify_system(user, beans, form):
|
||||
global G_sysmgr
|
||||
logger.info("handle request: system/modify/")
|
||||
field = form.get("field", None)
|
||||
|
@ -712,7 +472,7 @@ def modify_system(cur_user, user, form):
|
|||
|
||||
@app.route("/system/clear_history/", methods=['POST'])
|
||||
@login_required
|
||||
def clear_system(cur_user, user, form):
|
||||
def clear_system(user, beans, form):
|
||||
global G_sysmgr
|
||||
logger.info("handle request: system/clear_history/")
|
||||
field = form.get("field", None)
|
||||
|
@ -726,7 +486,7 @@ def clear_system(cur_user, user, form):
|
|||
|
||||
@app.route("/system/add/", methods=['POST'])
|
||||
@login_required
|
||||
def add_system(cur_user, user, form):
|
||||
def add_system(user, beans, form):
|
||||
global G_sysmgr
|
||||
logger.info("handle request: system/add/")
|
||||
field = form.get("field", None)
|
||||
|
@ -741,7 +501,7 @@ def add_system(cur_user, user, form):
|
|||
|
||||
@app.route("/system/delete/", methods=['POST'])
|
||||
@login_required
|
||||
def delete_system(cur_user, user, form):
|
||||
def delete_system(user, beans, form):
|
||||
global G_sysmgr
|
||||
logger.info("handle request: system/delete/")
|
||||
field = form.get("field", None)
|
||||
|
@ -755,7 +515,7 @@ def delete_system(cur_user, user, form):
|
|||
|
||||
@app.route("/system/reset_all/", methods=['POST'])
|
||||
@login_required
|
||||
def resetall_system(cur_user, user, form):
|
||||
def resetall_system(user, beans, form):
|
||||
global G_sysmgr
|
||||
logger.info("handle request: system/reset_all/")
|
||||
field = form.get("field", None)
|
||||
|
@ -795,7 +555,6 @@ if __name__ == '__main__':
|
|||
|
||||
global G_nodemgr
|
||||
global G_vclustermgr
|
||||
global G_usermgr
|
||||
global G_notificationmgr
|
||||
global etcdclient
|
||||
global G_networkmgr
|
||||
|
@ -876,10 +635,6 @@ if __name__ == '__main__':
|
|||
if etcdclient.isdir("_lock")[0]:
|
||||
etcdclient.deldir("_lock")
|
||||
|
||||
G_usermgr = userManager.userManager('root')
|
||||
if mode == "new":
|
||||
G_usermgr.initUsage()
|
||||
G_notificationmgr = notificationmgr.NotificationMgr()
|
||||
|
||||
clusternet = env.getenv("CLUSTER_NET")
|
||||
logger.info("using CLUSTER_NET %s" % clusternet)
|
||||
|
@ -906,6 +661,11 @@ if __name__ == '__main__':
|
|||
masterport = env.getenv('MASTER_PORT')
|
||||
logger.info("using MASTER_PORT %d", int(masterport))
|
||||
|
||||
G_historymgr = monitor.History_Manager()
|
||||
master_collector = monitor.Master_Collector(G_nodemgr,ipaddr+":"+str(masterport))
|
||||
master_collector.start()
|
||||
logger.info("master_collector started")
|
||||
|
||||
# server = http.server.HTTPServer((masterip, masterport), DockletHttpHandler)
|
||||
logger.info("starting master server")
|
||||
|
||||
|
|
|
@ -91,6 +91,7 @@ class User(db.Model):
|
|||
self.department = department
|
||||
self.truename = truename
|
||||
self.tel = tel
|
||||
self.beans = 10000
|
||||
if (date != None):
|
||||
self.register_date = date
|
||||
else:
|
||||
|
|
|
@ -4,6 +4,9 @@ import subprocess,re,os,etcdlib,psutil,math,sys
|
|||
import time,threading,json,traceback,platform
|
||||
|
||||
from log import logger
|
||||
from httplib2 import Http
|
||||
from urllib.parse import urlencode
|
||||
from httprest import post_to_user
|
||||
|
||||
monitor_hosts = {}
|
||||
monitor_vnodes = {}
|
||||
|
@ -49,6 +52,77 @@ class Container_Collector(threading.Thread):
|
|||
minutes = int(parts[0])
|
||||
seconds = int(parts[1])
|
||||
return ((days * 24 + hours) * 60 + minutes) * 60 + seconds
|
||||
|
||||
@classmethod
|
||||
def billing_increment(cls,vnode_name):
|
||||
global increment
|
||||
global workercinfo
|
||||
global G_masterip
|
||||
cpu_val = '0'
|
||||
if vnode_name not in workercinfo.keys():
|
||||
return
|
||||
if 'cpu_use' in workercinfo[vnode_name].keys():
|
||||
cpu_val = workercinfo[vnode_name]['cpu_use']['val']
|
||||
if vnode_name not in increment.keys():
|
||||
increment[vnode_name] = {}
|
||||
increment[vnode_name]['lastcputime'] = cpu_val
|
||||
increment[vnode_name]['memincrement'] = 0
|
||||
cpu_increment = float(cpu_val) - float(increment[vnode_name]['lastcputime'])
|
||||
#logger.info("billing:"+str(cpu_increment)+" "+str(increment[container_name]['lastcputime']))
|
||||
if cpu_increment == 0.0:
|
||||
avemem = 0
|
||||
else:
|
||||
avemem = cpu_increment*float(increment[vnode_name]['memincrement'])/1800.0
|
||||
increment[vnode_name]['lastcputime'] = cpu_val
|
||||
increment[vnode_name]['memincrement'] = 0
|
||||
if 'disk_use' in workercinfo[vnode_name].keys():
|
||||
disk_quota = workercinfo[vnode_name]['disk_use']['total']
|
||||
else:
|
||||
disk_quota = 0
|
||||
#logger.info("cpu_increment:"+str(cpu_increment)+" avemem:"+str(avemem)+" disk:"+str(disk_quota)+"\n")
|
||||
billingval = cpu_increment/1000.0 + avemem/500000.0 + float(disk_quota)/1024.0/1024.0/2000
|
||||
if 'basic_info' not in workercinfo[vnode_name].keys():
|
||||
workercinfo[vnode_name]['basic_info'] = {}
|
||||
workercinfo[vnode_name]['basic_info']['billing'] = 0
|
||||
workercinfo[vnode_name]['basic_info']['RunningTime'] = 0
|
||||
nowbillingval = workercinfo[vnode_name]['basic_info']['billing']
|
||||
nowbillingval += math.ceil(billingval)
|
||||
try:
|
||||
vnode = VNode.query.get(vnode_name)
|
||||
vnode.billing = nowbillingval
|
||||
db.session.commit()
|
||||
except Exception as err:
|
||||
vnode = VNode(vnode_name)
|
||||
vnode.billing = nowbillingval
|
||||
db.session.add(vnode)
|
||||
db.session.commit()
|
||||
logger.warning(err)
|
||||
workercinfo[vnode_name]['basic_info']['billing'] = nowbillingval
|
||||
owner_name = get_owner(vnode_name)
|
||||
owner = User.query.filter_by(username=owner_name).first()
|
||||
#result = post_to_user("/user/billing",{'username':owner_name, 'beans': math.ceil(billingval)})
|
||||
#if not result.get('success'):
|
||||
# logger.error(result.get('message'))
|
||||
#else:
|
||||
# beans = result.get('restbeans')
|
||||
# if beans <= 0:
|
||||
# logger.info("The beans of User(" + str(owner_name) + ") are less than or equal to zero, the container("+vnode_name+") will be stopped.")
|
||||
# post_to_user()
|
||||
if owner is None:
|
||||
logger.warning("Error!!! Billing User %s doesn't exist!" % (owner_name))
|
||||
else:
|
||||
#logger.info("Billing User:"+str(owner))
|
||||
owner.beans -= math.ceil(billingval)
|
||||
db.session.commit()
|
||||
#logger.info("Billing User:"+str(owner))
|
||||
if owner.beans <= 0:
|
||||
logger.info("The beans of User(" + str(owner) + ") are less than or equal to zero, the container("+vnode_name+") will be stopped.")
|
||||
token = owner.generate_auth_token()
|
||||
form = {'token':token}
|
||||
header = {'Content-Type':'application/x-www-form-urlencoded'}
|
||||
http = Http()
|
||||
[resp,content] = http.request("http://"+G_masterip+"/cluster/stopall/","POST",urlencode(form),headers = header)
|
||||
logger.info("response from master:"+content.decode('utf-8'))
|
||||
|
||||
def collect_containerinfo(self,container_name):
|
||||
global workerinfo
|
||||
|
|
|
@ -522,25 +522,25 @@ class userManager:
|
|||
db.session.commit()
|
||||
usage = UserUsage.query.filter_by(username = cur_user.username).first()
|
||||
if int(modification['cpu']) <= 0 or int(modification['memory']) <= 0 or int(modification['disk']) <= 0:
|
||||
return [False, "cpu,memory and disk setting cannot less than zero"]
|
||||
return {'success':False, 'result':"cpu,memory and disk setting cannot less than zero"}
|
||||
cpu = int(usage.cpu) + int(modification['cpu'])
|
||||
memory = int(usage.memory) + int(modification['memory'])
|
||||
disk = int(usage.disk) + int(modification['disk'])
|
||||
if cpu > int(groupinfo['cpu']):
|
||||
logger.error("cpu quota exceed, user:%s" % cur_user.username)
|
||||
return [False, "cpu quota exceed"]
|
||||
return {'success':False, 'result':"cpu quota exceed"}
|
||||
if memory > int(groupinfo['memory']):
|
||||
logger.error("memory quota exceed, user:%s" % cur_user.username)
|
||||
return [False, "memory quota exceed"]
|
||||
return {'success':False, 'result':"memory quota exceed"}
|
||||
if disk > int(groupinfo['disk']):
|
||||
logger.error("disk quota exceed, user:%s" % cur_user.username)
|
||||
return [False, "disk quota exceed"]
|
||||
return {'success':False, 'result':"disk quota exceed"}
|
||||
usage.cpu = str(cpu)
|
||||
usage.memory = str(memory)
|
||||
usage.disk = str(disk)
|
||||
db.session.commit()
|
||||
return [True, "distribute the resource"]
|
||||
|
||||
return {'success':True, 'result':"distribute the resource"}
|
||||
|
||||
@token_required
|
||||
def usageRecover(self, *args, **kwargs):
|
||||
'''
|
||||
|
@ -570,7 +570,7 @@ class userManager:
|
|||
usage.memory = str(memory)
|
||||
usage.disk = str(disk)
|
||||
db.session.commit()
|
||||
return True
|
||||
return {'success':True}
|
||||
|
||||
@token_required
|
||||
def usageRelease(self, *args, **kwargs):
|
||||
|
@ -625,8 +625,8 @@ class userManager:
|
|||
usage.memory = str(nowmemory)
|
||||
usage.disk = str(nowdisk)
|
||||
db.session.commit()
|
||||
return True
|
||||
|
||||
return {'success':True}
|
||||
|
||||
def initUsage(*args, **kwargs):
|
||||
"""
|
||||
init the usage info when start docklet with init mode
|
||||
|
|
|
@ -0,0 +1,462 @@
|
|||
#!/usr/bin/python3
|
||||
import json
|
||||
import os
|
||||
import getopt
|
||||
|
||||
import sys, inspect
|
||||
|
||||
|
||||
|
||||
|
||||
this_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile(inspect.currentframe()))[0]))
|
||||
src_folder = os.path.realpath(os.path.abspath(os.path.join(this_folder,"..", "src")))
|
||||
if src_folder not in sys.path:
|
||||
sys.path.insert(0, src_folder)
|
||||
|
||||
# must first init loadenv
|
||||
from log import initlogging
|
||||
initlogging("docklet-user")
|
||||
from log import logger
|
||||
|
||||
import tools, env
|
||||
config = env.getenv("CONFIG")
|
||||
tools.loadenv(config)
|
||||
|
||||
|
||||
from flask import Flask, request, session, render_template, redirect, send_from_directory, make_response, url_for, abort
|
||||
from functools import wraps
|
||||
import userManager,beansapplicationmgr, notificationmgr
|
||||
import threading
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
def login_required(func):
|
||||
@wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
global G_usermgr
|
||||
logger.info ("get request, path: %s" % request.path)
|
||||
token = request.form.get("token", None)
|
||||
if (token == None):
|
||||
return json.dumps({'success':'false', 'message':'user or key is null'})
|
||||
cur_user = G_usermgr.auth_token(token)
|
||||
if (cur_user == None):
|
||||
return json.dumps({'success':'false', 'message':'token failed or expired', 'Unauthorized': 'True'})
|
||||
return func(cur_user, cur_user.username, request.form, *args, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
|
||||
@app.route("/login/", methods=['POST'])
|
||||
def login():
|
||||
global G_usermgr
|
||||
logger.info("handle request : user login")
|
||||
user = request.form.get("user", None)
|
||||
key = request.form.get("key", None)
|
||||
if user == None or key == None:
|
||||
return json.dumps({'success': 'false', 'message':'user or key is null'})
|
||||
auth_result = G_usermgr.auth(user,key)
|
||||
if auth_result['success'] == 'false':
|
||||
logger.info("%s login failed" % user)
|
||||
return json.dumps({'success':'false', 'message':'auth failed'})
|
||||
logger.info("%s login success" % user)
|
||||
return json.dumps({'success':'true', 'action':'login', 'data': auth_result['data']})
|
||||
|
||||
@app.route("/register/", methods=['POST'])
|
||||
def register():
|
||||
global G_usermgr
|
||||
if request.form.get('activate', None) == None:
|
||||
logger.info ("handle request : user register")
|
||||
username = request.form.get('username', '')
|
||||
password = request.form.get('password', '')
|
||||
email = request.form.get('email', '')
|
||||
description = request.form.get('description','')
|
||||
if (username == '' or password == '' or email == ''):
|
||||
return json.dumps({'success':'false'})
|
||||
newuser = G_usermgr.newuser()
|
||||
newuser.username = request.form.get('username')
|
||||
newuser.password = request.form.get('password')
|
||||
newuser.e_mail = request.form.get('email')
|
||||
newuser.student_number = request.form.get('studentnumber')
|
||||
newuser.department = request.form.get('department')
|
||||
newuser.nickname = request.form.get('truename')
|
||||
newuser.truename = request.form.get('truename')
|
||||
newuser.description = request.form.get('description')
|
||||
newuser.status = "init"
|
||||
newuser.auth_method = "local"
|
||||
result = G_usermgr.register(user = newuser)
|
||||
return json.dumps(result)
|
||||
else:
|
||||
logger.info ("handle request, user activating")
|
||||
token = request.form.get("token", None)
|
||||
if (token == None):
|
||||
return json.dumps({'success':'false', 'message':'user or key is null'})
|
||||
cur_user = G_usermgr.auth_token(token)
|
||||
if (cur_user == None):
|
||||
return json.dumps({'success':'false', 'message':'token failed or expired', 'Unauthorized': 'True'})
|
||||
newuser = G_usermgr.newuser()
|
||||
newuser.username = cur_user.username
|
||||
newuser.nickname = cur_user.truename
|
||||
newuser.status = 'applying'
|
||||
newuser.user_group = cur_user.user_group
|
||||
newuser.auth_method = cur_user.auth_method
|
||||
newuser.e_mail = request.form.get('email','')
|
||||
newuser.student_number = request.form.get('studentnumber', '')
|
||||
newuser.department = request.form.get('department', '')
|
||||
newuser.truename = request.form.get('truename', '')
|
||||
newuser.tel = request.form.get('tel', '')
|
||||
newuser.description = request.form.get('description', '')
|
||||
result = G_usermgr.register(user = newuser)
|
||||
userManager.send_remind_activating_email(newuser.username)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/authtoken/", methods=['POST'])
|
||||
@login_required
|
||||
def auth_token(cur_user, user, form):
|
||||
logger.info("authing")
|
||||
req = json.dumps({'success':'true','username':cur_user.username,'beans':cur_user.beans})
|
||||
logger.info("auth success")
|
||||
return req
|
||||
|
||||
@app.route("/user/modify/", methods=['POST'])
|
||||
@login_required
|
||||
def modify_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/modify/")
|
||||
result = G_usermgr.modify(newValue = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/groupModify/", methods=['POST'])
|
||||
@login_required
|
||||
def groupModify_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupModify/")
|
||||
result = G_usermgr.groupModify(newValue = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/query/", methods=['POST'])
|
||||
@login_required
|
||||
def query_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/query/")
|
||||
#result = G_usermgr.query(ID = form.get("ID"), cur_user = cur_user)
|
||||
result = G_usermgr.query(username = user, cur_user = cur_user)
|
||||
if (result.get('success', None) == None or result.get('success', None) == "false"):
|
||||
return json.dumps(result)
|
||||
else:
|
||||
result = G_usermgr.queryForDisplay(user = result['token'])
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/add/", methods=['POST'])
|
||||
@login_required
|
||||
def add_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/add/")
|
||||
user = G_usermgr.newuser(cur_user = cur_user)
|
||||
user.username = form.get('username', None)
|
||||
user.password = form.get('password', None)
|
||||
user.e_mail = form.get('e_mail', '')
|
||||
user.status = "normal"
|
||||
result = G_usermgr.register(user = user, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupadd/", methods=['POST'])
|
||||
@login_required
|
||||
def groupadd_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupadd/")
|
||||
result = G_usermgr.groupadd(form = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/chdefault/", methods=['POST'])
|
||||
@login_required
|
||||
def chdefault(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/chdefault/")
|
||||
result = G_usermgr.change_default_group(form = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/quotaadd/", methods=['POST'])
|
||||
@login_required
|
||||
def quotaadd_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/quotaadd/")
|
||||
result = G_usermgr.quotaadd(form = form, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupdel/", methods=['POST'])
|
||||
@login_required
|
||||
def groupdel_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupdel/")
|
||||
result = G_usermgr.groupdel(name = form.get('name', None), cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/data/", methods=['POST'])
|
||||
@login_required
|
||||
def data_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/data/")
|
||||
result = G_usermgr.userList(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupNameList/", methods=['POST'])
|
||||
@login_required
|
||||
def groupNameList_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupNameList/")
|
||||
result = G_usermgr.groupListName(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupList/", methods=['POST'])
|
||||
@login_required
|
||||
def groupList_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupList/")
|
||||
result = G_usermgr.groupList(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/groupQuery/", methods=['POST'])
|
||||
@login_required
|
||||
def groupQuery_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/groupQuery/")
|
||||
result = G_usermgr.groupQuery(name = form.get("name"), cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/selfQuery/", methods=['POST'])
|
||||
@login_required
|
||||
def selfQuery_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/selfQuery/")
|
||||
result = G_usermgr.selfQuery(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/user/selfModify/", methods=['POST'])
|
||||
@login_required
|
||||
def selfModify_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/selfModify/")
|
||||
result = G_usermgr.selfModify(cur_user = cur_user, newValue = form)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/usageQuery/" , methods=['POST'])
|
||||
@login_required
|
||||
def usageQuery_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/usageQuery/")
|
||||
result = G_usermgr.usageQuery(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/usageInc/", methods=['POST'])
|
||||
@login_required
|
||||
def usageInc_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/usageInc/")
|
||||
setting = form.get('setting')
|
||||
result = G_usermgr.usageInc(cur_user = cur_user, modification = json.loads(setting))
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/usageRelease/", methods=['POST'])
|
||||
@login_required
|
||||
def usageRelease_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/usageInc/")
|
||||
result = G_usermgr.usageRelease(cur_user = cur_user, clustername = form.get('clustername'), containername = form.get('containername'), allcontainer = form.get('allcontainer'))
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/usageRecover/", methods=['POST'])
|
||||
@login_required
|
||||
def usageRecover_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/usageInc/")
|
||||
result = G_usermgr.usageRecover(cur_user = cur_user, modification = json.loads(form.get('setting')))
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/lxcsettingList/", methods=['POST'])
|
||||
@login_required
|
||||
def lxcsettingList_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/lxcsettingList/")
|
||||
result = G_usermgr.lxcsettingList(cur_user = cur_user, form = form)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/user/chlxcsetting/", methods=['POST'])
|
||||
@login_required
|
||||
def chlxcsetting_user(cur_user, user, form):
|
||||
global G_usermgr
|
||||
logger.info("handle request: user/chlxcsetting/")
|
||||
result = G_usermgr.chlxcsetting(cur_user = cur_user, form = form)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/notification/list/", methods=['POST'])
|
||||
@login_required
|
||||
def list_notifications(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/list/")
|
||||
result = G_notificationmgr.list_notifications(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/create/", methods=['POST'])
|
||||
@login_required
|
||||
def create_notification(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/create/")
|
||||
result = G_notificationmgr.create_notification(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/modify/", methods=['POST'])
|
||||
@login_required
|
||||
def modify_notification(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/modify/")
|
||||
result = G_notificationmgr.modify_notification(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/delete/", methods=['POST'])
|
||||
@login_required
|
||||
def delete_notification(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/delete/")
|
||||
result = G_notificationmgr.delete_notification(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/query_self/", methods=['POST'])
|
||||
@login_required
|
||||
def query_self_notification_simple_infos(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/query_self/")
|
||||
result = G_notificationmgr.query_self_notification_simple_infos(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/query/", methods=['POST'])
|
||||
@login_required
|
||||
def query_notification(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/query/")
|
||||
result = G_notificationmgr.query_notification(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
|
||||
@app.route("/notification/query/all/", methods=['POST'])
|
||||
@login_required
|
||||
def query_self_notifications_infos(cur_user, user, form):
|
||||
global G_notificationmgr
|
||||
logger.info("handle request: notification/query/all/")
|
||||
result = G_notificationmgr.query_self_notifications_infos(cur_user=cur_user, form=form)
|
||||
return json.dumps(result)
|
||||
|
||||
@app.route("/beans/<issue>/", methods=['POST'])
|
||||
@login_required
|
||||
def beans_apply(cur_user,user,form,issue):
|
||||
global G_applicationmgr
|
||||
if issue == 'apply':
|
||||
number = form.get("number",None)
|
||||
reason = form.get("reason",None)
|
||||
if number is None or reason is None:
|
||||
return json.dumps({'success':'false', 'message':'Number and reason can\'t be null.'})
|
||||
[success,message] = G_applicationmgr.apply(user,number,reason)
|
||||
if not success:
|
||||
return json.dumps({'success':'false', 'message':message})
|
||||
else:
|
||||
return json.dumps({'success':'true'})
|
||||
elif issue == 'applymsgs':
|
||||
applymsgs = G_applicationmgr.query(user)
|
||||
return json.dumps({'success':'true','applymsgs':applymsgs})
|
||||
else:
|
||||
return json.dumps({'success':'false','message':'Unsupported URL!'})
|
||||
|
||||
@app.route("/beans/admin/<issue>/", methods=['POST'])
|
||||
@login_required
|
||||
def beans_admin(cur_user,user,form,issue):
|
||||
global G_applicationmgr
|
||||
if issue == 'applymsgs':
|
||||
result = G_applicationmgr.queryUnRead(cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
elif issue == 'agree':
|
||||
msgid = form.get("msgid",None)
|
||||
if msgid is None:
|
||||
return json.dumps({'success':'false', 'message':'msgid can\'t be null.'})
|
||||
result = G_applicationmgr.agree(msgid, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
elif issue == 'reject':
|
||||
msgid = form.get("msgid",None)
|
||||
if msgid is None:
|
||||
return json.dumps({'success':'false', 'message':'msgid can\'t be null.'})
|
||||
result = G_applicationmgr.reject(msgid, cur_user = cur_user)
|
||||
return json.dumps(result)
|
||||
else:
|
||||
return json.dumps({'success':'false', 'message':'Unsupported URL!'})
|
||||
|
||||
if __name__ == '__main__':
|
||||
logger.info('Start Flask...:')
|
||||
try:
|
||||
secret_key_file = open(env.getenv('FS_PREFIX') + '/local/user_secret_key.txt')
|
||||
app.secret_key = secret_key_file.read()
|
||||
secret_key_file.close()
|
||||
except:
|
||||
from base64 import b64encode
|
||||
from os import urandom
|
||||
secret_key = urandom(24)
|
||||
secret_key = b64encode(secret_key).decode('utf-8')
|
||||
app.secret_key = secret_key
|
||||
secret_key_file = open(env.getenv('FS_PREFIX') + '/local/user_secret_key.txt', 'w')
|
||||
secret_key_file.write(secret_key)
|
||||
secret_key_file.close()
|
||||
|
||||
os.environ['APP_KEY'] = app.secret_key
|
||||
runcmd = sys.argv[0]
|
||||
app.runpath = runcmd.rsplit('/', 1)[0]
|
||||
|
||||
global G_usermgr
|
||||
global G_notificationmgr
|
||||
global G_sysmgr
|
||||
global G_historymgr
|
||||
global G_applicationmgr
|
||||
|
||||
fs_path = env.getenv("FS_PREFIX")
|
||||
logger.info("using FS_PREFIX %s" % fs_path)
|
||||
|
||||
mode = 'recovery'
|
||||
if len(sys.argv) > 1 and sys.argv[1] == "new":
|
||||
mode = 'new'
|
||||
|
||||
|
||||
G_usermgr = userManager.userManager('root',"unias")
|
||||
#if mode == "new":
|
||||
# G_usermgr.initUsage()
|
||||
G_notificationmgr = notificationmgr.NotificationMgr()
|
||||
|
||||
#userip = env.getenv('USER_IP')
|
||||
userip = "0.0.0.0"
|
||||
logger.info("using USER_IP %s", userip)
|
||||
|
||||
#userport = env.getenv('USER_PORT')
|
||||
userport = 9100
|
||||
logger.info("using USER_PORT %d", int(userport))
|
||||
|
||||
G_applicationmgr = beansapplicationmgr.ApplicationMgr()
|
||||
|
||||
# server = http.server.HTTPServer((masterip, masterport), DockletHttpHandler)
|
||||
logger.info("starting user server")
|
||||
|
||||
app.run(host = userip, port = userport, threaded=True,)
|
|
@ -4,6 +4,7 @@ from webViews.log import logger
|
|||
|
||||
|
||||
endpoint = "http://0.0.0.0:9000"
|
||||
user_endpoint = "http://0.0.0.0:9100"
|
||||
|
||||
class dockletRequest():
|
||||
|
||||
|
@ -13,8 +14,18 @@ class dockletRequest():
|
|||
data = dict(data)
|
||||
data['token'] = session['token']
|
||||
logger.info ("Docklet Request: user = %s data = %s, url = %s"%(session['username'], data, url))
|
||||
|
||||
result = requests.post(endpoint + url, data=data).json()
|
||||
reqtype = url.split("/")[1]
|
||||
userreq = {
|
||||
'login',
|
||||
'register',
|
||||
'user',
|
||||
'beans',
|
||||
'notification'
|
||||
}
|
||||
if reqtype in userreq:
|
||||
result = requests.post(user_endpoint + url, data=data).json()
|
||||
else:
|
||||
result = requests.post(endpoint + url, data=data).json()
|
||||
# logger.info('response content: %s'%response.content)
|
||||
# result = response.json()
|
||||
if (result.get('success', None) == "false" and result.get('reason', None) == "Unauthorized Action"):
|
||||
|
@ -32,6 +43,6 @@ class dockletRequest():
|
|||
data = dict(data)
|
||||
data_log = {'user': data.get('user', 'external')}
|
||||
logger.info("Docklet Unauthorized Request: data = %s, url = %s" % (data_log, url))
|
||||
result = requests.post(endpoint + url, data = data).json()
|
||||
result = requests.post(user_endpoint + url, data = data).json()
|
||||
logger.info("Docklet Unauthorized Response: result = %s, url = %s"%(result, url))
|
||||
return result
|
||||
|
|
Loading…
Reference in New Issue