コード例 #1
0
    def on_startup(self):
        '''
        Nombre: on_startup
        Descripcion: Manejador de inicio de la aplicacion. Se ejecuta al comenzar la app.
        '''
        #Conexion a Discovery
        try:
            self.discovery = Discovery(self.config.server_ip,
                                       self.config.server_port)
        except Exception as e:
            print(e)
            self.app.errorBox(
                "Error",
                "No se ha podido establecer la conexion al servidor de descubrimiento."
            )
            self.app.stop()
            return

        self.control = Control(self.discovery, self.config.call_timeout,
                               self.config.user_filename, self.buffer_video)
        self.buffer_video.set_control(self.control)

        #Obtenemos IP externa
        try:
            ip_req = requests.get('https://api.ipify.org?format=json').json()
            self.app.setEntry("ipInput", ip_req["ip"], callFunction=False)
        except (requests.exceptions.RequestException, json.JSONDecodeError):
            print(
                "ADVERTENCIA: Error obteniendo IP desde recurso externo. El usuario debera introducirla."
            )

        #Tratemos de obtener datos preexistentes
        try:
            with open(self.config.user_filename, "r") as file:
                data = json.load(file)
                self.app.setEntry("userInput",
                                  data["username"],
                                  callFunction=False)
                self.app.setEntry("tcpInput",
                                  data["tcp_port"],
                                  callFunction=False)
                self.app.setEntry("udpInput",
                                  data["udp_port"],
                                  callFunction=False)
        except:
            print(
                "Fichero de datos previo no encontrado. No se cargaran sugerencias previas."
            )

        self.app.showSubWindow("Login")  #Mostramos ventana de login
コード例 #2
0
 def __init__(self,
              logger,
              channel='#some_channel',
              username='******',
              script_user=None,
              l_exec=None,
              discover=None,
              proxy=False,
              webhook=None):
     self.logger = logger
     self.channel = channel
     self.username = username
     if l_exec:
         self.l_exec = l_exec
     else:
         self.l_exec = LocalExec()
     if discover:
         self.discover = discover
     else:
         self.discover = Discovery(logger=self.logger, l_exec=self.l_exec)
     self.script_user = script_user
     self.no_exceptions = True
     if proxy:
         self.proxy = self.get_proxy()
         self.set_proxies()
     self.url = webhook
コード例 #3
0
 def get_discovery_publishes_info(
         user_id,
         start_id,
         count,
         longitude,
         latitude,
         loaded_publish_ids,
         city,
 ):
     city = HomePage.clear_city(city)
     return Discovery.get_publish_info(user_id, start_id, city, count, longitude, latitude, loaded_publish_ids)
