рд╕реНрд╡рдд: рдкреНрд░рд╛рд╡рдзрд╛рди Yealink T19 + рдЧрддрд┐рд╢реАрд▓ рдареЗрдЧрд╛рдирд╛ рдкреБрд╕реНрддрд┐рдХрд╛

рдЬрдм рдо рдпрд╕ рдХрдореНрдкрдиреАрдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рдо рдЧрд░реНрди рдЖрдПрдБ, рдорд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ IP рдпрдиреНрддреНрд░рд╣рд░реВрдХреЛ рдХреЗрд╣реА рдбрд╛рдЯрд╛рдмреЗрд╕, рддрд╛рд░рд╛ рдЪрд┐рдиреНрд╣рд╕рд╣рд┐рддрдХрд╛ рдзреЗрд░реИ рд╕рд░реНрднрд░рд╣рд░реВ рд░ FreeBPX рдХреЛ рд░реВрдкрдорд╛ рдкреНрдпрд╛рдЪрд╣рд░реВ рдерд┐рдПред рдпрд╕рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдХ рдПрдирд╛рд▓рдЧ PBX Samsung IDCS500 рд╕рдорд╛рдирд╛рдВрддрд░ рдорд╛ рдХрд╛рдо рдЧрд░реНрдпреЛ рд░, рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдХрдореНрдкрдиреА рдорд╛ рдореБрдЦреНрдп рд╕рдВрдЪрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдерд┐рдпреЛ; рдЖрдИрдкреА рдЯреЗрд▓рд┐рдлреЛрдиреА рдорд╛рддреНрд░ рдмрд┐рдХреНрд░реА рд╡рд┐рднрд╛рдЧ рдХреЛ рд▓рд╛рдЧреА рдХрд╛рдо рдЧрд░реНрдпреЛред рд░ рд╕рдмреИ рдХреБрд░рд╛ рдпрд╕рд░реА рдкрдХрд╛рдЙрди рдЬрд╛рд░реА рд╣реБрдиреЗ рдерд┐рдпреЛ, рддрд░ рдПрдХ рд░рд╛рдореНрд░реЛ рджрд┐рди рд╕рдмреИрд▓рд╛рдИ рдЖрдИрдкреА рдЯреЗрд▓рд┐рдлреЛрдиреАрдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди рдбрд┐рдХреНрд░реА рджрд┐рдЗрдпреЛ, рд╕рдордпрд╕реАрдорд╛рдорд╛ рд╕рд╣рдорддрд┐ рднрдпреЛ, рдЙрдкрдХрд░рдгрд╣рд░реВ рдЦрд░рд┐рдж рдЧрд░рд┐рдпреЛ рд░ 21 рдФрдВ рд╢рддрд╛рдмреНрджреАрдорд╛ рдЙрджреНрдпрдо рд╣рд╕реНрддрд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛ рд▓рд╛рдЧреВ рд╣реБрди рдерд╛рд▓реНрдпреЛред
рдпрд╕реНрддреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдЪрд┐рдиреНрддрд╛ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрдиреЗ рдкрд╣рд┐рд▓реЛ рдХреБрд░рд╛ рдЯреЗрд▓рд┐рдлреЛрди рд╕реЗрдЯрд╣рд░реВрдХреЛ рджреНрд░реБрдд рд░реВрдкрдорд╛ рдмрдвреНрджреЛ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рдЬреБрди рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рджреЛрд╕реНрд░реЛ рдХреБрд░рд╛ рдЬреБрди рдзреЗрд░реИ рдЪрд┐рдиреНрддрд╛рдЬрдирдХ рдерд┐рдпреЛ рдлреЛрди рдмреБрдХред рдпрджрд┐ рдЕрдиреНрддрд┐рдо рдмрд┐рдиреНрджреБ рдкреНрд░рдмрдиреНрдзрдХрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдкрд╣рд┐рд▓реЛ (рдЬрд╕рд▓рд╛рдИ, FreePBX рдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдмрд╛рдЯ рдХрд╛рдЯрд┐рдПрдХреЛ рдерд┐рдпреЛ) рдорд╛ рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдкреБрд╕реНрддрдХрд╕рдБрдЧ рдХреЗрд╣реА рдкреНрд░рд╢реНрдирд╣рд░реВ рдЦрдбрд╛ рднрдП:

  • рдкрд╣рд┐рд▓реЛ, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕реНрдерд╛рди/рддрд░рд▓рддрд╛ рдирд┐рд░рдиреНрддрд░ рдкрд░рд┐рд╡рд░реНрддрди рднрдЗрд░рд╣реЗрдХреЛ рдмреЗрд▓рд╛ рдпрд╕рдХреЛ рд╢реБрджреНрдзрддрд╛ рдХрд╕рд░реА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреЗ?
  • рджреЛрд╕реНрд░реЛ, рдХрд╕рд░реА рдлреЛрдирд╣рд░реВ рдкреВрд░реНрдг рд░реВрдкрдорд╛ depersonalize рдЧрд░реНрдиреЗред рд░ рд╣рд░реЗрдХ рдкрдЯрдХ рд╕рдореНрдкрд░реНрдХ рдирд╛рдо рднрд░реНрдиреБ рд╣реБрдБрджреИрди?

рд╕рдорд╕реНрдпрд╛ рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рдерд┐рдпреЛ, рд╕рдорд╛рдзрд╛рди рдЖрдЙрди рдзреЗрд░реИ рд╕рдордп рд▓рд╛рдЧреЗрдиред рдЕрдм рдо рдкреВрд░реНрдг рд╕реВрдЪреА рджрд┐рдиреЗрдЫреБ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдХреНрд░рдордмрджреНрдз рд░реВрдкрдорд╛ рд╣реЗрд░реНрдиреЗрдЫреМрдВред

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"

рдЕрд░реНрдХреЛ, рд╣рд╛рдореА рдпреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдЫреМрдВ рдХрд┐ рдЙрдкрдХрд░рдг рд╡рд╛рд╕реНрддрд╡рдореИ рдпреЗрд▓рд┐рдВрдХ рд╣реЛ рд░ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирд╣рд░реВ (рдЖрдИрдкреА рд░ рдореНрдпрд╛рдХ) рдлрд░реНрдХрд╛рдЙрдБрдЫреМрдВред

рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрд░реЛрдз рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореАрд▓реЗ рдлреЛрдирдорд╛ рд╣рд╛рд▓рдХреЛ рдЦрд╛рддрд╛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдБрдЫреМрдВред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рд▓рдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлреЛрдирдмрд╛рдЯ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реА рдкрд╛рд░реНрд╕ рдЧрд░рд┐рдПрдХреЛ рдЫред

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, usernameред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди