Example #1
0
    def __init__(self,conf,log,db,global_cfg,proxy_mgr,trans_proxy_mgr):
        self.conf=conf
        self.log=log
        self.db=db
        self.global_cfg=global_cfg
        self.proxy_mgr=proxy_mgr
        self.trans_proxy_mgr=trans_proxy_mgr

        self.port_mgr=PortMgr(self.log,self.conf,self.db)

        self._load_proxy_config()
Example #2
0
class NginxManager(object):

    WEB_PROXY_PREFIX="nfcloud_si_"
    TRANS_PROXY_PREFIX="transparent_proxy"

    def __init__(self,conf,log,db,global_cfg,proxy_mgr,trans_proxy_mgr):
        self.conf=conf
        self.log=log
        self.db=db
        self.global_cfg=global_cfg
        self.proxy_mgr=proxy_mgr
        self.trans_proxy_mgr=trans_proxy_mgr

        self.port_mgr=PortMgr(self.log,self.conf,self.db)

        self._load_proxy_config()

    def _load_proxy_config(self):
        path='/'.join([self.conf.nginx_config_path,'conf.d'])
        for entry in os.listdir(path):
            if (not entry.startswith(NginxManager.WEB_PROXY_PREFIX)
                and not entry.startswith(NginxManager.TRANS_PROXY_PREFIX)):
                continue

            os.remove('/'.join([path,entry]))
        
        for uri_prefix,web_url,port in self.proxy_mgr.list_proxy():
            self._add_proxy_nginx(uri_prefix,web_url,port)
       
        for location,port in self.trans_proxy_mgr.list_proxy():
            self._add_trans_proxy_nginx(location,port)

        self._reload()

    def _reload(self):
        os.system("nginx -s reload")

    def _nginx_log_level(self):
        levels={'debug':'debug',
                'info':'info',
                'warning':'notice',
                'error':'error',
                'critical':'crit'}
        return levels.get(self.conf.log_level,'notice')

    def _public_url(self,port,path):
        url="http://"+self.conf.proxy_public_address+":"+str(port)+path

        return url

    def _add_trans_proxy_nginx(self,location,port):
        prefix=self._trans_proxy_nginx_file_id(port)
        config_file=self._nginx_config_file(prefix)

        with open(config_file,"w") as f:
            config=NGINX_TRANS_PROXY_FILE_TEMPLATE%(port,
                                                  self._nginx_log_file(prefix),
                                                  self._nginx_log_level(),
                                                  location)
            f.write(config)
            f.close()

    def _trans_url(self,scheme,port):
        return scheme+"://"+self.conf.proxy_public_address+":"+str(port)

    def _trans_proxy_nginx_file_id(self,port):
        return '_'.join([NginxManager.TRANS_PROXY_PREFIX,str(port)])

    def add_trans_proxy(self,location):
        port=self.trans_proxy_mgr.find_proxy(location)
        if port:
            return self._trans_url(URL.get_scheme(location),port)
       
        port=self.port_mgr.alloc_port()
        if not port:
            self.log.error("trans proxy alloc port failed.")
            return None

        self._add_trans_proxy_nginx(location,port)

        self.trans_proxy_mgr.add_proxy(location,port)

        self._reload()

        return self._trans_url(URL.get_scheme(location),port)

    def del_trans_proxy(self,location):
        port=self.trans_proxy_mgr.find_proxy(location)
        if not port:
            return

        self.port_mgr.free_port(port)

        prefix=self._trans_proxy_nginx_file_id(port)
        self._del_proxy_nginx(prefix)
        self._del_proxy_log(prefix)

        self.trans_proxy_mgr.del_proxy(location)

        self._reload()

    def add_proxy(self,uri_prefix,proxy_uri):
        port,web_url=self.proxy_mgr.find_proxy(uri_prefix)
        if port:
            if proxy_uri==web_url:
                return self._public_url(port,URL.get_path(web_url));
            else:
                self.log.info("uri_prefix %s web_url change from %s to %s"
                              %(uri_prefix,web_url,proxy_uri))
                self.del_proxy(uri_prefix)

        port=self.port_mgr.alloc_port()
        if not port:
            self.log.error("uri_preifx: %s add proxy failed. port not avail."%(uri_prefix))
            return None

        self.proxy_mgr.add_proxy(uri_prefix,proxy_uri,port)

        self._add_proxy_nginx(uri_prefix,proxy_uri,port)

        self._reload()

        return self._public_url(port,URL.get_path(proxy_uri))

    def _add_proxy_nginx(self,uri_prefix,proxy_uri,port):
        self.log.info("nginx add proxy uri_prefix:%s port:%d"%(uri_prefix,port))

        config_file=self.conf.nginx_config_path+"/conf.d/"+uri_prefix+".conf"

        with open(config_file,"w") as f:
            config=NGINX_WEB_PROXY_FILE_TEMPLATE%(port,
                                                  self._nginx_log_file(uri_prefix),
                                                  self._nginx_log_level(),
                                                  WEB_PROXY_STATIC_PATH,
                                                  self.conf.rest_server_address,
                                                  self.conf.rest_server_port,
                                                  URL.get_base(proxy_uri),
                                                  self.conf.rest_server_address,
                                                  self.conf.rest_server_port
                                                  )
            f.write(config)
            f.close()

    def _nginx_config_file(self,prefix):
        return '/'.join([self.conf.nginx_config_path,'conf.d',prefix+".conf"])

    def _nginx_log_file(self,prefix):
        return '/'.join([self.conf.log_path,prefix+'_proxy.log'])

    def _del_proxy_nginx(self,file_prefix):
        path=self._nginx_config_file(file_prefix)
        if os.path.exists(path) and os.path.isfile(path):
            os.remove(path)
    
    def _del_proxy_log(self,prefix):
        path=self._nginx_log_file(prefix)
        if os.path.exists(path) and os.path.isfile(path):
            os.remove(path)

    def del_proxy(self,uri_prefix):
        self.log.info("nginx del proxy uri_prefix:%s"%(uri_prefix))
        
        self._del_proxy_nginx(uri_prefix)
        self._del_proxy_log(uri_prefix)
        
        port,web_url=self.proxy_mgr.find_proxy(uri_prefix)
        if port:
            self.port_mgr.free_port(int(port))
       
        self.proxy_mgr.del_proxy(uri_prefix)

        self._reload()