コード例 #4
0
class VideoClient(object):

    #PARAMETROS DE CONTROL DEL CLIENTE DE VIDEO

    discovery = None  #Objeto que gestiona la conexion al server de descubrimiento
    connection_loop = None  #Hilo que despacha las conexiones entrantes
    command_loop = None  #Hilo que atiende a los comandos de llamada entrantes
    frame_send_loop = None  #Hilo que envia los frames al ritmo correcto
    frame_recv_loop = None  #Hilo que recibe los frames al ritmo correcto
    nick = None  #Nombre de usuario
    listen_control_port = "10000"  #Puerto de escucha para control. Lo ajusta el usuario con la interfaz.
    boolResetFrame = 1  #Indica si han de resetearse los campos propios de la llamada la siguiente vez que se actualice frame.
    socket_video_send = None  #Socket UDP para enviar video
    socket_video_rec = None  #Socket UDP para recibir video
    num = 0  #Numero de secuencia del frame actual
    buffer_video = None  #Objeto de buffer de video
    currently_playing_file = None  #Nombre del fichero que se esta enviando actualmente.
    fps_send = [30]  #FPS para el video saliente
    fps_send_min = 20  #FPS minimos posibles que el QoS puede poner
    fps_send_max = 60  #FPS maximos posibles que el QoS puede poner
    fps_recv = 20  #FPS para el video entrante
    quality_send = [50]  #Calidad de compresión del video saliente
    resolution_send = ["640x480"]  # Resolucion a la que se envía el video
    resolution_send_old = ["640x480"]
    packets_lost_total = [0]  #Numero de paquetes perdidos
    cap_frame = np.array([])  #Frame nuestro que se captura a ritmo de fps_send
    rec_frame = np.array(
        [])  #Ultimo frame recibido, se actualiza a ritmo de fps_recv
    cap_frame_lock = threading.Lock()  #Lock para captura de video
    rec_frame_lock = threading.Lock()  #Lock para recepcion de video
    update_screen_lock = threading.Lock(
    )  #Para evitar que receptor y emisor actualicen la pantalla a la vez.
    program_quit = False  #Indica si han solicitado cerrar el programa.
    config = None  #Objeto con parametros de configuracion
    control = None  #Objeto del modulo de control

    def __init__(self, window_size):
        '''
        Nombre: __init__
        Descripcion: Constructor del cliente de video
        Argumentos: window_size: Tamano de la ventana.
        '''

        #Creamos el objeto de configuracion
        self.config = ConfigParser()

        #Creamos el objeto de buffer de video
        self.buffer_video = VideoBuffer(self.config)

        # Creamos una variable que contenga el GUI principal
        self.app = gui("Redes2 - P2P", window_size)
        self.app.setGuiPadding(10, 10)

        # Preparación del interfaz
        self.app.addLabel("title", "Cliente Multimedia P2P - Redes2 ")
        self.app.addLabel("loggeduser", "Sesion no iniciada")
        self.app.addImage("video", "imgs/webcam.gif")

        # Registramos la función de captura de video
        # Esta misma función también sirve para enviar un vídeo
        self.cap = cv2.VideoCapture(0)

        #FPS minimo y maximo para el QoS
        self.fps_send_max = int(self.cap.get(cv2.CAP_PROP_FPS))
        self.fps_send_min = self.fps_send_min // 2
        self.fps_send = [self.fps_send_max]

        # Añadir los botones
        self.app.addButtons(["Conectar", "Espera", "Colgar", "Salir"],
                            self.buttonsCallback)
        self.app.enableButton("Conectar")
        self.app.disableButton("Espera")
        self.app.disableButton("Colgar")

        # Barra de estado
        # Debe actualizarse con información útil sobre la llamada (duración, FPS, etc...)
        self.app.addStatusbar(fields=3, side="LEFT")
        self.app.setStatusbarWidth(35, field=0)
        self.app.setStatusbarWidth(50, field=1)
        self.app.setStatusbarWidth(60, field=2)
        #Bara de herramientas
        self.app.addToolbar(["FILE", "CAMERA"],
                            self.toolbarCallback,
                            findIcon=True)
        self.app.setToolbarIcon("CAMERA", "md-camera-photo")
        self.app.setStopFunction(self.stop)
        self.app.setStartFunction(self.on_startup)

        #Ventana de inicio de sesion
        self.app.startSubWindow("Login",
                                modal=True)  #Modal: Bloquea a la principal.

        self.app.addLabel("pad", "", 0, 0)  #Padding above
        self.app.setPadding([30, 0])

        self.app.setSticky('e')
        self.app.addLabel("user", "Nick: ", 1, 0)
        self.app.addLabel("pass", "Password: "******"tcp", "Puerto de control (TCP): ", 3, 0)
        self.app.addLabel("udp", "Puerto de video (UDP): ", 4, 0)
        self.app.addLabel("ip", "Direccion IP: ", 5, 0)
        self.app.addLabel(
            "ipWarn",
            "(La IP puede dejarse en blanco para utilizar la IP local)", 6, 2)

        self.app.setSticky('w')
        self.app.addEntry("userInput", 1, 2)
        self.app.addSecretEntry("passInput", 2, 2)
        self.app.addNumericEntry("tcpInput", 3, 2)
        self.app.addNumericEntry("udpInput", 4, 2)
        self.app.addEntry("ipInput", 5, 2)

        self.app.setPadding([20, 20])
        self.app.addButton("Entrar", self.login, 7, 1)
        self.app.setStopFunction(
            self.app.stop)  #Parar la ventana cierra la app.
        self.app.setPadding([0, 0])
        self.app.stopSubWindow()

        # Definicion de la ventana de elegir usuario para llamada:
        self.app.startSubWindow("Iniciar llamada",
                                modal=True)  #Modal: Bloquea a la principal.

        self.app.addLabel("pad2", "", 0, 0)  #Padding above
        self.app.setPadding([30, 0])

        self.app.setSticky('e')
        self.app.addLabel("calleeNick", "Llamar a: ", 1, 0)
        self.app.addLabel("listInfo", "Usuarios registrados:", 2, 0)

        self.app.setSticky('w')
        self.app.addEntry("calleeNickInput", 1, 1)
        self.app.addListBox("nicksList", ["Cargando..."], 2, 1)

        #Handler
        self.app.setListBoxChangeFunction("nicksList", self.list_handler)

        self.app.setPadding([20, 20])
        self.app.addButton("Llamar", self.init_call, 3, 1)
        self.app.setPadding([0, 0])
        self.app.stopSubWindow()

    def start(self):
        '''
        Nombre: start
        Descripcion: Arranca el cliente y realiza todas las conexiones e hilos necesarios.
        '''
        self.app.go()

    def async_cleaning(self):
        '''
        Nombre: async_cleaning
        Descripcion: Limpia los hilos y conexiones. Esta pensado para llamar de manera asincrona
                     antes de cerrar el cliente, para hacerlo de forma limpia.
                     Debe llamarse asincronamente para no bloquear la GUI, que tiene lugar en la limpieza.
        '''
        #Parar los hilos
        print("Aplicacion saliendo...")
        self.program_quit = True
        if self.frame_send_loop:
            self.frame_send_loop.join()
        if self.frame_recv_loop:
            self.frame_recv_loop.join()
        if self.connection_loop:
            self.control.control_listen_stop()
            self.connection_loop.join()
        if self.command_loop:
            self.control.control_incoming_stop()
            self.command_loop.join()
        if self.socket_video_send:
            self.socket_video_send.close()
        if self.socket_video_rec:
            self.socket_video_rec.close()
        if self.discovery:
            #Desconexion de discovery
            self.discovery.server_quit()
        #Notificar a la GUI de que hay que parar.
        self.app.stop()

    def stop(self):
        '''
        Nombre: stop
        Descripcion: Manejador para el cierre de la aplicacion. Realiza primero una limpieza asincrona.
        '''
        #La parada la hacemos asincrona porque hay algunos elementos que para
        #limpiarse necesitan del hilo principal de la gui, que esta ocupado en
        #esta funcion. Esto se podria arreglar usando la cola de eventos
        #de appJar, pero no esta pensada ni de lejos para video. Su ratio
        #de refresco es 10 veces por segundo, y hemos logrado incrementarlo
        #mirando el codigo de appJar (hay una variable privada que podemos modificar)
        #pero aun asi no es suficiente.
        if not self.program_quit:
            self.app.thread(self.async_cleaning)
            return False
        return True

    def on_startup(self):
        '''
        Nombre: on_startup
        Descripcion: Manejador de inicio de la aplicacion. Se ejecuta al comenzar la app.
        '''
        #Conexion a Discovery
        try:
            self.discovery = Discovery(self.config.server_ip,
                                       self.config.server_port)
        except Exception as e:
            print(e)
            self.app.errorBox(
                "Error",
                "No se ha podido establecer la conexion al servidor de descubrimiento."
            )
            self.app.stop()
            return

        self.control = Control(self.discovery, self.config.call_timeout,
                               self.config.user_filename, self.buffer_video)
        self.buffer_video.set_control(self.control)

        #Obtenemos IP externa
        try:
            ip_req = requests.get('https://api.ipify.org?format=json').json()
            self.app.setEntry("ipInput", ip_req["ip"], callFunction=False)
        except (requests.exceptions.RequestException, json.JSONDecodeError):
            print(
                "ADVERTENCIA: Error obteniendo IP desde recurso externo. El usuario debera introducirla."
            )

        #Tratemos de obtener datos preexistentes
        try:
            with open(self.config.user_filename, "r") as file:
                data = json.load(file)
                self.app.setEntry("userInput",
                                  data["username"],
                                  callFunction=False)
                self.app.setEntry("tcpInput",
                                  data["tcp_port"],
                                  callFunction=False)
                self.app.setEntry("udpInput",
                                  data["udp_port"],
                                  callFunction=False)
        except:
            print(
                "Fichero de datos previo no encontrado. No se cargaran sugerencias previas."
            )

        self.app.showSubWindow("Login")  #Mostramos ventana de login

    #Funcion que maneja el inicio de sesion
    def login(self):
        '''
        Nombre: login
        Descripcion: Registra al usuario en la aplicacion y arranca todos los hilos necesarios para gestionar
        la sesion.
        '''
        # Entrada de los datos del usuario a conectar
        print("Comenzando registro de usuario.")
        register_nick = self.app.getEntry("userInput")
        password = self.app.getEntry("passInput")
        control_port = int(self.app.getEntry("tcpInput"))
        video_port = int(self.app.getEntry("udpInput"))
        ip = self.app.getEntry("ipInput")

        #Comprobamos si los puertos introducidos son correctos
        invalid_port = False
        if control_port:
            if control_port > 65535 or control_port < 1024:
                invalid_port = True
            control_port = str(control_port)
        if video_port:
            if video_port > 65535 or video_port < 1024:
                invalid_port = True
            video_port = str(video_port)
        if invalid_port:
            self.app.errorBox(
                "Error",
                "El puerto introducido es invalido. Debe estar en el rango 1024-65535",
                parent="Login")
            return

        #Si no se introdujo IP
        if ip == None or ip == "":
            #Ponemos la IP local
            ip = socket.gethostbyname(socket.gethostname())

        #Faltan datos
        if not register_nick or not password or not control_port or not video_port or not ip:
            self.app.errorBox(
                "Error",
                "No se ha podido realizar el registro correctamente. Faltan datos.",
                parent="Login")
            return

        #Realizamos el registro en el discovery
        print("Tratando de registrar a " + register_nick + " con clave " +
              password + " puerto:" + control_port + " ip:" + ip +
              " puerto de video: " + video_port)
        ret = self.discovery.register_user(register_nick, password, ip,
                                           control_port, ["V0", "V1"])
        if not ret:
            #Error
            self.app.errorBox(
                "Error",
                "No se ha podido realizar el registro correctamente. Error del servidor de descubrimiento.",
                parent="Login")
            return

        #Clave incorrecta, la volvemos a pedir.
        if ret == -1:
            self.app.warningBox(
                "Contraseña incorrecta.",
                "La contraseña es incorrecta. Por favor, introduzcala de nuevo.",
                parent="Login")
            return

        #Ajustamos la informacion indicando quien ha iniciado la sesion
        self.app.setLabel("loggeduser",
                          "Sesion iniciada como: " + register_nick)
        self.listen_control_port = control_port

        #Iniciamos los sockets de video
        self.socket_video_send = socket.socket(socket.AF_INET,
                                               socket.SOCK_DGRAM)
        self.socket_video_rec = socket.socket(socket.AF_INET,
                                              socket.SOCK_DGRAM)
        self.socket_video_rec.bind(('', int(video_port)))

        #Hilos de recepcion y envio:
        #CONEXION: Atiende conexiones nuevas que entren gestionando los intentos de llamada (ACCEPT/DENY/BUSY)
        self.connection_loop = threading.Thread(
            target=self.control.control_listen_loop,
            args=(self.listen_control_port, self.app))
        #COMANDOS: Responde a los comandos que entren a traves de una llamada entrante. Esta bloqueado mientras no hay llamadas.
        self.command_loop = threading.Thread(
            target=self.control.control_incoming_loop, args=(self.app, ))
        self.connection_loop.start()
        self.command_loop.start()
        #ENVIO: Muestra por pantalla (y si es necesario envia por la red) los frames al ritmo adecuado
        self.frame_send_loop = threading.Thread(target=self.enviaVideo)
        #RECEPCION: Hilo que a ritmo de FPS-recv actualiza el frame entrante.
        self.frame_recv_loop = threading.Thread(target=self.capturaVideo)
        self.frame_send_loop.start()
        self.frame_recv_loop.start()

        #Almacenamos datos relevantes del usuario en formato JSON
        user_data = {
            "username": register_nick,
            "tcp_port": control_port,
            "udp_port": video_port
        }
        with open(self.config.user_filename, "w+") as file:
            json.dump(user_data, file, indent=4)

        #Mostrar ventana principal
        self.app.hideSubWindow("Login")

    # Función que envia el frame a mostrar en cada momento
    def enviaVideo(self):
        '''
        Nombre: enviaVideo
        Descripcion: Bucle para enviar video que se ejecuta asincronamente, cada
        1/FPS_ENVIO segundos. Tambien se ocupa de mostrar en la pantalla nuestra imagen.
        '''
        while not self.program_quit:

            #Tiempo actual para mayor precision en los FPS
            send_start_time = time.time()

            #Reajustamos la resolucion en caso de que sea necesario
            if (self.resolution_send[0] != self.resolution_send_old[0]):
                self.setImageResolution(self.resolution_send[0])
                self.resolution_send_old[0] = self.resolution_send[0]

            # Capturamos un frame de la cámara o del vídeo
            ret, frame = self.cap.read()
            #Bucle si el video acaba o si la camara se desconecta como consecuencia de un cambio de conexion
            if not ret:
                #Se reestablece la conexion con el video o camara
                if self.currently_playing_file:
                    self.cap = cv2.VideoCapture(self.currently_playing_file)
                else:
                    self.cap = cv2.VideoCapture(0)
                #Se vuelve a intentar
                ret, frame = self.cap.read()
                #Error
                if not ret:
                    self.app.errorBox(
                        "Error fatal",
                        "El video/camara que se estaba reproduciendo no se encuentra. Puede deberse a que este en uso por otra aplicacion."
                    )
                    self.app.stop()
                    return

            #Reescalado para mostrar en la GUI
            frame = cv2.resize(frame, (640, 480))

            # Código que envia el frame a la red en caso de que se este en llamada
            status = self.control.call_status()
            if (status[0] != None and status[0] != "HOLD1"
                    and status[0] != "HOLD2"):
                #Enviamos el frame
                errorSend = self.buffer_video.send_frame(
                    self.socket_video_send, (status[0], int(status[1])), frame,
                    self.num, self.quality_send[0], self.resolution_send[0],
                    self.fps_send[0])
                if (errorSend == -1):
                    print("Error sending message")
                self.num += 1

            #Almacenamos finalmente el frame
            with self.cap_frame_lock:
                self.cap_frame = frame

            #Actualizacion de informacion
            string_field1 = "Video propio: " + str(self.fps_send[0]) + " FPS"
            string_field1 += " Compresion: " + str(self.quality_send[0]) + "%"
            string_field1 += " Resolucion: " + self.resolution_send[0]
            self.app.setStatusbar(string_field1, field=1)

            #Repintar la pantalla
            self.updateScreen()

            #Pausa el tiempo que quede para mandar a ritmo FPS_send
            remaining = 1 / self.fps_send[0] - (time.time() - send_start_time)
            if (remaining > 0):
                time.sleep(remaining)

        print("Hilo de procesado de video saliente recogido.")

    # Función que captura el frame a mostrar en cada momento
    def capturaVideo(self):
        '''
        Nombre: capturaVideo
        Descripcion: Bucle para capturar video que se ejecuta asincronamente, cada
        1/FPS_RECEPCION segundos. Si esta en llamada, lanzara un sub-hilo que recibira
        en todo momento frames del emisor, llenando un buffer, para que poder extraer de
        dicho buffer al ritmo deseado.
        '''
        while not self.program_quit:

            #Frame que nos llega
            frame_rec = np.array([])

            #Tiempo actual para mayor precision en los FPS
            receive_start_time = time.time()

            #Con quien estamos conectados
            connecting_to = self.control.get_connected_username()

            # Código que recoge el frame a imprimir por pantalla
            status = self.control.call_status()
            if (status[0] != None and status[0] != "HOLD1"
                    and status[0] != "HOLD2"):

                #Si es el primer tick en el que se ha entrado aqui, preparar lo necesario
                if (self.boolResetFrame == 1):
                    self.app.disableButton("Conectar")
                    self.app.enableButton("Espera")
                    self.app.enableButton("Colgar")
                    self.boolResetFrame = 0
                    self.startTime = time.time()
                    #Hilo de RECOGIDA: Recoge paquetes de video entrantes continuamente, de manera asincrona.
                    self.receive_loop = threading.Thread(
                        target=self.buffer_video.receive_frame,
                        args=(self.socket_video_rec, ))
                    self.receive_loop.start()
                    print("Hilo de recepción de video iniciado.")

                #Actualizar informacion
                if self.buffer_video.using_v1:
                    ver = "V1"
                else:
                    ver = "V0"
                self.app.setStatusbar("En llamada con: " +
                                      self.control.get_connected_username() +
                                      " usando " + ver,
                                      field=0)

                #Popeamos el elemento a mostrar
                _, header, frame_rec = self.buffer_video.pop_frame(
                    self.quality_send, self.fps_send, self.resolution_send,
                    self.packets_lost_total, self.fps_send_min,
                    self.fps_send_max)

                #Actualizamos la GUI
                if (len(header) >= 4):
                    string = "Duracion: " + str(
                        time.strftime(
                            '%H:%M:%S',
                            time.gmtime(time.time() - self.startTime)))
                    string += " FPS: " + str(header[3])
                    string += " Resolucion: " + str(header[2])
                    string += " Perdidos: " + str(self.packets_lost_total[0])
                    self.app.setStatusbar(string, field=2)
                    self.fps_recv = int(header[3])
                else:
                    #Aun no hay frames suficientes en el buffer: icono de carga
                    self.app.setStatusbar("Duracion: " + str(
                        time.strftime(
                            '%H:%M:%S',
                            time.gmtime(time.time() - self.startTime))),
                                          field=2)
                    frame_rec = cv2.imread("imgs/loading_video.png")

            elif status[0] == "HOLD1":
                #EN ESPERA POR NUESTRA PARTE
                frame_rec = cv2.imread("imgs/call_held.png")
                self.app.setStatusbar("Llamada en espera por " +
                                      self.control.get_username(),
                                      field=0)
                self.app.setStatusbar("Duracion: " + time.strftime(
                    '%H:%M:%S', time.gmtime(time.time() - self.startTime)),
                                      field=2)

            elif status[0] == "HOLD2":
                #EN ESPERA POR LA PARTE OPUESTA
                frame_rec = cv2.imread("imgs/call_held.png")
                self.app.setStatusbar("Llamada en espera por " + connecting_to,
                                      field=0)
                self.app.setStatusbar("Duracion: " + time.strftime(
                    '%H:%M:%S', time.gmtime(time.time() - self.startTime)),
                                      field=2)

            elif connecting_to != None:
                #LLAMANDO
                frame_rec = cv2.imread("imgs/calling.jpg")
                self.app.setStatusbar("Llamando a " + connecting_to, field=0)
                self.app.disableButton("Conectar")
                self.app.disableButton("Espera")
                self.app.disableButton("Colgar")

            else:
                #NO EN LLAMADA
                self.app.setStatusbar("Cliente listo para llamar.", field=0)
                self.app.setStatusbar("", field=2)

                #Si es el primer tick que se entra aqui tras una llamada, finalizamos todos los recursos asociados a la misma.
                if (self.boolResetFrame != 1):

                    #Parar hilo de RECOGIDA
                    self.socket_video_send.sendto(
                        b'END_RECEPTION',
                        ('localhost', int(self.control.get_video_port())))
                    self.receive_loop.join()

                    #Reinicio de parametros
                    self.boolResetFrame = 1
                    self.fps_recv = 30
                    self.num = 0
                    self.quality_send[0] = 50
                    self.packets_lost_total[0] = 0
                    self.rec_frame = np.array([])

                    #Vaciado del buffer
                    self.buffer_video.empty_buffer()

                    #Reactivar botones
                    self.app.enableButton("Conectar")
                    self.app.disableButton("Espera")
                    self.app.disableButton("Colgar")
                    print("Hilo de recepción de video recogido.")

            #Una vez obtenido el frame entrante, lo reescalamos para que entre en la gui.
            if frame_rec.size != 0:
                frame_rec = cv2.resize(frame_rec, (640, 480))

            #Lo almacenamos
            with self.rec_frame_lock:
                self.rec_frame = frame_rec

            #Actualizamos la pantalla
            self.updateScreen()

            #Pausa el tiempo que quede para mandar a ritmo FPS_recv
            remaining = 1 / self.fps_recv - (time.time() - receive_start_time)
            if (remaining > 0):
                time.sleep(remaining)

        #Fin del hilo: liberar recursos, si los hubiese.

        if (self.boolResetFrame != 1):
            self.boolResetFrame = 1
            self.fps_recv = 30
            self.rec_frame = np.array([])
            self.buffer_video.empty_buffer()
            self.socket_video_send.sendto(
                b'END_RECEPTION',
                ('localhost', int(self.control.get_video_port())))
            self.receive_loop.join()
            print("Hilo de recepción de video recogido.")
        print("Hilo de procesado de video entrante recogido.")

    def updateScreen(self):
        '''
        Nombre: updateScreen
        Descripcion: Con los frames que haya capturado cada hilo (emisor/receptor), los
        pinta en la pantalla.
        '''
        with self.rec_frame_lock:
            frame_rec = self.rec_frame
        with self.cap_frame_lock:
            frame = self.cap_frame

        #Mostrar frame capturado
        if frame_rec.size != 0 and frame.size != 0:
            #Frame pequeno
            frame_mini = cv2.resize(frame, (160, 120))
            frame_compuesto = frame_rec
            frame_compuesto[0:frame_mini.shape[0],
                            0:frame_mini.shape[1]] = frame_mini
            frame = frame_compuesto

        if frame.size != 0:
            cv2_im = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            img_tk = ImageTk.PhotoImage(Image.fromarray(cv2_im))
            with self.update_screen_lock:
                self.app.setImageData("video", img_tk, fmt='PhotoImage')

    # Establece la resolución de la imagen capturada
    def setImageResolution(self, resolution):
        '''
        Nombre: setImageResolution
        Descripcion: Ajusta la resolucion con la que se captura la imagen.
        Argumentos: Resolution en achura x altura
        '''

        resolution = resolution.split('x')

        self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, int(resolution[0]))
        self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, int(resolution[1]))

    def toolbarCallback(self, button):
        '''
        Nombre: toolbarCallback
        Descripcion: Al pulsar un boton de la barra de herramientas se ejecuta.
        Argumentos: button - cadena con el nombre del boton pulsado
        '''
        if button == "FILE":
            f = self.app.openBox(title="Enviar video",
                                 dirName=None,
                                 fileTypes=[('videos', '*.mp4'),
                                            ('videos', '*.avi'),
                                            ('videos', '*.mkv')],
                                 asFile=False)
            if f:
                try:
                    self.cap = cv2.VideoCapture(f)
                except cv2.error:
                    self.app.errorBox("Error abriendo fichero",
                                      "El fichero no es correcto.")
                    return
                self.currently_playing_file = f
                #Acutalizar umbral de FPS
                self.fps_send_max = round(self.cap.get(cv2.CAP_PROP_FPS))
                self.fps_send_min = self.fps_send_max
                self.fps_send = [self.fps_send_max]
        elif button == "CAMERA":
            if self.app.yesNoBox("Activar camara",
                                 "Quieres activar la videocamara?") == True:
                try:
                    self.cap = cv2.VideoCapture(0)
                except cv2.error:
                    self.app.errorBox("Error activando camara",
                                      "No se ha detectado ninguna camara")
                    return
                self.currently_playing_file = None
                #Acutalizar umbral de FPS
                self.fps_send_max = int(self.cap.get(cv2.CAP_PROP_FPS))
                self.fps_send_min = self.fps_send_max // 2
                self.fps_send = [self.fps_send_max]

    def buttonsCallback(self, button):
        '''
        Nombre: buttonsCallback
        Descripcion: Al pulsar un boton se ejecuta.
        Argumentos: button - cadena con el nombre del boton pulsado
        '''
        if button == "Salir":

            #Si esta en llamada se cuelga.
            if self.control.call_status()[0] != None:
                self.buttonsCallback("Colgar")
            # Salimos de la aplicación
            self.app.stop()
        elif button == "Conectar":

            #Hay que poblar la lista de usuarios, segundo plano para no bloquear la UI:
            self.app.thread(self.populate_list)

            #Mostramos la ventana para llamar.
            self.app.showSubWindow("Iniciar llamada")

        elif button == "Colgar":
            ret = self.control.end_call()
            if ret == -1:
                self.app.warningBox("Advertencia.",
                                    "No está en llamada con ningún usuario.")
                return
            if self.control.control_disconnect() != -1:
                self.app.infoBox("Desconexion",
                                 "Ha sido desconectado del destinatario.")

        elif button == "Espera":
            status = self.control.call_status()
            if status[0] == "HOLD1":
                #Ya estamos en espera. Desactivar.
                ret = self.control.set_on_hold(False)
                if ret == 0:
                    self.app.infoBox("Operación correcta.",
                                     "Se ha desactivado el modo espera.")
                else:
                    self.app.warningBox(
                        "Advertencia.",
                        "No se ha podido desactivar el modo espera porque no esta en llamada."
                    )
            elif status[0] != None:
                #Activar
                ret = self.control.set_on_hold(True)
                if ret == 0:
                    self.app.infoBox("Operación correcta.",
                                     "Se ha activado el modo espera.")
                else:
                    self.app.warningBox(
                        "Advertencia.",
                        "No se ha podido desactivar el modo espera porque no esta en llamada."
                    )
            else:
                self.app.warningBox(
                    "Advertencia.",
                    "No se ha podido desactivar el modo espera porque no esta en llamada."
                )

    def init_call(self):
        '''
        Nombre: init_call
        Descripcion: Inicia una llamada con el usuario que se haya indicado en la ventana correspondiente.
        La llamada se iniciara asincronamente para no bloquear el GUI.
        '''
        nick = self.app.getEntry("calleeNickInput")
        self.app.hideSubWindow("Iniciar llamada")
        if nick == self.control.get_username():
            self.app.warningBox("Advertencia",
                                "No puedes llamarte a ti mismo.")
            return
        if nick == None or nick == "":
            self.app.warningBox("Advertencia", "No has introducido usuario.")
            return
        #Para no bloquear la GUI, se llama en un hilo
        self.app.threadCallback(self.control.connect_to, self.call_callback,
                                nick)

    def call_callback(self, ret):
        '''
        Nombre: call_callback
        Descripcion: Se ejecuta cuando la llamada que se estaba intentando iniciar asincronamente devuelve un resultado.
        Arugmentos: ret - resultado del establecimiento de la llamada.
        '''
        #Todas las ventanas de informacion se muestran en segundo plano para no bloquear la GUI.
        if ret == -2:
            self.app.thread(self.app.infoBox, "Usuario ocupado",
                            "El usuario al que llama está ocupado.")
            self.app.enableButton("Conectar")
            self.app.disableButton("Espera")
            self.app.disableButton("Colgar")
        elif ret == -3:
            self.app.thread(self.app.infoBox, "Llamada rechazada",
                            "El usuario indicado rechazó la llamada.")
            self.app.enableButton("Conectar")
            self.app.disableButton("Espera")
            self.app.disableButton("Colgar")
        elif ret == -1:
            self.app.thread(
                self.app.errorBox, "Error durante la llamada",
                "No ha podido establecerse la conexión con el usuario indicado."
            )
            self.app.enableButton("Conectar")
            self.app.disableButton("Espera")
            self.app.disableButton("Colgar")
        else:
            self.app.thread(
                self.app.infoBox, "Conectado",
                "Se ha conectado exitosamente al usuario objetivo.")
            self.app.disableButton("Conectar")
            self.app.enableButton("Espera")
            self.app.enableButton("Colgar")

    def list_handler(self):
        '''
        Nombre: list_handler
        Descripcion: Se ejecuta cuando el usuario seleccione un nick de la lista.
        '''
        #Cuando se pincha en la lista se usa ese nombre para llamar.
        inputs = self.app.getListBox("nicksList")
        if len(inputs) > 0:
            nick = inputs[0]
            self.app.setEntry("calleeNickInput", nick)

    def populate_list(self):
        '''
        Nombre: populate_list
        Descripcion: Funcion pensada para rellenar la lista de usuarios de forma asincrona.
        '''
        #Poblamos la lista de usuarios con los nombres
        users = self.discovery.list_users()
        if users == None:
            print("Error obteniendo listado de usuarios.")
            return

        self.app.updateListBox("nicksList",
                               [e[0] for e in users if len(e) > 0],
                               select=False)
