Script Python3 pour l'approvisionnement de masse ont pour Huawei OLT en utilisant Telnet

10 0 0 0

Ce script a été développé pour fournir un moyen facile de provisionner ont pour huawei olt, par défaut il ajoutera un ont en mode bridge, quelques variables qui définissent la configuration par défaut de l'olt.

À la définition principale, vous pouvez trouver les variables suivantes:

user = 'root' # The login for telnet password = 'admin' # Password for telnet frame = '0' #Default frame of OLT name_srvprofile = 'ONT_BRIDGE' # The name of service profile of OLT for bridge name_lineprofile = 'ONT_BRIDGE' # The name of line profile of OLT for bridge vlan = '1001' # VLAN of communication with the ONT and router, (all ont ports are untagged) number_lanports = 4 (Max number of lan ports of ont) gemport = '0' # Default gem port number of profile traffic_table = '6' # Default traffic-table of Huawei OLT (6 = no bandwith controll) debug = False # Debug disable by default

Le fichier .csv suit la structure du fichier example.csv. Nous avons d'abord la morue de costumer, suivie du nom et du numéro ont.

Exemple d'utilisation: python3 huawei_provisioning.py -o 192.168.155.3 -s3 -p15 -f example.csv


Nous pouvons rendre ce fichier beau et consultable si cette erreur est corrigée: Aucune virgule trouvée dans ce fichier CSV à la ligne 0.

Example.csv

5586; NOM DU CLIENT A; 485754438E45668B

5587; NOM DU CLIENT B; 4857544352057B52

5588; NOM DU CLIENT C; 4857544352057B53


huawei_provisioning.py

# ! / usr / bin / python3

# #

# # Script de provisioning bridge ONT vers Huawei OLT

# # Leandro Fabris Milani - sept. 2018

# #

# # Utilisation: python3 huawei_provisioning.py -o 10.126.126.94 -s0 -p15 -f file.csv

importer sys

temps d' importation

importer telnetlib

importer getopt

importer l' adresse IP

importer os

temps d' importation



def printUsage ():

print ( " Utilisation: huawei_provisioning.py -o <oltip> -s <slot> -p <pon> -f <file> \ n Utilisez -h pour l'aide (--help) ou -d (--debug) pour le débogage mode. \ n " )



def validateIP ( ip ):

essayez :

ipaddress.ip_address (ip)

sauf ValueError :

retourner Faux

sinon :

return True



def validateNumber ( nombre ):

essayez :

entier = int (nombre)

sauf ValueError :

retourner Faux

sinon :

return True



def getOnuID ( tn , série ):

tn.write ( " afficher sur info by-sn " .encode ( ' utf-8 ' ) + serial.encode ( ' utf-8 ' ) + b " \ n \ n " )

time.sleep ( .3 )

return_onuid = tn.read_until ( ' Control flag ' .encode ( ' utf-8 ' ), 3 ) .decode ( ' utf-8 ' )

dados_arq = return_onuid.splitlines ()

pour linha dans dados_arq:

si " ONT-ID " dans linha:

str_onuid = linha.split ( ' : ' )

onu_id = str_onuid [ 1 ] .lstrip (). rstrip ( ' \ r ' )

tn.write ( b " q \ n " )

time.sleep ( .3 )

return onu_id

elif " Failure " à linha:

print (linha.lstrip () + ' --- Serial: ' + serial)

tn.write ( b " q \ n " )

time.sleep ( .3 )

retourner Faux



def getLineProfileId ( tn , name_lineprofile ):

tn.write ( " display ont-lineprofile gpon profile-name " .encode ( ' utf-8 ' ) + name_lineprofile.encode ( ' utf-8 ' ) + b " \ n \ n " )

time.sleep ( .3 )

return_lineid = tn.read_until ( ' Profile-name ' .encode ( ' utf-8 ' ), 3 ) .decode ( ' utf-8 ' )

data_return = return_lineid.splitlines ()

pour la ligne dans data_return:

si " Profile-ID " en ligne:

str_onuid = line.split ( ' : ' )

line_id = str_onuid [ 1 ] .lstrip (). rstrip ( ' \ r ' )

tn.write ( b " q \ n " )

time.sleep ( .3 )

return line_id

elif " Échec " en ligne:

print (line.lstrip ())

tn.write ( b " q \ n " )

time.sleep ( .3 )

sys.exit ()



def getServiceProfileId ( tn , name_srvprofile ):

tn.write ( " display ont-srvprofile gpon profile-name " .encode ( ' utf-8 ' ) + name_srvprofile.encode ( ' utf-8 ' ) + b " \ n \ n " )

time.sleep ( .3 )

return_lineid = tn.read_until ( ' Profile-name ' .encode ( ' utf-8 ' ), 3 ) .decode ( ' utf-8 ' )

data_return = return_lineid.splitlines ()

pour la ligne dans data_return:

si " Profile-ID " en ligne:

str_onuid = line.split ( ' : ' )

line_id = str_onuid [ 1 ] .lstrip (). rstrip ( ' \ r ' )

