рдСрдЯреЛ рдкреНрд░реЛрд╡реНрд╣рд┐рдЬрдирд┐рдВрдЧ рдпреЗрд▓рд┐рдВрдХ T19 + рдбрд╛рдпрдиреЕрдорд┐рдХ рдЕреЕрдбреНрд░реЗрд╕ рдмреБрдХ

рдЬреЗрд╡реНрд╣рд╛ рдореА рдпрд╛ рдХрдВрдкрдиреАрд╕рд╛рдареА рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд▓реЛ, рддреЗрд╡реНрд╣рд╛ рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдЖрдзреАрдЪ рдХрд╛рд╣реА 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