コード例 #5
0
def getNearRecipes(ingredients):
    discovery = Discovery()
    my_query = discovery.query(ingredients)
    return my_query
コード例 #6
0
class CLI:

    conf = Configuration()
    disc = Discovery(conf.getNumberOfHosts(), conf.getSimilarResponses(), conf.getNumberOfHosts())
    dns = None
    arp = Arp()
    PiIP = ""
    ARPresult = False
    thread = None

    mainText = "Enter the number of the method you want to use:\n\
        1. Pi-hole discovery\n\
        2. ARP Poisoning\n\
        3. DNS Poisoning\n\
        4. Exit\n"




    def mainCLI(self):
        while True:
            inp = input(self.mainText)
            if inp.lower().strip() == "1":  # Discovery
                self.discoveryCLI()
            elif inp.lower().strip() == "2":  # ARP Poisoning
                self.ARPCLI()
            elif inp.lower().strip() == "3":  # DNS Poisoning
                self.DNSCLI()
            elif inp.lower().strip() == "4":  # Exit
                print("Quitting...")
                if self.thread is not None:
                    print("   Stopping ARP poisoning")
                    self.thread.stop()
                sys.exit()
            else:  # Error
                print("Please only enter a number 1-4\n")


    # =========================== Discovery ==============================

    def discoveryCLI(self):
        print("You are about to search for the Pi-hole with settings: ")
        print("   DnsQueryTimeout:  {} ms".format(self.conf.getDNSQueryTimeout()))
        print("   SimilarResp:      {}%".format(self.conf.getSimilarResponses()))
        print("   NumberOfHosts:    {}".format(self.conf.getNumberOfHosts()))
        print("   DNSServer:        {}".format(self.conf.getDNSsetting()))
        print("   HostsURL          {}".format(self.conf.getHostsURL()))
        inp = input("Do you want to continue? (Y/n): ")

        if inp.lower().strip() == "y" or inp.lower().strip() == "yes" or len(inp.strip()) == 0:
            print("\n")
            self.PiIP = self.disc.getPi(self.conf.getDNSQueryTimeout(), self.conf.getDNSsetting())
            if not self.PiIP == None:
                print("Pi-hole was found at " + self.PiIP + "\nYou can continue with ARP Poisoning")
            else:
                print("No Pi-hole was found")
            return
        elif inp.lower().strip() == "n" or inp.lower().strip() == "no":
            return
        else:
            print("Invalid answer, please answer Y or N\n")
            self.discoveryCLI()
            return


    # ================================= ARP ====================================

    # For multi-threading
    def ARPPoisoning(self, setting):
        if len(setting) == 2:
            self.arp.poison_all(self.conf.getDNSsetting(), self.PiIP, self.arp.get_dns_mac(self.PiIP))
        else:
            self.arp.poison_all(self.conf.getARPtarget(), self.PiIP, self.arp.get_dns_mac(self.PiIP))


    def ARPCLI(self):
        if self.thread is None:
            if self.PiIP == "" or self.PiIP is None:
                print("IP of the Pi-hole was not set, please run Discovery first.")
                return
            print("You are about to initiate ARP poisoning with settings: ")
            print("   NetworkInterface: " + self.conf.getNetworkInterface())
            setting = '{}'.format(self.conf.getARPtarget())
            if len(setting) == 2:
                print("   ARPtargets: " + self.conf.getDNSsetting())
            else:
                print("   ARPtargets: " + setting)

            print("   ARPdelay:  {} sec".format(self.conf.getARPdelay()))

            inp = input("Do you want to continue? (Y/n): ")

            if inp.lower().strip() == "y" or inp.lower().strip() == "yes" or len(inp.strip()) == 0:

                # ARP poisoning, initial call

                # If target is all hosts on DNS server's subnet
                if len(setting) == 2:
                    print("Performing poisoning on " + self.conf.getDNSsetting())
                    if self.arp.poison_all(self.conf.getDNSsetting(), self.PiIP, self.arp.get_dns_mac(self.PiIP)):
                        self.ARPresult = True

                # Otherwise
                else:
                    print("Performing poisoning on " + self.conf.getARPtarget())
                    if self.arp.poison_all(self.conf.getARPtarget(), self.PiIP, self.arp.get_dns_mac(self.PiIP)):
                        self.ARPresult = True

                if self.ARPresult:
                    print("Pi-hole was successfully poisoned")
                    # ARP poisoning, threading
                    self.thread = RepeatedTimer(self.conf.getARPdelay(), self.ARPPoisoning, setting)
                    self.thread.start()

                    self.mainText = "Enter the number of the method you want to use:\n\
                            1. Pi-hole discovery\n\
                            2. Stop ARP Poisoning\n\
                            3. DNS Poisoning\n\
                            4. Exit\n"
                    return
                else:
                    print("Poisoning was not successful. Please try again.")
                    return
            elif inp.lower().strip() == "n" or inp.lower().strip() == "no":
                return
            else:
                print("Invalid answer, please answer Y or N\n")
                self.ARPCLI()
                return

        # ARP Poisoning already running
        else:
            inp = input("You are about to stop the ARP poisoning, are you sure? (Y/N)")
            if inp.lower().strip() == "y" or inp.lower().strip() == "yes" or len(inp.strip()) == 0:
                # Stop thread and restore ARP tables
                self.thread.stop()
                self.arp.restore_all(self.conf.getARPtarget(), self.PiIP, self.arp.get_dns_mac(self.PiIP))
                self.thread = None
                print("ARP poisoning successfully stopped.")
                self.mainText = "Enter the number of the method you want to use:\n\
                        1. Pi-hole discovery\n\
                        2. ARP Poisoning\n\
                        3. DNS Poisoning\n\
                        4. Exit\n"
                return
            elif inp.lower().strip() == "n" or inp.lower().strip() == "no":
                print("Cancelling...")
                return
            else:
                print("Invalid answer, please answer Y or N\n")
                self.ARPCLI()
                return

    # ================================= DNS ===================================

    def DNSCLI(self):
        if not self.ARPresult:
            print("ARP Poisoning was not completed successfully, please do this first.")
            return
        print("You are about to replace DNS responses of the Pi-hole with settings: ")
        print("   PoisonType:      {}".format(self.conf.getPoisonType()))
        print("   ReplaceIP:       {}".format(self.conf.getReplaceIP()))
        print("   SpoofingTimeout: {}".format(self.conf.getSpoofingTimeout()))
        inp = input("Do you want to continue? (Y/n): ")

        if inp.lower().strip() == "y" or inp.lower().strip() == "yes" or len(inp.strip()) == 0:
            # Ask if we should run in verbose mode
            verbose = input("Do you want to run in verbose mode? (Y/n): ")
            if verbose.lower().strip() == "y" or verbose.lower().strip() == "yes" or len(verbose.strip()) == 0:
                self.dns = Dns(self.PiIP, self.conf.getReplaceIP(), self.conf.getPoisonType(), self.conf.getNetworkInterface(), True)
            else:
                self.dns = Dns(self.PiIP, self.conf.getReplaceIP(), self.conf.getPoisonType(), self.conf.getNetworkInterface(), False)
            print("\n")
            # Start spoofing
            self.dns.poison()
        elif inp.lower().strip() == "n" or inp.lower().strip() == "no":
            return
        else:
            print("Invalid answer, please answer Y or N\n")
            self.DNSCLI()
            return
コード例 #7
0
discovery_configuration_id = "59aca88c-a9c2-4299-a6a2-be7e5e3eea6b"
discovery_environment_id = "67c3f67b-a49f-4156-a795-1ff97ad09e6d"

classifier_id = "ebd15ex229-nlc-54210"

if 'VCAP_SERVICES' in os.environ:
    logging.basicConfig(filename='welcome.log',level=logging.DEBUG)
    logging.info('Using VCAP on remote')
    vcap = json.loads(os.getenv('VCAP_SERVICES'))
    if 'discovery' in vcap:
        discreds = vcap['discovery'][0]['credentials']
        disuser = discreds['username']
        dispassword = discreds['password']
        disurl = discreds['url']
        discovery = Discovery(disurl, disuser, dispassword,
                              discovery_collection_id,
                              discovery_configuration_id,
                              discovery_environment_id)

    if 'natural_language_classifier' in vcap:
        nlccreds = vcap['natural_language_classifier'][0]['credentials']
        nlcuser = nlccreds['username']
        nlcpassword = nlccreds['password']
        nlcurl = nlccreds['url']
        classifier = NLC(nlcurl, nlcuser, nlcpassword, classifier_id)

    if 'speech_to_text' in vcap:
        speechcreds = vcap['speech_to_text'][0]['credentials']
        speechuser = speechcreds['username']
        speechpassword = speechcreds['password']
        speechurl = speechcreds['url']
        Speech = Speech_to_text(speechurl, speechuser, speechpassword)
