Пример #1
0
    def getOne(self, name):
        """ 查询某name的swarm集群信息 """

        if self.isMember(name):
            return (_ for _ in self._swarms if _.get("name") == name).next()
        else:
            logger.warn("get one swarm named %s, but no data" % name)
Пример #2
0
def before_request():
    g.startTime = time.time()
    g.redis = create_redis_engine()
    g.mysql = create_mysql_engine()
    g.signin = verify_sessionId(request.cookies.get("sessionId"))
    g.sid, g.uid = analysis_sessionId(request.cookies.get("sessionId"),
                                      "tuple") if g.signin else (None, None)
    app.logger.debug("uid: {}, sid: {}".format(g.uid, g.sid))
    g.api = api
    g.ip = request.headers.get('X-Real-Ip', request.remote_addr)
    g.agent = request.headers.get("User-Agent")
    # 仅是重定向页面快捷定义
    g.redirect_uri = get_redirect_url()
    # 上下文扩展点之请求后(返回前)
    before_request_hook = plugin.get_all_cep.get("before_request_hook")
    for cep_func in before_request_hook():
        cep_func(request=request, g=g)
    before_request_return = plugin.get_all_cep.get("before_request_return")
    for cep_func in before_request_return():
        resp = cep_func(request=request, g=g)
        try:
            success = resp.is_before_request_return
        except:
            logger.warn(
                "Plugin returns abnormalities when before_request_return")
        else:
            if success is True:
                return resp
Пример #3
0
    def RollingUpgrade(self, serviceFlag, tag):
        """ 服务滚动升级 """

        res = {"msg": None, "code": 0}
        logger.info("Update service flag(id/name) is %s, tag is %s" %
                    (serviceFlag, tag))

        #check params
        if not serviceFlag:
            logger.warn("service id/name is empty")
            res.update(msg="service id/name is empty", code=60000)
            logger.info(res)
            return res

        if not tag:
            res.update(msg="tag error", code=60001)
            logger.info(res)
            return res

        #check leader
        if not self.leader:
            res.update(msg="No active swarm", code=-1000)
            logger.info(res)
            return res

        data = self.GET(service=serviceFlag, core=True,
                        core_convert=False).get("data")[0]
        Image = "{}:{}".format(data.get("Image").split(":")[0], tag)
        res.update(self.PUT(serviceFlag, image=Image))
        logger.info(res)
        return res
Пример #4
0
    def _checkSwarmToken(self, leader):
        """ 根据Leader查询集群令牌 """

        try:
            swarm = requests.get(Splice(netloc=leader, port=self.port, path='/swarm').geturl, timeout=self.timeout, verify=self.verify).json()
            token = swarm.get('JoinTokens')
        except Exception,e:
            logger.warn(e, exc_info=True)
Пример #5
0
 def __check_modifyPass(self, uid):
     """检查是否可以修改密码,即是否存在邮箱或手机号"""
     if uid:
         sql = "SELECT count(uid) FROM user_auth WHERE identity_type IN (1,2) AND uid=%s"
         try:
             data = self.mysql.get(sql, uid)
         except Exception, e:
             logger.warn(e, exc_info=True)
         else:
             if data and isinstance(data, dict):
                 return int(data.get("count(uid)") or 0) > 0
Пример #6
0
    def _unpickle(self):
        """ 反序列化信息取出所有数据 """

        if self._ssm == "local":
            try:
                with open(self._ssSwarms, "r") as f:
                    data = json.load(f)
            except Exception, e:
                logger.warn(e, exc_info=True)
                res = []
            else:
                res = data or []
Пример #7
0
 def __check_hasUser(self, uid):
     """检查是否存在账号"""
     if uid and len(uid) == 22:
         sql = "SELECT count(uid) FROM user_auth WHERE uid=%s"
         try:
             data = self.db.get(sql, uid)
         except Exception, e:
             logger.warn(e, exc_info=True)
         else:
             logger.debug(data)
             if data and isinstance(data, dict):
                 return True if data.get('count(uid)', 0) > 0 else False
Пример #8
0
 def __check_hasEmail(self, email):
     """检查是否存在邮箱账号"""
     if email_check(email):
         sql = "SELECT uid FROM user_auth WHERE identity_type=%s AND identifier=%s"
         try:
             data = self.db.get(sql, 2, email)
         except Exception, e:
             logger.warn(e, exc_info=True)
         else:
             logger.debug(data)
             if data and isinstance(data, dict):
                 return "uid" in data
Пример #9
0
    def _unpickleActive(self):
        """ 反序列化信息取出活跃集群 """

        if self._ssm == "local":
            try:
                with open(self._ssActive, "r") as f:
                    data = json.load(f)
            except Exception, e:
                logger.warn(e, exc_info=True)
                res = {}
            else:
                res = data or {}
Пример #10
0
def SignUp():
    if request.method == "POST":
        res = UserAuth_Registry(request.form)
        if res:
            logger.info("SignUp Successfully")
            return redirect(url_for("login"))
        else:
            logger.warn("SignUp Failed")
            return redirect(url_for("SignUp", errmsg="SignUp Fail"))
    elif g.signin:
        return redirect(url_for("uc"))
    else:
        return render_template("signup.html")
Пример #11
0
 def __check_hasEmail(self, email, getUid=False):
     """检查是否存在邮箱账号,不检测账号状态"""
     if email_check(email):
         sql = "SELECT uid FROM user_auth WHERE identity_type=2 AND identifier=%s"
         try:
             data = self.db.get(sql, email)
         except Exception, e:
             logger.warn(e, exc_info=True)
         else:
             logger.debug(data)
             if data and isinstance(data, dict):
                 success = "uid" in data
                 return data["uid"] if success and getUid else success
Пример #12
0
 def oauth2_signUp(self, openid, register_ip):
     """OAuth直接登录时注册入系统
     @param openid str: 加密的openid,用以获取缓存中数据userinfo,格式是:
         userinfo dict: 用户信息,必须包含`openid`,`identity_type`,`avatar`,`nick_name`
     @param register_ip str: 注册IP地址
     """
     res = dict(msg=None, success=False)
     userinfo = self.__oauth2_getUserinfo(openid)
     logger.debug(userinfo)
     logger.debug(type(userinfo))
     if userinfo and isinstance(
             userinfo, dict
     ) and "avatar" in userinfo and "nick_name" in userinfo and "openid" in userinfo and "access_token" in userinfo and "identity_type" in userinfo:
         openid = userinfo["openid"]
         access_token = userinfo["access_token"]
         identity_type = int(userinfo["identity_type"])
         avatar = userinfo["avatar"]
         nick_name = userinfo["nick_name"]
         gender = userinfo.get("gender") or 2
         domain_name = userinfo.get("domain_name") or ""
         signature = userinfo.get("signature") or ""
         location = userinfo.get("location") or ""
         expire_time = userinfo.get("expire_time") or 0
         guid = gen_uniqueId()
         logger.debug(
             "check test: guid length: {}, identifier: {}, identity_type:{}, identity_type: {}, certificate: {}"
             .format(len(guid), openid, identity_type, type(identity_type),
                     access_token))
         define_profile_sql = "INSERT INTO user_profile (uid, register_source, register_ip, nick_name, domain_name, gender, signature, avatar, location, create_time, is_realname, is_admin) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % (
             guid, identity_type, register_ip, nick_name,
             domain_name, gender, signature, avatar, location,
             get_current_timestamp(), 0, 0)
         upts = self.__signUp_transacion(
             guid=guid,
             identifier=openid,
             identity_type=identity_type,
             certificate=access_token,
             verified=1,
             register_ip=register_ip,
             expire_time=expire_time,
             define_profile_sql=define_profile_sql)
         logger.warn(upts)
         res.update(upts)
         if res["success"]:
             self.__oauth2_delUserinfo(openid)
             res.update(identity_type=identity_type, uid=guid)
     else:
         res.update(msg="Check failed")
     logger.info(res)
     return res
Пример #13
0
    def _checkSwarmHealth(self, leader):
        """ 根据Leader查询某swarm集群是否健康 """

        state = []
        mnum  = 0
        logger.info("To determine whether the cluster is healthy, starting, swarm leader is %s" %leader)
        try:
            nodes = requests.get(Splice(netloc=leader, port=self.port, path='/nodes').geturl, timeout=self.timeout, verify=self.verify).json()
            logger.debug("check swarm health, swarm nodes length is %d" % len(nodes))
            for node in nodes:
                if node['Spec'].get('Role') == 'manager':
                    mnum += 1
                    isHealth = True if node['Status']['State'] == 'ready' and node['Spec'].get('Availability') == 'active' and node.get('ManagerStatus', {}).get('Reachability') == 'reachable' else False
                    if isHealth:
                        state.append(isHealth)
        except Exception,e:
            logger.warn(e, exc_info=True)
            return "ERROR"
