рдЬреЗрд╡реНрд╣рд╛ рдореА рдпрд╛ рдХрдВрдкрдиреАрд╕рд╛рдареА рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд▓реЛ, рддреЗрд╡реНрд╣рд╛ рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдЖрдзреАрдЪ рдХрд╛рд╣реА IP рдЙрдкрдХрд░рдгрд╛рдВрдЪрд╛ рдбреЗрдЯрд╛рдмреЗрд╕, рддрд╛рд░рд╛рдВрдХрди рдЕрд╕рд▓реЗрд▓реЗ рдЕрдиреЗрдХ рд╕рд░реНрд╡реНрд╣рд░ рдЖрдгрд┐ рдлреНрд░реАрдмреАрдкреАрдПрдХреНрд╕рдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдкреЕрдЪ рд╣реЛрддреЗ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдПрдирд╛рд▓реЙрдЧ рдкреАрдмреАрдПрдХреНрд╕ рд╕реЕрдорд╕рдВрдЧ рдЖрдпрдбреАрд╕реАрдПрд╕ 500 рд╕рдорд╛рдВрддрд░рдкрдгреЗ рдХрд╛рд░реНрдп рдХреЗрд▓реЗ рдЖрдгрд┐ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдХрдВрдкрдиреАрддреАрд▓ рдореБрдЦреНрдп рд╕рдВрдкреНрд░реЗрд╖рдг рдкреНрд░рдгрд╛рд▓реА рд╣реЛрддреА; рдЖрдпрдкреА рдЯреЗрд▓рд┐рдлреЛрдиреА рдХреЗрд╡рд│ рд╡рд┐рдХреНрд░реА рд╡рд┐рднрд╛рдЧрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдп рдХрд░рддреЗ. рдЖрдгрд┐ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЕрд╕реЗрдЪ рд╢рд┐рдЬрдд рд░рд╛рд╣рд┐рд▓реЗ рдЕрд╕рддреЗ, рдкрд░рдВрддреБ рдПрдХрд╛ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рджрд┐рд╡рд╢реА рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдЖрдпрдкреА рдЯреЗрд▓рд┐рдлреЛрдиреАрд╡рд░ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╣реБрдХреВрдо рджреЗрдгреНрдпрд╛рдд рдЖрд▓рд╛, рдореБрджрддреА рдорд╛рдиреНрдп рдХреЗрд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛, рдЙрдкрдХрд░рдгреЗ рдЦрд░реЗрджреА рдХреЗрд▓реА рдЧреЗрд▓реА рдЖрдгрд┐ 21 рд╡реНрдпрд╛ рд╢рддрдХрд╛рдд рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЭ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдпреЛрдЬрдирд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реА рдЬрд╛рдК рд▓рд╛рдЧрд▓реА.
рдЕрд╢рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рдкрд╣рд┐рд▓реА рдЧреЛрд╖реНрдЯ рдЬреА рдХрд╛рд│рдЬреА рдХрд░реВ рд▓рд╛рдЧрддреЗ рддреА рдореНрд╣рдгрдЬреЗ рдЭрдкрд╛рдЯреНрдпрд╛рдиреЗ рд╡рд╛рдврдгрд╛рд▒реНрдпрд╛ рдЯреЗрд▓рд┐рдлреЛрди рд╕рдВрдЪрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЬреНрдпрд╛рдВрдирд╛ рдХрд╕реЗ рддрд░реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рджреБрд╕рд░реА рдЧреЛрд╖реНрдЯ рдЬреА рдЦреВрдк рдЪрд┐рдВрддрд╛рдЬрдирдХ рд╣реЛрддреА рддреА рдореНрд╣рдгрдЬреЗ рдлреЛрди рдмреБрдХ. рдЬрд░ рдПрдВрдбрдкреЙрдИрдВрдЯ рдореЕрдиреЗрдЬрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд╣рд┐рд▓реНрдпрд╛рдордзреНрдпреЗ рдорджрдд рдХрд░реВ рд╢рдХрд▓рд╛ (рдЬреЗ, рддрд╕реЗ, рдлреНрд░реАрдкреАрдмреАрдПрдХреНрд╕рдЪреНрдпрд╛ рдирд╡реАрдирддрдо рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдордзреВрди рдХрд╛рдкрд▓реЗ рдЧреЗрд▓реЗ), рддрд░ рдкреБрд╕реНрддрдХрд╛рдд рдХрд╛рд╣реА рдкреНрд░рд╢реНрди рдЙрджреНрднрд╡рд▓реЗ:
- рдкреНрд░рдердо, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреЗ рд╕реНрдерд╛рди/рддрд░рд▓рддрд╛ рд╕рддрдд рдмрджрд▓рдд рдЕрд╕рддрд╛рдирд╛ рддреНрдпрд╛рдЪреА рдЕрдЪреВрдХрддрд╛ рдХрд╢реА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рд╛рд╡реА?
- рджреБрд╕рд░реЗ рдореНрд╣рдгрдЬреЗ, рдлреЛрди рдкреВрд░реНрдгрдкрдгреЗ рд╡реИрдпрдХреНтАНрддрд┐рдХ рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ. рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╕рдВрдкрд░реНрдХрд╛рдЪреЗ рдирд╛рд╡ рднрд░рд╛рдпрдЪреЗ рдирд╛рд╣реА?
рд╕рдорд╕реНрдпрд╛ рдордиреЛрд░рдВрдЬрдХ рд╣реЛрддреА, рд╕рдорд╛рдзрд╛рди рдпреЗрдгреНрдпрд╛рд╕ рд╡реЗрд│ рд▓рд╛рдЧрд▓рд╛ рдирд╛рд╣реА. рдЖрддрд╛ рдореА рд╕рдВрдкреВрд░реНрдг рдпрд╛рджреА рджреЗрдИрди, рдЖрдгрд┐ рдирдВрддрд░ рдЖрдореНрд╣реА рддреЗ рдХреНрд░рдорд╛рдиреЗ рдкрд╛рд╣реВ.
from scapy.all import sniff
from scapy.layers.inet import IP
import mysql.connector
import ldap
import getpass
import tftpy
import requests
import os
import time
from string import replace
def conn_ldap(login):
ad = ldap.initialize('ldap://***.local')
ad.simple_bind_s('voip@***.local', 'password')
basedn = 'OU=IT,DC=***,DC=LOCAL'
basedn_user = 'OU=***,OU=***,DC=***,DC=LOCAL'
scope = ldap.SCOPE_SUBTREE
filterexp = "(&(sAMAccountName=" + login + ")(ObjectClass=person))"
filterexp2 = "(&(ObjectClass=organizationUnit))"
attrlist = ['cn']
attrlist2 = ['OU']
search = ad.search_s(basedn, scope, filterexp, attrlist)
adname = search[0][1]['cn'][0].decode('utf-8')
if adname == ' ':
search = ad.search_s(basedn_user, scope, filterexp2, attrlist2)
for i in range(1, len(search)+1):
group = search[i][1]['ou'][0]
basedn_user2 = 'OU='+group+','+basedn_user
search = ad.search_s(basedn_user2, scope, filterexp, attrlist)
adname = search[0][1]['cn'][0].decode('utf-8')
if adname != ' ':
return adname
adname = search[0][1]['cn'][0].decode('utf-8')
ad.unbind_s()
return adname
def tftp_file_change(config,place,adname,current_account,current_account_password):
client = tftpy.TftpClient("192.168.0.3", 69)
client.download('template.cfg', place)
fileread = open(place, 'r')
line = fileread.readlines()
fileread.close()
line[5] = (('account.1.label = ').encode('utf-8') + adname.encode('utf-8') + 'n')
line[2] = (('account.1.auth_name = ').encode('utf-8') + current_account.encode('utf-8') + 'n')
line[3] = (('account.1.display_name = ').encode('utf-8') + current_account.encode('utf-8') + 'n')
line[6] = (('account.1.password = ').encode('utf-8') + current_account_password[0][0] + 'n')
filewrite = open(place, 'w')
for i in line:
filewrite.write(i)
filewrite.close()
print place
print config
client.upload(config,place)
def get_phone_inform(ipaddr):
fileconf = requests.get('http://admin:admin@'+ipaddr+'/servlet?phonecfg=get[&accounts=1]')
conf = fileconf.text.split('|')
current_account = conf[2]
return current_account
def sniff_frame():
pcapf = sniff(count=1, timeout=70, filter="dst host 192.168.0.3 and port 5060")
if len(pcapf) == 0:
exit()
frame = pcapf[0]
macaddr = frame.src
print macaddr[:8]
if macaddr[:8] != '80:5e:c0':
exit()
ipaddr = frame[0][IP].src
return macaddr, ipaddr
def conn_mysql(query,fquery,macaddr,qwery2):
connect = mysql.connector.connect(host='192.168.0.3', database='voip', user='voip_wr', password='***')
cursor = connect.cursor()
cursor.execute(fquery)
state = cursor.fetchall()
state = bool(state[0][0])
if state == True:
cursor.execute(qwery2)
connect.commit()
connect.close()
else:
cursor.execute(query)
connect.commit()
connect.close()
def check_account(current_account):
connect = mysql.connector.connect(host='192.168.0.3', database='asterisk', user='voip_wr', password='***')
cursor = connect.cursor()
qwery = 'select data from sip where id=' + current_account + ' and keyword="secret";'
cursor.execute(qwery)
password = cursor.fetchall()
if password == ' ':
exit()
else:
return password
if __name__ == '__main__':
macaddr, ipaddr = sniff_frame()
current_account = get_phone_inform(ipaddr)
current_account_password = check_account(current_account)
macaddr = macaddr.replace(':', '')
ipaddr = ipaddr.decode('utf-8')
adname = conn_ldap(getpass.getuser())
query = 'INSERT INTO station (mac, ip, name, number) VALUES (' + '"' + macaddr + '",' + '"' + ipaddr + '",' + '"' + adname + '",' + '"' + get_phone_inform(ipaddr) + '"' + ')'
qwery2 = 'UPDATE station SET ip=' + '"' + ipaddr + '"' + ', name=' + '"' + adname + '"' + ', number=' + '"' + get_phone_inform(ipaddr) + '"' + ' WHERE mac=' + '"' + macaddr + '"'
fquery = 'SELECT EXISTS(SELECT mac FROM voip.station WHERE mac=' + '"' + macaddr + '")'
query = query.encode('utf-8')
fquery = fquery.encode('utf-8')
config = macaddr + '.cfg'
place = os.path.expanduser("~") + "" + "AppDataLocal" + config
conn_mysql(query,fquery,macaddr,qwery2)
tftp_file_change(config,place,adname,current_account,current_account_password)
requests.get('http://admin:admin@'+ipaddr+'/cgi-bin/ConfigManApp.com?key=AutoP')
requests.get('http://admin:admin@'+ipaddr+'/cgi-bin/ConfigManApp.com?key=Reboot')
рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рд╕рдВрдЧрдгрдХрд╛рд╡рд░ рдЪрд╛рд▓рддреЛ рдЖрдгрд┐ рд╕рдВрдЧрдгрдХ рдлреЛрдирджреНрд╡рд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХрд╢реА рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗрд▓рд╛ рдЕрд╕рд▓реНрдпрд╛рд╕ рдХрд╛рд░реНрдп рдХрд░рддреЛ, рдХрд╛рд░рдг Yealink T19 рдЧреЗрдЯрд╡реЗ рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА.
рдкреНрд░рдердо, рдЖрдкрдг рддреЗ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ? рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ рдлреЛрдирдордзреНрдпреЗ рдХрд╛рдп рдореЕрдХ рдЖрдгрд┐ рдЖрдпрдкреА рдЖрд╣реЗ.
def sniff_frame():
pcapf = sniff(count=1, timeout=70, filter="dst host 192.168.0.3 and port 5060")
if len(pcapf) == 0:
exit()
frame = pcapf[0]
macaddr = frame.src
print macaddr[:8]
if macaddr[:8] != '80:5e:c0':
exit()
ipaddr = frame[0][IP].src
return macaddr, ipaddr
рдпреЗрдереЗ рдЖрдореНрд╣реА рд╕реНрдХреЕрдкреА рдлреНрд░реЗрдорд╡рд░реНрдХрдордзреВрди рд╕реНрдирд┐рдл рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рддреЛ, рддреНрдпрд╛рдЪреНрдпрд╛ рдорджрддреАрдиреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд udp рдкреЕрдХреЗрдЯ рдорд┐рд│рддреЗ, 70 рд╕реЗрдХрдВрдж рдерд╛рдВрдмрд╛ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реАрд╣реА рдкрдХрдбрд▓реЗ рдирд╛рд╣реА рддрд░ рдЖрдореНрд╣реА рдмрд╛рд╣реЗрд░ рдкрдбрддреЛ.
count=1, timeout=70, filter="dst host 192.168.0.3 and port 5060"
рдкреБрдвреЗ, рдЖрдореНрд╣реА рдЦрд╛рддреНрд░реА рдХрд░рддреЛ рдХреА рдбрд┐рд╡реНрд╣рд╛рдЗрд╕ рдЦрд░реЛрдЦрд░рдЪ рдпреЗрд▓рд┐рдВрдХ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдореВрд▓реНрдпреЗ (ip рдЖрдгрд┐ mac) рдкрд░рдд рдХрд░рддреЛ.
рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдирдВрддреА рд╡рд╛рдкрд░реВрди, рдЖрдореНрд╣реА рдлреЛрдирд╡рд░ рдЪрд╛рд▓реВ рдЦрд╛рддреЗ рд╢реЛрдзрддреЛ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╡рд░реНрддрдорд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлреЛрдирд╡рд░реВрди рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ.
def get_phone_inform(ipaddr):
fileconf = requests.get('http://admin:admin@'+ipaddr+'/servlet?phonecfg=get[&accounts=1]')
conf = fileconf.text.split('|')
current_account = conf[2]
return current_account
рдпрд╛ рдЦрд╛рддреНрдпрд╛рдЪрд╛ рдкрд╛рд╕рд╡рд░реНрдб рд╢реЛрдзрд╛. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА asterisk.sip рдЯреЗрдмрд▓ рдЖрдгрд┐ рддреНрдпрд╛рддреАрд▓ рдбреЗрдЯрд╛ рдлреАрд▓реНрдбрдХрдбреЗ рд╡рд│рддреЛ.
def check_account(current_account):
connect = mysql.connector.connect(host='192.168.0.3', database='asterisk', user='voip_wr', password='***')
cursor = connect.cursor()
qwery = 'select data from sip where id=' + current_account + ' and keyword="secret";'
cursor.execute(qwery)
password = cursor.fetchall()
if password == ' ':
exit()
else:
return password
рдмрд░рдВ, рдЕрдВрддрд┐рдо рдЯрдкреНрдкреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА ldap AD рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддреЛ рдЖрдгрд┐ рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗрд▓реЗ sAMAccountName рд╡рд╛рдкрд░рддреЛ. getpass.getuser() рд╡рд░реНрддрдорд╛рди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреЗ рд╕реАрдПрди рдШреНрдпрд╛ (рдЬреНрдпрд╛рдордзреНрдпреЗ рд╕рд╣рд╕рд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреЗ рдкреВрд░реНрдг рдирд╛рд╡ рдЕрд╕рддреЗ).
def conn_ldap(login):
ad = ldap.initialize('ldap://***.local')
ad.simple_bind_s('voip@***.local', 'password')
basedn = 'OU=***,DC=***,DC=LOCAL'
basedn_user = 'OU=***,OU=***,DC=***,DC=LOCAL'
scope = ldap.SCOPE_SUBTREE
filterexp = "(&(sAMAccountName=" + login + ")(ObjectClass=person))"
filterexp2 = "(&(ObjectClass=organizationUnit))"
attrlist = ['cn']
attrlist2 = ['OU']
search = ad.search_s(basedn, scope, filterexp, attrlist)
adname = search[0][1]['cn'][0].decode('utf-8')
if adname == ' ':
search = ad.search_s(basedn_user, scope, filterexp2, attrlist2)
for i in range(1, len(search)+1):
group = search[i][1]['ou'][0]
basedn_user2 = 'OU='+group+','+basedn_user
search = ad.search_s(basedn_user2, scope, filterexp, attrlist)
adname = search[0][1]['cn'][0].decode('utf-8')
if adname != ' ':
return adname
adname = search[0][1]['cn'][0].decode('utf-8')
ad.unbind_s()
return adname
рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдмреЗрд╕рдордзреАрд▓ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдЯреЗрдмрд▓рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддреЛ (рдореА рддреЗ рддреЗрдереЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ) рдЖрдгрд┐ рдЖрдореНрд╣реА рд╢рд┐рдХрд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдЧреЛрд╖реНрдЯреА рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рддреЛ, рдореНрд╣рдгрдЬреЗ: ip, mac, рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡.
def conn_mysql(query,fquery,macaddr,qwery2):
connect = mysql.connector.connect(host='192.168.0.3', database='voip', user='voip_wr', password='***')
cursor = connect.cursor()
cursor.execute(fquery)
state = cursor.fetchall()
state = bool(state[0][0])
if state == True:
cursor.execute(qwery2)
connect.commit()
connect.close()
else:
cursor.execute(query)
connect.commit()
connect.close()
рдЖрдореНрд╣реА рдпреЗрдереЗ рдерд╛рдВрдмреВ рд╢рдХрддреЛ, рдХрд╛рд░рдг рдЖрдореНрд╣реА рдЖрдзреАрдЪ рдбрд╛рдпрдиреЕрдорд┐рдХ рдЕреЕрдбреНрд░реЗрд╕ рдмреБрдХ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ, рддреБрдореНрд╣реА рд╡рд┐рдЪрд╛рд░реВ рд╢рдХрддрд╛, рдкрд░рдВрддреБ рдореА рдкреБрдвреЗ рдЬрд╛рдКрди рдпреЗрдереЗ рдбрд┐рд╡реНрд╣рд╛рдЗрд╕реЗрд╕рдЪреА рд╕реНрд╡рдпрдВ-рддрд░рддреБрджреА рдЬреЛрдбрд▓реА.
рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ tftp рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реВрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдореНрд╣реА рдЖрдордЪреЗ рдмрджрд▓ рдХрд░рддреЛ рдЖрдгрд┐ рддреЗ mac.cfg рдореНрд╣рдгреВрди рд╕реЗрд╡реНрд╣ рдХрд░рддреЛ. рдореНрд╣рдгрдЬреЗрдЪ, рдпреЗрд▓рд┐рдВрдХрд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рджреЛрди рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗрдд, рдПрдХ рдЬрд╛рдЧрддрд┐рдХ рдЖрд╣реЗ рдЖрдгрд┐ рджреБрд╕рд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлреЛрдирд▓рд╛ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рдЖрдгрд┐ рддреЗ mac_phone.cfg рд╕реНрд╡рд░реВрдкрд╛рдЪреЗ рдЕрд╕рд╛рд╡реЗ.
рдлрд╛рдИрд▓рдордзреАрд▓ рд╕рд░реНрд╡ рдмрджрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдЖрдгрд┐ рддреА tftp рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкрд░рдд рд╕реЗрд╡реНрд╣ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рдлреЛрдирд▓рд╛ рдбрд┐рд╡реНрд╣рд╛рдЗрд╕рдЪреА рддрд░рддреВрдж рдЖрдгрд┐ рд░реАрдмреВрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдЬреНрдЮрд╛ рджреЗрддреЛ.
def tftp_file_change(config,place,adname,current_account,current_account_password):
client = tftpy.TftpClient("192.168.0.3", 69)
client.download('template.cfg', place)
fileread = open(place, 'r')
line = fileread.readlines()
fileread.close()
line[5] = (('account.1.label = ').encode('utf-8') + adname.encode('utf-8') + 'n')
line[2] = (('account.1.auth_name = ').encode('utf-8') + current_account.encode('utf-8') + 'n')
line[3] = (('account.1.display_name = ').encode('utf-8') + current_account.encode('utf-8') + 'n')
line[6] = (('account.1.password = ').encode('utf-8') + current_account_password[0][0] + 'n')
filewrite = open(place, 'w')
for i in line:
filewrite.write(i)
filewrite.close()
print place
print config
client.upload(config,place)
requests.get('http://admin:admin@'+ipaddr+'/cgi-bin/ConfigManApp.com?key=AutoP')
requests.get('http://admin:admin@'+ipaddr+'/cgi-bin/ConfigManApp.com?key=Reboot')
рдбрд┐рд╡реНрд╣рд╛рдЗрд╕ рд░реАрдмреВрдЯ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рдлреЛрди рд╕реНрдХреНрд░реАрдирд╡рд░ рдЖрдордЪреЗ рдкреВрд░реНрдг рдирд╛рд╡ рдорд┐рд│рддреЗ + рдбреЗрдЯрд╛рдмреЗрд╕рдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдиреЗрд╣рдореА рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рднрд░рд▓реЗрд▓реЗ рдЕреЕрдбреНрд░реЗрд╕ рдмреБрдХ, рддреНрдпрд╛рдирдВрддрд░ рд╕рд╛рдордЧреНрд░реА рдбрд╛рдпрдиреЕрдорд┐рдХрдкрдгреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА XML рдЖрдгрд┐ рдереЛрдбреЗ PHP рдЬреЛрдбрдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рдЕрд╢реА рдмрд░реАрдЪ рдЙрджрд╛рд╣рд░рдгреЗ рдЖрд╣реЗрдд, рдЕрдЧрджреА YEALINK рдордзреНрдпреЗ рджреЗрдЦреАрд▓ рдЖрд╣реЗрдд.
PS: рдЕрдзрд┐рдХ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреАрд╕рд╛рдареА, рддреБрдореНрд╣реА рдореБрдЦреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрдЬ (рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕) рд╡реЗрдЧрд│реНрдпрд╛ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╣рд▓рд╡реВ рд╢рдХрддрд╛.
рд╕реНрддреНрд░реЛрдд: www.habr.com