コード例 #8
0
print '------->', total_num

# load results from discovery
discovery = pickle.load(open('discovery.fits'))
discovery_freq = {} 
discovery_omega = {}
for k in discovery.keys():
    discovery_freq[k] = np.array(discovery[k])/fleet_size
    discovery_omega[k] = (np.array(discovery[k])/fleet_size)*41253*(1./8)
pickle.dump(discovery_freq, open('discovery_freq.fits', 'w'))
pickle.dump(discovery_omega, open('discovery_omega.fits', 'w'))
    
# have to do another discovery step to get the count of the number of detections 
discovered = []
count_unique = []
det3, count3, missing = Discovery(p9, 3, magthresh=99., discovered=discovered, count_unique=count_unique)

# collect and plot statistics
fig, ax1 = plt.subplots(figsize=(12,8))
ax1.plot(range(3,8), np.array(discovery['mag99.0'])/fleet_size, label='Bright limit', \
         color='k', linewidth=3, zorder=6)
ax1.plot(range(3,8), np.array(discovery['mag22.5'])/fleet_size, label='Magnitude 22.5', \
         color='b', linewidth=3, zorder=5)
ax1.plot(range(3,8), np.array(discovery['mag23.0'])/fleet_size, label='Magnitude 23.0', \
         color='g', linewidth=3, zorder=4)
