Автоматично ΠΎΠ±Π΅Π·ΠΏΠ΅Ρ‡Π°Π²Π°Π½Π΅ Yealink T19 + Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Π° адрСсна ΠΊΠ½ΠΈΠ³Π°

ΠšΠΎΠ³Π°Ρ‚ΠΎ Π΄ΠΎΠΉΠ΄ΠΎΡ… Π΄Π° работя Π² Ρ‚Π°Π·ΠΈ компания, Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ°Ρ… някаква Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ с 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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€