def connect(self): u"""Conecta ao Papovox via socket. Retorna booleano indicando se a conexão foi bem-sucedida. Bloqueia aguardando Papovox conectar. Define atributos: self.server_socket self.socket self.addr self.nickname """ try: self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Reutilizar porta já aberta #self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.server_socket.bind((self.host, self.port)) self.server_socket.listen(1) log.debug(u"XMPPVOX servindo em %s:%s", self.host, self.port) # Conecta ao Papovox ----------------------------------------------# try: self._accept() except socket.error: return False #------------------------------------------------------------------# return True except socket.error, e: log.error( safe_unicode(e.message) or u" ".join(map(safe_unicode, e.args))) sys.exit(1)
def connect(self): u"""Conecta ao Papovox via socket. Retorna booleano indicando se a conexão foi bem-sucedida. Bloqueia aguardando Papovox conectar. Define atributos: self.server_socket self.socket self.addr self.nickname """ try: self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Reutilizar porta já aberta #self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.server_socket.bind((self.host, self.port)) self.server_socket.listen(1) log.debug(u"XMPPVOX servindo em %s:%s", self.host, self.port) # Conecta ao Papovox ----------------------------------------------# try: self._accept() except socket.error: return False #------------------------------------------------------------------# return True except socket.error, e: log.error(safe_unicode(e.message) or u" ".join(map(safe_unicode, e.args))) sys.exit(1)
def main(): u"""Executa o cliente XMPP e o servidor compatível com Papovox. Esta função é o ponto de partida da execução do XMPPVOX.""" # Configuração. args = parse_command_line() configure_logging(args.verbose) S.show_code = args.show_code returncode = 0 try: # read/create machine id as soon as possible # for installation tracking purposes machine_id = tracker.machine_id() # check if we need to use the launch script # the launch script uses ScriptVox to # ask the user for JID and password, # then calls XMMPVOX again with arguments need_launch_script = (BUNDLED and len(sys.argv) == 1) if need_launch_script: import xmppvox.prod_utils as utils returncode = utils.do_the_magic() else: # normal execution host, port = args.host, args.port jid, password = get_jid_and_password(args.jid, args.password) returncode = start_client_server(machine_id, host, port, jid, password) except KeyboardInterrupt: returncode = 1 except Exception, e: log.critical(safe_unicode(e)) returncode = 1
def disconnect(self): u"""Desliga a conexão com o Papovox.""" log.debug(u"Encerrando conexão com o Papovox...") try: self.socket.shutdown(socket.SHUT_RDWR) self.socket.close() except socket.error, e: log.debug("Client socket: %s", safe_unicode(e))
def track_installation(data): u"""Informa tracker central sobre esta instância do XMPPVOX.""" try: r = requests.post("{}1/installation/new".format(TRACKER_URL), data=data) r.raise_for_status() except requests.exceptions.RequestException, e: log.warn(u"Falha na ativação do XMPPVOX: %s", safe_unicode(e)) return False
def ping_once(session_id, machine_id): try: r = requests.post("{}1/session/ping".format(TRACKER_URL), data=dict(session_id=session_id, machine_id=machine_id)) r.raise_for_status() log.debug(u"PING da sessão: %s", session_id) except requests.exceptions.RequestException, e: log.error(u"PING falhou: %s", safe_unicode(e))
def close_session(session_id, machine_id): u"""Encerra uma sessão no tracker central do XMPPVOX.""" try: r = requests.post("{}1/session/close".format(TRACKER_URL), data=dict(session_id=session_id, machine_id=machine_id)) r.raise_for_status() session_id = r.text.strip() log.debug(u"Sessão encerrada: %s", session_id) except requests.exceptions.RequestException, e: session_id = None log.error(u"Falha ao encerrar sessão: %s", safe_unicode(e))
def process(self, xmpp): u"""Processa mensagens do Papovox para a rede XMPP. Mensagens podem conter comandos para o XMPPVOX. Nota: esta função só termina caso ocorra algum erro ou a conexão com o Papovox seja perdida. """ try: while True: data = self.recvmessage() # Tenta executar algum comando contido na mensagem. if commands.process_command(xmpp, data, self): # Caso algum comando seja executado, sai do loop e passa # para a próxima mensagem. continue else: # Caso contrário, envia a mensagem para a rede XMPP. self.send_xmpp_message(xmpp, data) except socket.error, e: log.debug(safe_unicode(e))
def new_session(jid, machine_id): u"""Cria uma nova sessão no tracker central do XMPPVOX.""" message = None try: r = requests.post("{}1/session/new".format(TRACKER_URL), data=dict(jid=jid, machine_id=machine_id, xmppvox_version=__version__)) if r.status_code == requests.codes.forbidden: message = r.text.strip() r.raise_for_status() try: session_id, message = r.text.split(None, 1) except ValueError: session_id = r.text.strip() log.debug(u"Sessão criada: %s", session_id) except requests.exceptions.RequestException, e: session_id = None if message is None: message = (u"Problema com o servidor do XMPPVOX. " u"Por favor, tente conectar novamente mais tarde.\n\n" u"Se o problema persistir, visite http://xmppvox.rodolfocarvalho.net " u"para obter ajuda.") log.error(u"Falha ao obter identificador de sessão: %s", safe_unicode(e))
log.info(u"Conectado ao Papovox.") log.debug(u"Apelido: %s", self.nickname) def disconnect(self): u"""Desliga a conexão com o Papovox.""" log.debug(u"Encerrando conexão com o Papovox...") try: self.socket.shutdown(socket.SHUT_RDWR) self.socket.close() except socket.error, e: log.debug("Client socket: %s", safe_unicode(e)) try: self.server_socket.shutdown(socket.SHUT_RDWR) self.server_socket.close() except socket.error, e: log.debug("Server socket: %s", safe_unicode(e)) # Funções de integração com o cliente XMPP --------------------------------# def process(self, xmpp): u"""Processa mensagens do Papovox para a rede XMPP. Mensagens podem conter comandos para o XMPPVOX. Nota: esta função só termina caso ocorra algum erro ou a conexão com o Papovox seja perdida. """ try: while True: data = self.recvmessage() # Tenta executar algum comando contido na mensagem. if commands.process_command(xmpp, data, self):