ax1.plot(range(3,8), np.array(discovery['mag23.5'])/fleet_size, label='Magnitude 23.5', \
         color='orange', linewidth=3, zorder=3)
ax1.plot(range(3,8), np.array(discovery['mag24.0'])/fleet_size, label='Magnitude 24.0', \
         color='r', linewidth=3, zorder=2)
ax1.plot(range(3,8), np.array(discovery['mag24.5'])/fleet_size, label='Magnitude 24.5', \
         color='m', linewidth=3, zorder=1)
コード例 #9
0
# perform calculation of objects with minimum unique (different date) detections >= (3,4,5,6,7)
# and different mag thresholds for each

discovery_dict = {} # collect discovery statistics
missing_exp_dict = {} # used to collect exposures that don't have point-source stats


fleet_size = 29388.
start = timeit.default_timer()
for m in np.append([99.], np.arange(22.5,25,.5)):
    discovery_dict['mag%.1f'%m] = []
    for i in range(3,8):
        discovered = []  # can probably get rid of this
        count_unique = [] # this too
        print 'det = ', i, '|',  'mag = ', m
        # do the discovery step 
        det, count, missing_exp = Discovery(p9, i, magthresh=m, discovered=discovered, 
                                            count_unique=count_unique)
        discovery_dict['mag%.1f'%m].append(len(det))
        missing_exp_dict['mag%.1f-det%d'%(m,i)] = np.array(missing_exp)
        end = timeit.default_timer()
        print 'time: %.1f s' %(end - start)