tn.write ( b " q \ n " )

time.sleep ( .3 )

return line_id

elif " Échec " en ligne:

print (line.lstrip ())

tn.write ( b " q \ n " )

time.sleep ( .3 )

sys.exit ()



def importFile ( fichier ):

essayez :

arq = open ( fichier , ' r ' )

sauf OSError :

print ( ' Erreur d'ouverture du fichier ' )

sys.exit ()

sinon :

linhas = arq.readlines ()

arq.close ()

retour linhas



def authOnt ( ip , slot , pon , file , debug , user , password , frame , name_srvprofile , name_lineprofile , vlan , number_lanports , gemport , traffic_table ):

print ( ' Connexion à olt {0} ' .format (ip))

essayez :

tn = telnetlib.Telnet (ip, 23 , 10 )

sauf exception comme e:

imprimer ( " Erro se connecte à OLT, veuillez vérifier l'adresse IP " )

sys.exit ()



si débogage:

tn.set_debuglevel ( 100 )



tn.read_until ( b " nom: " )

tn.write (user.encode ( ' utf-8 ' ) + b " \ n " )

time.sleep ( .3 )

tn.read_until ( b " mot de passe: " )

tn.write (password.encode ( ' utf-8 ' ) + b " \ n " )

time.sleep ( .3 )



tn.write ( b " activer \ n " )

time.sleep ( .3 )

tn.write ( b " config \ n " )

time.sleep ( .3 )



srvprofile = getServiceProfileId (tn, name_srvprofile)

lineprofile = getLineProfileId (tn, name_lineprofile)



# Ouvrez le fichier .csv et commencez à configurer

arquivo = importFile ( fichier )

pour linha in arquivo:

parte = linha.split ( ' ; ' )

cod = parte [ 0 ] .rstrip ()

nome = parte [ 1 ] .rstrip ()

serial = parte [ 2 ] .rstrip (). upper ()

descricao = ' C ' + cod + ' - ' + nome.replace ( ' ' , ' _ ' ) .upper ()



imprimer ( " --- " )



print ( ' Numéro de carte d'ouverture {0} / {1} ... ' .format (cadre, fente))

tn.write ( " interface gpon " .encode ( ' utf-8 ' ) + frame.encode ( ' utf-8 ' ) + " / " .encode ( ' utf-8 ' ) + slot.encode ( ' utf-8 ' ) + b " \ n " )

time.sleep ( .3 )



print ( ' Ajout d'ONT au numéro PON {0} ' .format (pon))

tn.write ( " ont add " .encode ( ' utf-8 ' ) + pon.encode ( ' utf-8 ' ) + " sn-auth \" " .encode ( ' utf-8 ' ) + serial.encode ( ' utf-8 ' ) + " \" omci ont-lineprofile-id " .encode ( ' utf-8 ' ) + lineprofile.encode ( ' utf-8 ' ) + " ont-srvprofile-id " .encode ( ' utf -8 ' ) + srvprofile.encode ( ' utf-8 ' ) + " desc \" " .encode ( ' utf-8 ' ) + descricao.encode ( ' utf-8 ' ) + b " \ " \ n \ n " )

time.sleep ( .3 )

tn.write ( b " quitter \ n " )

time.sleep ( .3 )



# Trouver l'id de l'ont

print ( ' Recherche de l'identifiant ONT ... ' )

si getOnuID (tn, série):

onu_id = getOnuID (tn, série)

sinon :

continuer



# Ouvrez à nouveau l'interface gpon

tn.write ( " interface gpon 0 / " .encode ( ' utf-8 ' ) + slot.encode ( ' utf-8 ' ) + b " \ n " )

time.sleep ( .3 )



# Appliquer le perfil d'alarme sur l'ont

imprimer ( ' Application d'un profil d'alarme ... ' )

tn.write ( " ont alarm-profile " .encode ( ' utf-8 ' ) + pon.encode ( ' utf-8 ' ) + " " .encode ( ' utf-8 ' ) + onu_id.encode ( ' utf- 8 ' ) + b " id-profil 1 \ n " )

time.sleep ( .3 )

tn.write ( " ont optique-alarm-profile " .encode ( ' utf-8 ' ) + pon.encode ( ' utf-8 ' ) + " " .encode ( ' utf-8 ' ) + onu_id.encode ( ' utf-8 ' ) + b " id-profil 1 \ n " )

time.sleep ( 1 )



# Appliquer vlan aux ports ont

print ( ' Application de vlan sur les ports lan ... ' )

pour le port dans la plage ( 1 , number_lanports + 1 ):

tn.write ( " ont port native-vlan " .encode ( ' utf-8 ' ) + pon.encode ( ' utf-8 ' ) + " " .encode ( ' utf-8 ' ) + onu_id.encode ( ' utf -8 ' ) + " eth " .encode ( ' utf-8 ' ) + str (port) .encode ( ' utf-8 ' ) + " vlan " .encode ( ' utf-8 ' ) + vlan.encode ( ' utf-8 ' ) + b " priorité 0 \ n " )

time.sleep ( 1 )

tn.write ( b " quitter \ n " )

time.sleep ( 1 )



# Appliquer le port de service à l'ont

print ( ' Application du port de service ... ' )

tn.write ( " service-port vlan " .encode ( ' utf-8 ' ) + vlan.encode ( ' utf-8 ' ) + " gpon " .encode ( ' utf-8 ' ) + frame.encode ( ' utf -8 ' ) + " / " .encode ( ' utf-8 ' ) + slot.encode ( ' utf-8 ' ) + " / " .encode ( ' utf-8 ' ) + pon.encode ( ' utf-8 ' ) + " ont " .encode ( ' utf-8 ' ) + onu_id.encode ( ' utf-8 ' ) + " gemport " .encode ( ' utf-8 ' ) + gemport.encode ( ' utf-8 ' ) + " multi-services user-vlan " .encode ( ' utf-8 ' ) + vlan.encode ( ' utf-8 ' ) + " tag-transform translate inbound traffic-table index " .encode ( ' utf-8 ' ) + traffic_table.encode ( ' utf-8 ' ) + " index de table de trafic sortant " .encode ( ' utf-8 ' ) + traffic_table.encode ( ' utf-8 ' ) + b " \ n " )



print ( ' Success ONT: {0} Serial: {1} ' .format (descricao, serial))

time.sleep ( 2 )



# Connexion étroite à l'OLT

tn.write ( b " quitter \ n " )

time.sleep ( .3 )

tn.write ( b " quitter \ n " )

time.sleep ( .3 )

tn.write ( b " quitter \ n " )

time.sleep ( .3 )

tn.write ( " y " .encode ( ' utf-8 ' ) + b " \ n " )

time.sleep ( .3 )

tn.close ()



def main ( argv ):

si sys.version_info [ 0 ] < 3 :

lever une exception ( " Python 3 ou une version plus récente est requise. " )



start_time = time.time ()



# Variables par défaut pour la configuration OLT

user = ' root '

mot de passe = ' admin '

frame = ' 0 '

name_srvprofile = ' ONT_BRIDGE '

name_lineprofile = ' ONT_BRIDGE '

vlan = ' 1001 '

number_lanports = 4

gemport = ' 0 '

traffic_table = ' 6 '

debug = False



essayez :

opts, args = getopt.getopt (argv, " o: s: p: f: hd " , [ " olt = " , " slot = " , " pon = " , " file = " , " help " , " debug " ])

sauf getopt.GetoptError:

printUsage ()

sys.exit ( 2 )



sinon opte:

printUsage ()

sys.exit ()



pour opt, arg dans opts:

si vous acceptez ( " -h " , " --help " ):

printUsage ()

sys.exit ()



elif opt in ( " -d " , " --debug " ):

debug = True



elif opt in ( " -o " , " --olt " ):

si validateIP (arg):

ip = arg

sinon :

imprimer ( ' adresse IP invalide ' )

sys.exit ()



elif opt in ( " -s " , " --slot " ):

si validateNumber (arg):

slot = arg

sinon :

print ( ' Slot doit être un nombre ' )

sys.exit ()



elif opt in ( " -p " , " --pon " ):

si validateNumber (arg):

pon = arg

sinon :

print ( ' Pon doit être un nombre ' )

sys.exit ()



elif opt in ( " -f " , " --file " ):

si os.path.isfile (arg):

file = arg

sinon :

imprimer ( ' Fichier inconnu ' )

sys.exit ()



authOnt (ip, slot, pon, file , debug, user, password, frame, name_srvprofile, name_lineprofile, vlan, number_lanports, gemport, traffic_table)



imprimer ( " --- " )

print ( " Fin du script! \ n Temps écoulé: % s secondes " % (time.time () - start_time))



si __name__ == " __main__ " :

main (sys.argv [ 1 :])


Cordialement!



  • x
  • Standard:

Commentaire

envoyer
Connectez-vous pour répondre. Se connecter | Enregistrer

Remarque Remarque : Afin de protéger vos droits et intérêts légitimes, ceux de la communauté et des tiers, ne divulguez aucun contenu qui pourrait présenter des risques juridiques pour toutes les parties. Le contenu interdit comprend, sans toutefois s'y limiter, le contenu politiquement sensible, le contenu lié à la pornographie, aux jeux d'argent, à l'abus et au trafic de drogues, le contenu qui peut divulguer ou enfreindre la propriété intellectuelle d'autrui, y compris les secrets professionnels, les marques commerciales, les droits d'auteur et les brevets, ainsi que la vie privée personnelle. Ne partagez pas votre nom d'utilisateur ou votre mot de passe avec d'autres personnes. Toutes les opérations effectuées à partir de votre compte seront considérées comme vos propres actions, et toutes les conséquences en découlant vous seront imputées. Pour plus de détails, voir « Politique de confidentialité ».
Si le bouton de la pièce-jointe n'est pas disponible, mettez à jour Adobe Flash Player à la dernière version.
Connectez-vous pour participer à la communication et au partage

Connectez-vous pour participer à la communication et au partage

S'identifier