Пример #14
0
    def _checkSwarmLeader(self, swarm):
        """ 查询swarm集群Leader """

        logger.info("check swarm %s leader, the request swarm manager is %s" %(swarm.get("name"), swarm.get("manager")))
        if swarm:
            try:
                url  = Splice(netloc=swarm.get("manager")[0], port=self.port, path='/nodes').geturl
                data = requests.get(url, timeout=self.timeout, verify=self.verify).json()
                if "message" in data:
                    raise TypeError("The response that first get leader is error, data is {}".format(data))
            except Exception, e:
                logger.warn(e, exc_info=True)
                try:
                    url  = Splice(netloc=swarm.get("manager")[-1], port=self.port, path='/nodes').geturl
                    data = requests.get(url, timeout=self.timeout, verify=self.verify).json()
                except Exception,e:
                    logger.error(e, exc_info=True)
                    data = None
Пример #15
0
    def POST(self, image, **params):
        """
        Create a service in docker swarm mode cluster with api.
        1. get, convert, check params,
        2. post data to swarm api.
        """
        res = {"msg": None, "code": 0}
        logger.info("Create service, the required image is %s" % image)

        #check leader
        if not self.leader:
            res.update(msg="No active swarm", code=-1000)
            logger.info(res)
            return res

        ###get params, in version 0.1.10, optional only is "name, env, mount, publish, replicas", required "image".
        logger.debug(params)
        try:
            name = params.get("name")
            #str, needn't convert
            env = self.commaConvert(
                params.get("env")) if params.get("env") else []
            #source data likes "key=value, key2=value2", convert to list or tuple, \n,
            #`env`'ask likes this, [key=value, key2=value2] or (key3=value3, key4=value4).
            mount = self.commaConvert(
                params.get("mount")) if params.get("mount") else []
            #source data likes "src:dst:true:mode, src:dst:true|false:mode", example "/data/swarmopsapi-logs:/SwarmOpsApi/logs:true:bind, /data/cmlogs:/data/cmdata/logs:false:bind", convert it, \n,
            #`mount`'ask likes this, [src:dst:true|false(default false, rw):mode, ].
            publish = self.commaConvert(
                params.get("publish")) if params.get("publish") else []
            #source data likes "src:desc:protocol, src2:desc2", such as `env`, convert it, \n
            #list or tuple, `publish`'ask likes this, [src:desc, src2:desc2] or ().
        except Exception, e:
            logger.warn(e, exc_info=True)
            res.update(msg="parameters error", code=40000)
            logger.info(res)
            return res
Пример #16
0
#product environment start application with `tornado IOLoop` and `gevent server`

from main import app
from utils.tool import logger
from config import GLOBAL, PRODUCT

Host = GLOBAL.get('Host')
Port = GLOBAL.get('Port')
Environment = GLOBAL.get('Environment')
ProcessName = PRODUCT.get('ProcessName')
ProductType = PRODUCT.get('ProductType')

try:
    import setproctitle
except ImportError, e:
    logger.warn("%s, try to pip install setproctitle, otherwise, you can't use the process to customize the function" %e)
else:
    setproctitle.setproctitle(ProcessName)
    logger.info("The process is %s" % ProcessName)

try:
    msg = '%s has been launched, %s:%s' %(ProcessName, Host, Port)
    print(msg)
    logger.info(msg)
    if ProductType == 'gevent':
        from gevent.wsgi import WSGIServer
        http_server = WSGIServer((Host, Port), app)
        http_server.serve_forever()

    elif ProductType == 'tornado':
        from tornado.wsgi import WSGIContainer
