1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| #!/usr/bin/python
# -*- coding: utf-8 -*-
# Importation des modules
import sys
import argparse
import getopt
import threading
import socket
import urllib2
import requests
# Déclaration des variables
SCRIPT = __file__
HOST = ''
PORT = ''
ROKU_GENERAL_XML = "/home/maint/Bureau/SCRIPTS/roku_general.xml"
# Fonction affichant le menu d'aide
def usage():
# Création d'un parser avec description et epilogue pour un exemple
parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
description="Parameters required for " + SCRIPT + " script...",
epilog="Example :\npython " + SCRIPT + " -s 192.168.1.1 -p 8000\r\n\r\n")
# Ajout des arguments possibles
parser.add_argument('-s', '--src-ip', action = 'store_true', help='Source IP address')
parser.add_argument("-p", '--src-port', action = 'store_true', help="Source port")
# On parse les arguments
args = parser.parse_args()
# On affiche le résultat
print(args.echo)
# Fonction validant les paramètres d'entrée
def check_arguments(argv):
# Récupération des variables globales
global HOST
global PORT
# Gestion d'erreur
try :
opts, args = getopt.getopt(argv,"h:s:p:", ["help", "src-ip=", "src-port="])
except getopt.GetoptError :
usage()
sys.exit(2)
# Sauvegarde des paramètres
for opt, arg in opts :
if opt in ('-h', '--help'):
usage()
sys.exit(2)
elif opt in ('-s', '--src-ip'):
HOST = arg
elif opt in ('-p', '--src-port'):
PORT = int(arg)
# Vérification qu'aucun des paramètres ne soit vide
if HOST == "" or PORT == "" :
if HOST == "" :
print "\nAddresse IP d'écoute non renseignée...\n"
if PORT == "" :
print "\nPort d'écoute non renseigné...\n"
sys.exit(2)
# Déclaration de la classe
class ClientThread(threading.Thread):
# Objet thread gérant la réception des nouvelles connexions
def __init__(self, ip, port, clientsocket):
threading.Thread.__init__(self)
self.ip = ip
self.port = port
self.clientsocket = clientsocket
print ("Connexion entrante depuis %s sur son port %s" % (self.ip, self.port, ))
# Réponse du serveur
def run(self):
# Importation du fichier GENERAL ROKU XML
data_xml = open(r'/home/maint/Bureau/SCRIPTS/roku_general.xml','r').read()
# Création du Header
HEADERS = { 'Server': 'Roku UPnP/1.0 Roku/9.1.0',\
'Cache-Control': 'no-cache',\
'Content-Type': 'text/xml; charset="utf-8"'
}
# Envoi de la réponse
response = requests.post('http://192.168.8.108:8060/', data = data_xml, headers = HEADERS)
print response.text
# Déconnexion du client
print ("Déconnexion du client %s..." % (self.ip))
# Démarrage du programme
if __name__ == "__main__":
# Validation des paramètres d'entrée
check_arguments(sys.argv[1:])
# Création d'une socket TCP IPV4
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Ajout de l'option SO_REUSEADDR afin de rendre immédiatement le port disponible après utilisation
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# On bind la socket sur l'IP et PORT demandés
tcpsock.bind((HOST,PORT))
# Bloucle continue
while True:
# Ecoute avec une file d'attente maximale de 5 connexions
tcpsock.listen(5)
# Accepte la connexion, en récupérant les informations de l'émetteur
(clientsocket, (ip, port)) = tcpsock.accept()
# Vérification du type de la requête
data = clientsocket.recv(1024)
if ("GET / HTTP/1.1" in str(data) and ("Host: " + HOST + ":" + str(PORT)) in str(data)) or ("GET /query/apps HTTP/1.1" in str(data) and ("Host: " + HOST + ":" + str(PORT)) in str(data)) :
# Message d'information
print "Requête acceptée"
# Création de l'objet thread pour gérer la connexion
newthread = ClientThread(ip, port, clientsocket)
newthread.start() |
Partager