improve project and run it successfully
Showing
11 changed files
with
110 additions
and
47 deletions
| ... | @@ -5,8 +5,8 @@ from flask import request | ... | @@ -5,8 +5,8 @@ from flask import request |
| 5 | 5 | ||
| 6 | from server.database import db_adapter | 6 | from server.database import db_adapter |
| 7 | from server.database.models import User, UserToken | 7 | from server.database.models import User, UserToken |
| 8 | from server.utils import get_now | 8 | from server.utils import get_now, get_config |
| 9 | from server.utils.api_response import unauthorized, forbidden | 9 | from server.utils.api_response import unauthorized, forbidden, insecurity_request |
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | def token_required(func): | 12 | def token_required(func): |
| ... | @@ -53,13 +53,29 @@ def admin_privilege_required(func): | ... | @@ -53,13 +53,29 @@ def admin_privilege_required(func): |
| 53 | return authenticate_and_call | 53 | return authenticate_and_call |
| 54 | 54 | ||
| 55 | 55 | ||
| 56 | def white_list_check(func): | ||
| 57 | """ | ||
| 58 | check request's ip whether in config's white_list | ||
| 59 | """ | ||
| 60 | def authenticate_and_call(*args, **kwargs): | ||
| 61 | if request.ipaddress not in get_config('white_list'): | ||
| 62 | return insecurity_request(message='%s' % request.ipaddress) | ||
| 63 | return func(*args, **kwargs) | ||
| 64 | |||
| 65 | authenticate_and_call.original = func.__name__ | ||
| 66 | if hasattr(func, "original"): | ||
| 67 | authenticate_and_call.original = func.original | ||
| 68 | return authenticate_and_call | ||
| 69 | |||
| 70 | |||
| 56 | def __validate_token(): | 71 | def __validate_token(): |
| 57 | if 'token' not in request.headers: | 72 | if 'token' not in request.headers: |
| 58 | return False | 73 | return False |
| 59 | 74 | ||
| 60 | t = db_adapter.find_first_object_by(UserToken, | 75 | t = db_adapter.find_first_object(UserToken, |
| 61 | token=request.headers['token']) | 76 | UserToken.token==request.headers['token'], |
| 62 | if not t or t.expire_date <= get_now(): | 77 | UserToken.expire_date<=get_now()) |
| 78 | if not t: | ||
| 63 | return False | 79 | return False |
| 64 | 80 | ||
| 65 | return t.user | 81 | return t.user | ... | ... |
| ... | @@ -3,7 +3,6 @@ | ... | @@ -3,7 +3,6 @@ |
| 3 | 3 | ||
| 4 | from server.app import web_api | 4 | from server.app import web_api |
| 5 | from server.database import db_adapter | 5 | from server.database import db_adapter |
| 6 | from server.database.models import Host | ||
| 7 | from flask_restful import Resource | 6 | from flask_restful import Resource |
| 8 | 7 | ||
| 9 | 8 | ||
| ... | @@ -14,9 +13,9 @@ class TestResource(Resource): | ... | @@ -14,9 +13,9 @@ class TestResource(Resource): |
| 14 | 13 | ||
| 15 | class HostResource(Resource): | 14 | class HostResource(Resource): |
| 16 | def get(self): | 15 | def get(self): |
| 17 | return db_adapter.find_first_object_by(Host, id=1).dic() | 16 | return "passed" |
| 18 | 17 | ||
| 19 | 18 | ||
| 20 | def init_routes(): | 19 | def init_routes(): |
| 21 | web_api.add_resource(TestResource, "/api/test") | 20 | web_api.add_resource(TestResource, "/api/test") |
| 22 | web_api.add_resource(HostResource, "/api/host") | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 21 | web_api.add_resource(HostResource, "/api/users") | ... | ... |
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | 2 | ||
| 3 | from server.log import log | ||
| 4 | |||
| 3 | 5 | ||
| 4 | class SQLAlchemyAdapterMetaClass(type): | 6 | class SQLAlchemyAdapterMetaClass(type): |
| 5 | @staticmethod | 7 | @staticmethod |
| ... | @@ -67,30 +69,30 @@ class SQLAlchemyAdapter(DBAdapter): | ... | @@ -67,30 +69,30 @@ class SQLAlchemyAdapter(DBAdapter): |
| 67 | """ Retrieve one object specified by the primary key 'pk' """ | 69 | """ Retrieve one object specified by the primary key 'pk' """ |
| 68 | return ObjectClass.query.get(id) | 70 | return ObjectClass.query.get(id) |
| 69 | 71 | ||
| 70 | def find_all_objects(self, ObjectClass, *criterion): | 72 | def get_all_objects(self, ObjectClass, *criterion): |
| 71 | return ObjectClass.query.filter(*criterion).all() | 73 | return ObjectClass.query.filter(*criterion).all() |
| 72 | 74 | ||
| 73 | def find_all_objects_by(self, ObjectClass, **kwargs): | 75 | def get_all_objects_by(self, ObjectClass, **kwargs): |
| 74 | return ObjectClass.query.filter_by(**kwargs).all() | 76 | return ObjectClass.query.filter_by(**kwargs).all() |
| 75 | 77 | ||
| 76 | def find_all_objects_order_by(self, ObjectClass, limit=None, *order_by, **kwargs): | 78 | def get_all_objects_order_by(self, ObjectClass, limit=None, *order_by, **kwargs): |
| 77 | if limit is not None: | 79 | if limit is not None: |
| 78 | return ObjectClass.query.filter_by(**kwargs).order_by(*order_by).limit(limit) | 80 | return ObjectClass.query.filter_by(**kwargs).order_by(*order_by).limit(limit) |
| 79 | else: | 81 | else: |
| 80 | return ObjectClass.query.filter_by(**kwargs).order_by(*order_by).all() | 82 | return ObjectClass.query.filter_by(**kwargs).order_by(*order_by).all() |
| 81 | 83 | ||
| 84 | def get_first_object_by(self, ObjectClass, **kwargs): | ||
| 85 | return ObjectClass.query.filter_by(**kwargs).first() | ||
| 86 | |||
| 82 | def count(self, ObjectClass, *criterion): | 87 | def count(self, ObjectClass, *criterion): |
| 83 | return ObjectClass.query.filter(*criterion).count() | 88 | return ObjectClass.query.filter(*criterion).count() |
| 84 | 89 | ||
| 85 | def count_by(self, ObjectClass, **kwargs): | 90 | def count_by(self, ObjectClass, **kwargs): |
| 86 | return ObjectClass.query.filter_by(**kwargs).count() | 91 | return ObjectClass.query.filter_by(**kwargs).count() |
| 87 | 92 | ||
| 88 | def find_first_object(self, ObjectClass, *criterion): | 93 | def get_first_object(self, ObjectClass, *criterion): |
| 89 | return ObjectClass.query.filter(*criterion).first() | 94 | return ObjectClass.query.filter(*criterion).first() |
| 90 | 95 | ||
| 91 | def find_first_object_by(self, ObjectClass, **kwargs): | ||
| 92 | return ObjectClass.query.filter_by(**kwargs).first() | ||
| 93 | |||
| 94 | def add_object(self, inst): | 96 | def add_object(self, inst): |
| 95 | self.db_session.add(inst) | 97 | self.db_session.add(inst) |
| 96 | 98 | ||
| ... | @@ -125,3 +127,10 @@ class SQLAlchemyAdapter(DBAdapter): | ... | @@ -125,3 +127,10 @@ class SQLAlchemyAdapter(DBAdapter): |
| 125 | return query.delete(synchronize_session=False) | 127 | return query.delete(synchronize_session=False) |
| 126 | 128 | ||
| 127 | # ------------------------------ auto wrapped 'public' methods --- end ------------------------------ | 129 | # ------------------------------ auto wrapped 'public' methods --- end ------------------------------ |
| 130 | |||
| 131 | def exec_sql(self, sql_str): | ||
| 132 | try: | ||
| 133 | self.session().execte(sql_str) | ||
| 134 | except Exception as ex: | ||
| 135 | log.error(ex) | ||
| 136 | return None | ... | ... |
| ... | @@ -46,14 +46,14 @@ args=(sys.stdout,) | ... | @@ -46,14 +46,14 @@ args=(sys.stdout,) |
| 46 | class=logging.handlers.TimedRotatingFileHandler | 46 | class=logging.handlers.TimedRotatingFileHandler |
| 47 | level=DEBUG | 47 | level=DEBUG |
| 48 | formatter=myFormatter | 48 | formatter=myFormatter |
| 49 | args=('/var/log/open-hackathon/sunnycloud.log','midnight',1,14) | 49 | args=('/var/log/isa.qa/isa.qa.log','midnight',1,14) |
| 50 | 50 | ||
| 51 | #define sqlLogHandler | 51 | #define sqlLogHandler |
| 52 | [handler_sqlLogHandler] | 52 | [handler_sqlLogHandler] |
| 53 | class=logging.handlers.TimedRotatingFileHandler | 53 | class=logging.handlers.TimedRotatingFileHandler |
| 54 | level=DEBUG | 54 | level=DEBUG |
| 55 | formatter=myFormatter | 55 | formatter=myFormatter |
| 56 | args=('/var/log/open-hackathon/sunnycloud.log','midnight',1,14) | 56 | args=('/var/log/isa.qa/isa.qa.log','midnight',1,14) |
| 57 | 57 | ||
| 58 | #define formatter | 58 | #define formatter |
| 59 | [formatter_myFormatter] | 59 | [formatter_myFormatter] | ... | ... |
server/others/__init__.py
0 → 100644
File mode changed
server/others/test_dg.py
0 → 100644
| 1 | # -*- coding: utf-8 -*- | ||
| 2 | |||
| 3 | # 测试递归方法函数的使用--跟平台功能无关,但也不要删掉,谢谢! | ||
| 4 | |||
| 5 | import json | ||
| 6 | |||
| 7 | |||
| 8 | def restorkey(key): | ||
| 9 | with open("F:\\result.txt", "a") as f: | ||
| 10 | f.write(key) | ||
| 11 | |||
| 12 | |||
| 13 | def print_keyvalue_all(input_json, previous_key_str): | ||
| 14 | |||
| 15 | if isinstance(input_json, dict): | ||
| 16 | |||
| 17 | for key in input_json.keys(): | ||
| 18 | key_str = previous_key_str + '/' + key | ||
| 19 | key_value = input_json.get(key) | ||
| 20 | |||
| 21 | if isinstance(key_value, dict): | ||
| 22 | print_keyvalue_all(key_value, key_str) | ||
| 23 | |||
| 24 | elif isinstance(key_value, list): | ||
| 25 | for json_array in key_value: | ||
| 26 | print_keyvalue_all(json_array, key_str) | ||
| 27 | else: | ||
| 28 | result = str(key_str) + " == " + str(key_value) | ||
| 29 | print result | ||
| 30 | restorkey("%s\n" % result) | ||
| 31 | |||
| 32 | elif isinstance(input_json, list): | ||
| 33 | for input_json_array in input_json: | ||
| 34 | print_keyvalue_all(input_json_array, previous_key_str) | ||
| 35 | |||
| 36 | |||
| 37 | if __name__ == '__main__': | ||
| 38 | with open('F:\\new.json') as json_file: | ||
| 39 | data = json.load(json_file) | ||
| 40 | print_keyvalue_all(data, '/') |
| ... | @@ -7,7 +7,7 @@ from datetime import timedelta | ... | @@ -7,7 +7,7 @@ from datetime import timedelta |
| 7 | from flask import request, g | 7 | from flask import request, g |
| 8 | 8 | ||
| 9 | from server.database import db_adapter | 9 | from server.database import db_adapter |
| 10 | from server.database import models | 10 | from server.database.models import User |
| 11 | from server.log import log | 11 | from server.log import log |
| 12 | from server.utils import get_now | 12 | from server.utils import get_now |
| 13 | from server.utils.api_response import ok, bad_request, internal_server_error | 13 | from server.utils.api_response import ok, bad_request, internal_server_error |
| ... | @@ -31,6 +31,20 @@ class UserService(object): | ... | @@ -31,6 +31,20 @@ class UserService(object): |
| 31 | "token": user_token.token() | 31 | "token": user_token.token() |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | def get_user_info(self, id): | ||
| 35 | return db_adapter.get_first_object_by(User, d=id) | ||
| 36 | |||
| 37 | def get_user_list(self, filter_json): | ||
| 38 | sql_condition = 1 == 1 | ||
| 39 | for condition in filter_json: | ||
| 40 | if condition == 'begin_time': | ||
| 41 | sql_condition = sql_condition, User.condition > filter_json['begin_time'] | ||
| 42 | elif condition == 'end_time': | ||
| 43 | sql_condition = sql_condition, User.condition < filter_json['end_time'] | ||
| 44 | else: | ||
| 45 | sql_condition = sql_condition, User.condition == filter_json['condition'] | ||
| 46 | return db_adapter.get_all_objects(User, sql_condition) | ||
| 47 | |||
| 34 | # --------------- helper private functions ---------------------# | 48 | # --------------- helper private functions ---------------------# |
| 35 | 49 | ||
| 36 | def __generate_api_token(self, user): | 50 | def __generate_api_token(self, user): | ... | ... |
| ... | @@ -3,14 +3,16 @@ | ... | @@ -3,14 +3,16 @@ |
| 3 | 3 | ||
| 4 | from datetime import datetime | 4 | from datetime import datetime |
| 5 | 5 | ||
| 6 | from server.config import config | ||
| 7 | |||
| 6 | 8 | ||
| 7 | def get_now(): | 9 | def get_now(): |
| 8 | return datetime.now() | 10 | return datetime.now() |
| 9 | 11 | ||
| 10 | 12 | ||
| 11 | def get_config(): | 13 | def get_config(key): |
| 12 | return None | 14 | return config[key] |
| 13 | 15 | ||
| 14 | 16 | ||
| 15 | def get_safe_config(): | 17 | def get_safe_config(key, default=None): |
| 16 | return None | 18 | return default if not config[key] else config[key] | ... | ... |
| ... | @@ -62,4 +62,11 @@ def internal_server_error(message="", | ... | @@ -62,4 +62,11 @@ def internal_server_error(message="", |
| 62 | return __response_with_code(500, message, friendly_message) | 62 | return __response_with_code(500, message, friendly_message) |
| 63 | 63 | ||
| 64 | 64 | ||
| 65 | def insecurity_request(message="", | ||
| 66 | friendly_message=( | ||
| 67 | 'Invalid request ipaddress which not in' | ||
| 68 | 'platform\'s white list.' | ||
| 69 | )): | ||
| 70 | return __response_with_code(412, message, friendly_message) | ||
| 71 | |||
| 65 | 72 | ... | ... |
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | |||
| 3 | |||
| 4 | class VM(object): | ||
| 5 | OS_TYPE_LINUX = 0 | ||
| 6 | OS_TYPE_WINDOWS = 1 | ||
| 7 | |||
| 8 | |||
| 9 | class NETWORK(object): | ||
| 10 | IP_TYPE_PUBLIC = 0 | ||
| 11 | IP_TYPE_PRIVATE = 1 | ||
| 12 | |||
| 13 | |||
| 14 | class DISK(object): | ||
| 15 | TYPE_SYSTEM = 0 | ||
| 16 | TYPE_MOUNTED = 1 | ||
| 17 | |||
| 18 | FORMAT_NTFS = 0 | ||
| 19 | FORMAT_EXT4 = 1 | ||
| 20 | |||
| 21 | |||
| 22 | class IMAGE(object): | ||
| 23 | TYPE_DEFAULT = 0 # Router or Monitor | ||
| 24 | TYPE_PROVIDER = 1 # vm images type | ||
| 25 | TYPE_CUSTOMIZE = 2 # created by users | ... | ... |
-
Please register or sign in to post a comment