Пример #17
0
 def updateUserProfile(self, uid, **profiles):
     """更新用户基本资料
     @param uid str: 用户id
     @param profiles dict: 资料列表
     """
     #: TODO 决不能拼接SQL,先获取当前资料,用提交更新的部分资料覆盖
     res = dict(msg=None, code=1)
     logger.debug(profiles)
     nick_name = profiles.get("nick_name")
     domain_name = profiles.get("domain_name")
     birthday = profiles.get("birthday")
     location = profiles.get("location")
     gender = profiles.get("gender")
     signature = profiles.get("signature")
     # 定义
     checked = True
     invalid = []
     can_lock_nick_name = False
     can_lock_domain_name = False
     # 防止sql注入的安全检测
     for key, value in profiles.iteritems():
         checked = sql_safestring_check(value)
         logger.debug("check {}, value: {}, result: {}".format(
             key, value, checked))
         if checked is False:
             invalid.append(key)
             break
     # 至少有一项资料修改才通过检测
     if checked:
         if not nick_name and \
             not domain_name and \
             not birthday and \
             not location and \
             not gender and \
             not signature:
             checked = False
             invalid.append("all")
     if checked and uid and isinstance(uid, basestring) and len(uid) == 22:
         # 获取用户资料对比nick_name、domain_name是否修改过
         user_old_data = self.getUserProfile(uid)
         if user_old_data["code"] == 0:
             # 开始检测并组建sql
             sql = "UPDATE user_profile SET "
             # 用户旧数据
             user_old_data = user_old_data["data"]
             # 昵称
             if nick_name:
                 if len(nick_name) <= 49:
                     # nick_name可修改时拼接上sql
                     if user_old_data["lock"]["nick_name"] is False:
                         sql += "nick_name='%s'," % nick_name
                         if nick_name != user_old_data["nick_name"]:
                             # 判断昵称更改,加锁,设置其24小时后过期
                             can_lock_nick_name = True
                             sql += "lock_nick_name={},".format(
                                 timestamp_after_timestamp(hours=24))
                 else:
                     checked = False
                     invalid.append("nick_name")
             # 个性域名
             if domain_name:
                 if domain_name_pat.match(
                         domain_name) and not domain_name.endswith(
                             '_') and not domain_name in (
                                 "admin", "system", "root", "administrator",
                                 "null", "none", "true", "false", "user"):
                     # domain_name可修改时拼接上sql
                     if user_old_data["lock"]["domain_name"] is False:
                         sql += "domain_name='%s'," % domain_name
                         if domain_name != user_old_data["domain_name"]:
                             # 判断域名更改,加锁,设置其永久有效
                             can_lock_domain_name = True
                             sql += "lock_domain_name=0,"
                 else:
                     checked = False
                     invalid.append("domain_name")
             # 生日
             if birthday:
                 try:
                     birthday = timestring_to_timestamp(birthday,
                                                        format="%Y-%m-%d")
                 except:
                     checked = False
                     invalid.append("birthday")
                 else:
                     sql += "birthday=%d," % birthday
             # 性别
             if gender:
                 try:
                     gender = int(gender)
                 except:
                     checked = False
                     invalid.append("gender")
                 else:
                     if gender in (0, 1, 2):
                         sql += "gender=%d," % gender
                     else:
                         checked = False
                         invalid.append("gender")
             # 签名
             if signature:
                 sql += "signature='%s'," % signature
             # 城市
             if location:
                 sql += "location='%s'," % location
             # 更新sql
             if checked:
                 # 资料更新,设置mtime
                 sql += "mtime={}".format(get_current_timestamp())
                 sql += " WHERE uid='%s'" % uid
                 logger.debug("update profile for {}, sql is: {}".format(
                     uid, sql))
                 try:
                     self.mysql.update(sql)
                 except IntegrityError, e:
                     logger.warn(e, exc_info=True)
                     res.update(msg="Personal domain has been occupied",
                                code=2)
                 except Exception, e:
                     logger.error(e, exc_info=True)
                     res.update(msg="System is abnormal", code=3)
                 else:
                     res.update(code=0,
                                refreshCache=self.refreshUserProfile(uid))
                     # 更新成功后设置锁
                     res.update(lock=dict(nick_name=can_lock_nick_name,
                                          domain_name=can_lock_domain_name))
             else:
                 res.update(msg="There are invalid parameters", code=5)
Пример #18
0
    def PUT(self, serviceFlag, **params):
        """update a service in docker swarm mode cluster with api.
        1. get, convert, check params,
        2. post data to swarm api.
        """
        res = {"msg": None, "code": 0}
        logger.info("Update service flag(id/name) is %s, other params is %s" %
                    (serviceFlag, params))

        #check params
        if not serviceFlag:
            logger.warn("service id/name is empty")
            res.update(msg="service id/name is empty", code=50000)
            logger.info(res)
            return res

        #check leader
        if not self.leader:
            res.update(msg="No active swarm", code=-1000)
            logger.info(res)
            return res

        #check UpdateServiceType
        USType = params.get("UpdateServiceType", "api")
        if USType not in ("ui", "api"):
            res.update("UpdateServiceType error", code=50001)
            logger.info(res)
            return res

        serviceSourceData = self.GET(service=serviceFlag,
                                     core=True).get("data")
        logger.debug(serviceSourceData)
        if isinstance(serviceSourceData,
                      (list, tuple)) and len(serviceSourceData) > 0:
            serviceSourceData = serviceSourceData[0]
            serviceFlag2ID = serviceSourceData.get("ID")
            #default service data for api(UI filled).
            defaultName = serviceSourceData.get("Name")
            defaultEnv = serviceSourceData.get("Env")
            defaultMount = serviceSourceData.get("Mounts")
            defaultPublish = serviceSourceData.get("NetPorts")
            defaultImage = serviceSourceData.get("Image")
            defaultReplicas = serviceSourceData.get("Replicas")
            defaultVersion = serviceSourceData.get("Version")
            try:
                if USType == "ui":
                    image = params.get("image")
                    name = params.get("name")
                    env = self.commaConvert(
                        params.get("env")) if params.get("env") else None
                    mount = self.commaConvert(
                        params.get("mount")) if params.get("mount") else None
                    publish = self.commaConvert(params.get(
                        "publish")) if params.get("publish") else None
                    replicas = int(params.get("replicas"))
                    delay = int(params.get("delay", 10))
                    parallelism = int(params.get("parallelism", 1))
                else:
                    image = params.get("image") or defaultImage
                    name = params.get("name") or defaultName
                    env = self.commaConvert(
                        params.get("env")) if params.get("env") else defaultEnv
                    mount = self.commaConvert(params.get(
                        "mount")) if params.get("mount") else defaultMount
                    publish = self.commaConvert(
                        params.get("publish")) if params.get(
                            "publish") else defaultPublish
                    replicas = int(params.get("replicas")) if params.get(
                        "replicas") else defaultReplicas
                    delay = int(
                        params.get("delay")) if params.get("delay") else 10
                    parallelism = int(params.get("parallelism")) if params.get(
                        "parallelism") else 1
            except Exception, e:
                logger.warn(e, exc_info=True)
                res.update(msg="parameters error", code=50001)
                logger.info(res)
                return res