# save dictionary to file --> plotting in different script
pickle.dump(discovery_dict, open('discovery.fits', 'w'))
pickle.dump(missing_exp_dict, open('missing_exposures.fits', 'w'))



コード例 #10
0
ファイル: replicator.py プロジェクト: debben/RepPREP
                # probably got disconnected
                break
        self.stop()

    def stop(self):
        """Stop copying"""
        self.log.debug('stopping')
        if self.alive:
            self.alive = False
            self.thread_read.join()
            self.thread_poll.join()



#configure the network discovery listener
listener = Discovery(5225)
listener.start()

ADDR = ('',5225)
BUFFSIZE = 4096



'''
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)

server.listen(1)
print "Awaiting connection..."
conn, addr = server.accept()
print 'got connection from ', addr[0]
コード例 #11
0
ファイル: fuzz.py プロジェクト: jimmymdugan/fuzzer
    def parse_args(self):
        parser = argparse.ArgumentParser()
        parser.add_argument("run_option",
                            help='Keyword to specify discovery command')
        parser.add_argument("discover_url",
                            help="Specify the base url to find DVWA")
        parser.add_argument("--custom-auth",
                            help="Specify the custom-auth, --custom-auth=dvwa")
        parser.add_argument(
            "--common-words",
            help="Specify the common words file, --common-words=file")
        parser.add_argument(
            "--extensions",
            help="Specify the extensions file, --extensions=file")
        parser.add_argument(
            "--sensitive", help="Specify the sensitive file, --sensitive=file")
        parser.add_argument("--vectors",
                            help="Specify the vectors file, --vectors=file")
        parser.add_argument(
            "--sanitized-chars",
            help="Specify the sanitized chars file, --sanitized-chars=file")
        parser.add_argument("--slow", help="Timeout delay value, --slow=10")
        args = parser.parse_args()
        parser.parse_args()

        if args.run_option and args.discover_url:
            self.base_url = args.discover_url

        if args.custom_auth == 'dvwa':
            auth = Auth(path=self.base_url, browser=self.browser)
            self.browser = auth.dvwa_setup()

        if args.run_option == 'discover' and args.common_words and args.extensions:
            discover = Discovery(path=self.base_url,
                                 browser=self.browser,
                                 words=self.words,
                                 extensions=self.extensions)
            discover.guess_pages()
            discover.discover_page()
            discover.find_page_inputs()
            discover.print_output()

        if args.run_option == 'test' and args.sensitive and args.vectors:
            timeout = int(args.slow) if args.slow else 0
            discover = Discovery(path=self.base_url,
                                 browser=self.browser,
                                 words=self.words,
                                 extensions=self.extensions)
            discover.discover_page()
            discover.find_page_inputs()
            titles = discover.page_titles
            url_params = discover.page_url_inputs
            sanitized_chars = self.sanitized_chars if args.sanitized_chars else [
                '<', '>'
            ]
            test = Test(browser=self.browser,
                        vectors=self.vectors,
                        sensitive=self.sensitive,
                        timeout=timeout,
                        status_codes=self.status_codes,
                        discovered_urls=discover.discovered_links,
                        sanitized_chars=sanitized_chars,
                        page_titles=titles,
                        url_params=url_params)
            test.test_page_forms()
            test.print_results()