def create_logger(self): if self._daemon is False: self.log = StdoutLogger() self.log.set_debug() else: logtype = helpers.get_conf_value(self._config, 'freeswitch', 'LOG_TYPE') if logtype == 'file': logfile = helpers.get_conf_value(self._config, 'freeswitch', 'LOG_FILE') self.log = FileLogger(logfile) elif logtype == 'syslog': syslogaddress = helpers.get_conf_value(self._config, 'freeswitch', 'SYSLOG_ADDRESS') syslogfacility = helpers.get_conf_value(self._config, 'freeswitch', 'SYSLOG_FACILITY') self.log = SysLogger(syslogaddress, syslogfacility) else: self.log = StdoutLogger() debug_mode = helpers.get_conf_value(self._config, 'freeswitch', 'DEBUG') if debug_mode == 'true': self.log.set_debug() else: self.log.set_info()
def do_daemon(self): # get user/group from config user = helpers.get_conf_value(self._config, "freeswitch", "FS_OUTBOUND_USER") group = helpers.get_conf_value(self._config, "freeswitch", "FS_OUTBOUND_GROUP") if not user or not group: uid = os.getuid() user = pwd.getpwuid(uid)[0] gid = os.getgid() group = grp.getgrgid(gid)[0] # daemonize now plivo.utils.daemonize.daemon(user, group, path="/", pidfile=self._pidfile, other_groups=())
def _validate_http_auth(self): """Verify http auth request with values in "Authorization" header """ key = get_conf_value(self._config, 'rest_server', 'AUTH_ID') secret = get_conf_value(self._config, 'rest_server', 'AUTH_TOKEN') if not key or not secret: return True try: auth_type, encoded_auth_str = \ request.headers['Authorization'].split(' ', 1) if auth_type == 'Basic': decoded_auth_str = base64.decodestring(encoded_auth_str) auth_id, auth_token = decoded_auth_str.split(':', 1) if auth_id == key and secret == auth_token: return True except (KeyError, ValueError, TypeError): pass raise Unauthorized("HTTP Auth Failed")
def _validate_http_auth(self): """Verify http auth request with values in "Authorization" header """ key = get_conf_value(self._config, 'rest_server', 'AUTH_ID') secret = get_conf_value(self._config, 'rest_server', 'AUTH_TOKEN') if not key or not secret: return True if 'Authorization' in request.headers: auth_header = request.headers['Authorization'].split() if auth_header[0] == 'Basic': encoded_auth_str = auth_header[1] decoded_auth_str = base64.decodestring(encoded_auth_str) auth_list = decoded_auth_str.split(':') auth_id = auth_list[0] auth_token = auth_list[1] if auth_id == key and secret == auth_token: return True raise Unauthorized("HTTP Auth Failed")
def create_logger(self): """This will create a logger Based on the settings in the configuration file, LOG_TYPE will determine if we will log in file, syslog or stdout To log in file we use the following setting : LOG_FILE = /tmp/plivo-rest.log To log to syslog we have several settings to configure the logging : * LOG_TYPE = syslog * SYSLOG_ADDRESS = /dev/log * SYSLOG_FACILITY = local0 """ if self._daemon is False: self.log = StdoutLogger() self.log.set_debug() self.app.debug = True else: logtype = helpers.get_conf_value(self._config, 'rest_server', 'LOG_TYPE') if logtype == 'file': logfile = helpers.get_conf_value(self._config, 'rest_server', 'LOG_FILE') self.log = FileLogger(logfile) elif logtype == 'syslog': syslogaddress = helpers.get_conf_value(self._config, 'rest_server', 'SYSLOG_ADDRESS') syslogfacility = helpers.get_conf_value(self._config, 'rest_server', 'SYSLOG_FACILITY') self.log = SysLogger(syslogaddress, syslogfacility) else: self.log = StdoutLogger() debug_mode = helpers.get_conf_value(self._config, 'rest_server', 'DEBUG') if debug_mode == 'true': self.log.set_debug() self.app.debug = True else: self.log.set_info() self.log.name = self.name self.app._logger = self.log
def _validate_ip_auth(self): """Verify request is from allowed ips """ allowed_ips = get_conf_value(self._config, 'rest_server', 'ALLOWED_IPS') if not allowed_ips: return True for ip in allowed_ips.split(','): if ip.strip() == request.remote_addr.strip(): return True raise Unauthorized("IP Auth Failed")
def create_logger(self): if self._daemon is False: self.log = StdoutLogger() self.log.set_debug() else: logtype = helpers.get_conf_value(self._config, "freeswitch", "LOG_TYPE") if logtype == "file": logfile = helpers.get_conf_value(self._config, "freeswitch", "LOG_FILE") self.log = FileLogger(logfile) elif logtype == "syslog": syslogaddress = helpers.get_conf_value(self._config, "freeswitch", "SYSLOG_ADDRESS") syslogfacility = helpers.get_conf_value(self._config, "freeswitch", "SYSLOG_FACILITY") self.log = SysLogger(syslogaddress, syslogfacility) else: self.log = StdoutLogger() debug_mode = helpers.get_conf_value(self._config, "freeswitch", "DEBUG") if debug_mode == "true": self.log.set_debug() else: self.log.set_info()
def __init__(self, config, daemon=False, pidfile='/tmp/plivo_outbound.pid'): self._request_id = 0 self._daemon = daemon self._run = False self._pidfile = pidfile # load config self._config = config # create logger self.create_logger() # create outbound server self.fs_outbound_address = helpers.get_conf_value(self._config, 'freeswitch', 'FS_OUTBOUND_ADDRESS') fs_host, fs_port = self.fs_outbound_address.split(':', 1) fs_port = int(fs_port) self.default_answer_url = helpers.get_conf_value(self._config, 'freeswitch', 'DEFAULT_ANSWER_URL') self.auth_id = helpers.get_conf_value(self._config, 'rest_server', 'AUTH_ID') self.auth_token = helpers.get_conf_value(self._config, 'rest_server', 'AUTH_TOKEN') self.default_hangup_url = helpers.get_conf_value(self._config, 'freeswitch', 'DEFAULT_HANGUP_URL') self.default_http_method = helpers.get_conf_value(self._config, 'rest_server', 'DEFAULT_HTTP_METHOD') if not self.default_http_method in ('GET', 'POST'): self.default_http_method = 'POST' # This is where we define the connection with the # Plivo XML element Processor multiprocserver.OutboundServer.__init__(self, (fs_host, fs_port), PlivoOutboundEventSocket, filter=None)
def __init__(self, configfile, daemon=False, pidfile="/tmp/plivo_outbound.pid", filter=None): self._request_id = 0 self._daemon = daemon self._run = False self._pidfile = pidfile # load config self._config = helpers.get_config(configfile) # create logger self.create_logger() # create outbound server self.fs_outbound_address = helpers.get_conf_value(self._config, "freeswitch", "FS_OUTBOUND_ADDRESS") fs_host, fs_port = self.fs_outbound_address.split(":", 1) fs_port = int(fs_port) self.default_answer_url = helpers.get_conf_value(self._config, "freeswitch", "DEFAULT_ANSWER_URL") self.auth_id = helpers.get_conf_value(self._config, "rest_server", "AUTH_ID") self.auth_token = helpers.get_conf_value(self._config, "rest_server", "AUTH_TOKEN") self.default_hangup_url = helpers.get_conf_value(self._config, "freeswitch", "DEFAULT_HANGUP_URL") # default hangup_url is answer_url if not self.default_hangup_url: self.default_hangup_url = self.default_answer_url # This is where we define the connection with the # Plivo XML grammar Processor OutboundServer.__init__(self, (fs_host, fs_port), PlivoOutboundEventSocket, filter)
def do_daemon(self): """This will daemonize the current application Two settings from our configuration files are also used to run the daemon under a determine user & group. REST_SERVER_USER : determine the user running the daemon REST_SERVER_GROUP : determine the group running the daemon """ # get user/group from config user = helpers.get_conf_value(self._config, 'rest_server', 'REST_SERVER_USER') group = helpers.get_conf_value(self._config, 'rest_server', 'REST_SERVER_GROUP') if not user or not group: uid = os.getuid() user = pwd.getpwuid(uid)[0] gid = os.getgid() group = grp.getgrgid(gid)[0] # daemonize now plivo.utils.daemonize.daemon(user, group, path='/', pidfile=self._pidfile, other_groups=())
def __init__(self, configfile, daemon=False, pidfile='/tmp/plivo_outbound.pid'): self._config = helpers.get_config(configfile) self._handler_mode = helpers.get_conf_value(self._config, 'freeswitch', 'FS_OUTBOUND_HANDLER') if self._handler_mode == 'thread': self.server = PlivoThreadOutboundServer(self._config, daemon, pidfile) elif self._handler_mode == 'process': self.server = PlivoProcessOutboundServer(self._config, daemon, pidfile) else: self.server = PlivoSpawnOutboundServer(self._config, daemon, pidfile)
def test_config(self): '''Test to get config parameter''' return get_conf_value(self._config, 'freeswitch', 'FS_INBOUND_ADDRESS')
def __init__(self, configfile, daemon=False, pidfile='/tmp/plivo_rest.pid'): """Constructor Initialize main properties such as daemon, pidfile, config, etc... This will init the http server that will provide the Rest interface, the rest server is configured on HTTP_ADDRESS Extra: * FS_INBOUND_ADDRESS : Define the event_socket interface to connect to in order to initialize CallSession with Freeswitch * FS_OUTBOUND_ADDRESS : Define where on which address listen to initialize event_socket session with Freeswitch in order to control new CallSession """ self._daemon = daemon self._run = False self._pidfile = pidfile # load config self._config = helpers.get_config(configfile) # create flask app self.app = Flask(self.name) self.app.secret_key = helpers.get_conf_value(self._config, 'rest_server', 'SECRET_KEY') self.app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 # create logger self.create_logger() # create rest server self.fs_inbound_address = helpers.get_conf_value(self._config, 'freeswitch', 'FS_INBOUND_ADDRESS') fs_host, fs_port = self.fs_inbound_address.split(':', 1) fs_port = int(fs_port) fs_password = helpers.get_conf_value(self._config, 'freeswitch', 'FS_PASSWORD') # get auth id and auth token self.auth_id = helpers.get_conf_value(self._config, 'rest_server', 'AUTH_ID') self.auth_token = helpers.get_conf_value(self._config, 'rest_server', 'AUTH_TOKEN') # get outbound socket host/port fs_out_address = helpers.get_conf_value(self._config, 'freeswitch', 'FS_OUTBOUND_ADDRESS') fs_out_host, fs_out_port = fs_out_address.split(':', 1) # if outbound host is 0.0.0.0, send to 127.0.0.1 if fs_out_host == '0.0.0.0': fs_out_address = '127.0.0.1:%s' % fs_out_port # create inbound socket instance self._rest_inbound_socket = RESTInboundSocket(fs_host, fs_port, fs_password, outbound_address=fs_out_address, auth_id=self.auth_id, auth_token=self.auth_token, filter='ALL', log=self.log) # expose api functions to flask app for path, func_desc in urls.URLS.iteritems(): func, methods = func_desc fn = getattr(self, func.__name__) self.app.add_url_rule(path, func.__name__, fn, methods=methods) # create wsgi server self.http_address = helpers.get_conf_value(self._config, 'rest_server', 'HTTP_ADDRESS') http_host, http_port = self.http_address.split(':', 1) http_port = int(http_port) self.http_server = WSGIServer((http_host, http_port), self.app, log=self.log)