Пример #19
0
            #source data likes "src:dst:true:mode, src:dst:true|false:mode", example "/data/swarmopsapi-logs:/SwarmOpsApi/logs:true:bind, /data/cmlogs:/data/cmdata/logs:false:bind", convert it, \n,
            #`mount`'ask likes this, [src:dst:true|false(default false, rw):mode, ].
            publish = self.commaConvert(
                params.get("publish")) if params.get("publish") else []
            #source data likes "src:desc:protocol, src2:desc2", such as `env`, convert it, \n
            #list or tuple, `publish`'ask likes this, [src:desc, src2:desc2] or ().
        except Exception, e:
            logger.warn(e, exc_info=True)
            res.update(msg="parameters error", code=40000)
            logger.info(res)
            return res
        try:
            replicas = int(params.get("replicas", 1))
            #int, number of instances, detault is 1.
        except ValueError, e:
            logger.warn(e)
            res.update(msg="replicas not an integer", code=40001)
            logger.info(res)
            return res

        #check params
        if not image:
            logger.warn("image is empty")
            res.update(msg="image is empty", code=40002)
            logger.info(res)
            return res
        elif not isinstance(env, (str, unicode)) and not isinstance(
                env, (list, tuple)):
            logger.warn("env not a list or tuple, type is %s" % type(env))
            res.update(msg="env not a list or tuple", code=40003)
            logger.info(res)
Пример #20
0
    def call(self,
             _funcname,
             _callback=None,
             _include=None,
             _exclude=None,
             _every=None,
             _mode=None,
             _args=None,
             _kwargs=None,
             *args,
             **kwargs):
        """Try to execute the func method in all enabled hooks.

        .. versionchanged:: 1.7.0
            add param `_mode` and `_every`

        .. deprecated:: 1.7.0
            - _callback: replaced by `_every`
            - *args: replaced by `_args`
            - **kwargs: replaced by `_kwargs`
        """
        if args or kwargs:
            logger.warn(
                "The args/kwargs is deprecated. Use _args/_kwargs instead.")
        args = _args or args
        kwargs = _kwargs or kwargs
        response = []
        for h in sorted(self.get_enabled_hooks, key=lambda h: h.name):
            if _include and isinstance(_include, (tuple, list)):
                if h.name not in _include:
                    continue
            if _exclude and isinstance(_exclude, (tuple, list)):
                if h.name in _exclude:
                    continue
            func = getattr(h.proxy, _funcname, None)
            if callable(func):
                try:
                    if args and kwargs:
                        result = func(*args, **kwargs)
                    elif kwargs:
                        result = func(**kwargs)
                    elif args:
                        result = func(*args)
                    else:
                        result = func()
                except (ValueError, TypeError, Exception) as e:
                    result = dict(code=1, msg=str(e), sender=h.name)
                else:
                    if isinstance(result, dict):
                        result["sender"] = h.name
                        if "code" not in result:
                            result["code"] = 0
                    else:
                        result = dict(code=0, sender=h.name, data=result)
                #: Use `_every` to change the hook execution result
                if callable(_every):
                    _er = _every(result)
                    if _er and isinstance(_er, dict) and "code" in _er and \
                            "sender" in _er:
                        result = _er
                response.append(result)
                if callable(_callback):
                    _callback(result)
                if _mode == "any_true":
                    if result.get("code") == 0:
                        break
        return response