ΠΠΎΠ³Π°ΡΠΎ Π΄ΠΎΠΉΠ΄ΠΎΡ
Π΄Π° ΡΠ°Π±ΠΎΡΡ Π² ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, Π²Π΅ΡΠ΅ ΠΈΠΌΠ°Ρ
Π½ΡΠΊΠ°ΠΊΠ²Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ IP ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠ²ΡΡΠ° ΡΡΡ Π·Π²Π΅Π·Π΄ΠΈΡΠΊΠ° ΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° FreeBPX. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Π° ΡΠ΅Π»Π΅ΡΠΎΠ½Π½Π° ΡΠ΅Π½ΡΡΠ°Π»Π° Samsung IDCS500 ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΈ ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ Π±Π΅ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ°; IP ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈΡΡΠ° ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π° ΠΎΡΠ΄Π΅Π»Π° Π·Π° ΠΏΡΠΎΠ΄Π°ΠΆΠ±ΠΈ. Π Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ Π΄Π° ΡΠ΅ Π³ΠΎΡΠ²ΠΈ ΡΠ°ΠΊΠ°, Π½ΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ Π΄Π΅Π½ Π±Π΅ΡΠ΅ ΠΈΠ·Π΄Π°Π΄Π΅Π½ ΡΠΊΠ°Π· Π·Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΡΠΌ IP ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈΡ, Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ΅Π½ΠΈ Π±ΡΡ
Π° ΡΡΠΎΠΊΠΎΠ²Π΅, Π·Π°ΠΊΡΠΏΠ΅Π½ΠΎ ΠΎΠ±ΠΎΡΡΠ΄Π²Π°Π½Π΅ ΠΈ ΠΏΠ»Π°Π½ΡΡ Π·Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΠΏΡΠΈΡΡΠΈΠ΅ΡΠΎ Π² 21 Π²Π΅ΠΊ Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°.
ΠΡΡΠ²ΠΎΡΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° ΡΡΠ΅Π²ΠΎΠΆΠΈ Π² ΡΠ°ΠΊΠ°Π²Π° ΡΠΈΡΡΠ°ΡΠΈΡ, Π΅ Π±ΡΡΠ·ΠΎ Π½Π°ΡΠ°ΡΡΠ²Π°ΡΠΈΡΡ Π±ΡΠΎΠΉ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΈ Π°ΠΏΠ°ΡΠ°ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Ρ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½, Π²ΡΠΎΡΠΎΡΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π±Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π²ΠΎΠΆΠ½ΠΎ, Π±Π΅ΡΠ΅ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π». ΠΠΊΠΎ Endpoint Manager ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Ρ ΠΏΡΡΠ²ΠΈΡ (ΠΊΠΎΠΉΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ Π±Π΅ΡΠ΅ ΠΈΠ·ΡΡΠ·Π°Π½ ΠΎΡ Π½Π°ΠΉ-Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° FreePBX), ΡΠΎΠ³Π°Π²Π° Ρ ΠΊΠ½ΠΈΠ³Π°ΡΠ° Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ
Π° Π½ΡΠΊΠΎΠΈ Π²ΡΠΏΡΠΎΡΠΈ:
- ΠΡΡΠ²ΠΎ, ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠΎΡΠ½ΠΎΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ/ΠΏΠ»Π°Π²Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ?
- ΠΡΠΎΡΠΎ, ΠΊΠ°ΠΊ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄Π° Π΄Π΅ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈΡΠ΅. Π Π΄Π° Π½Π΅ ΠΏΠΎΠΏΡΠ»Π²Π°ΡΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ°ΠΊΡΠ° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ?
ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π±Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π΅ ΠΎΡΠ½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΠΏΡΠΈΡΡΠΈΠ³Π½Π΅. Π‘Π΅Π³Π° ΡΠ΅ Π΄Π°ΠΌ ΠΏΡΠ»Π½ΠΈΡ ΡΠΏΠΈΡΡΠΊ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π³ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ ΡΠ΅Π΄.
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 Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΊΠ°ΡΠΎ ΡΠ»ΡΠ·.
ΠΡΡΠ²ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π΄Π°Π»ΠΈ Π΅ ΡΠ²ΡΡΠ·Π°Π½ΠΎ? ΠΈ ΠΊΠ°ΠΊΡΠ² mac ΠΈ ip ΠΈΠΌΠ° Π½Π°ΡΠΈΡ ΡΠ΅Π»Π΅ΡΠΎΠ½.
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
Π’ΡΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° sniff ΠΎΡ scapy framework, Ρ Π½Π΅ΠΉΠ½Π° ΠΏΠΎΠΌΠΎΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ udp ΠΏΠ°ΠΊΠ΅Ρ, ΠΈΠ·ΡΠ°ΠΊΠ²Π°ΠΌΠ΅ 70 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ ΠΈ Π°ΠΊΠΎ Π½Π΅ Ρ Π²Π°Π½Π΅ΠΌ Π½ΠΈΡΠΎ, ΠΈΠ·Π»ΠΈΠ·Π°ΠΌΠ΅.
count=1, timeout=70, filter="dst host 192.168.0.3 and port 5060"
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅, ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ Π½Π°ΠΈΡΡΠΈΠ½Π° Π΅ Yealink ΠΈ Π²ΡΡΡΠ°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ (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() Π²Π·Π΅ΠΌΠ΅ΡΠ΅ cn Π½Π° ΡΠ΅ΠΊΡΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» (ΠΊΠΎΠΉΡΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΠΏΡΠ»Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ).
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. Π’ΠΎΠ΅ΡΡ Π·Π° Yealink ΠΈΠΌΠ° Π΄Π²Π° ΡΠΈΠΏΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Π΅Π΄Π½Π°ΡΠ° Π΅ Π³Π»ΠΎΠ±Π°Π»Π½Π°, Π° Π²ΡΠΎΡΠ°ΡΠ° ΡΠ΅ ΠΎΡΠ½Π°ΡΡ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΡΠ΅Π»Π΅ΡΠΎΠ½ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠ² ΡΠΎΡΠΌΠ°ΡΠ° 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