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

рдЬрдм рдореИрдВ рдЗрд╕ рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдЖрдпрд╛, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдИрдкреА рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдХреБрдЫ рдбреЗрдЯрд╛рдмреЗрд╕, рддрд╛рд░рд╛рдВрдХрди рдЪрд┐рд╣реНрди рд╡рд╛рд▓реЗ рдХрдИ рд╕рд░реНрд╡рд░ рдФрд░ рдлреНрд░реАрдмреАрдкреАрдПрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреИрдЪ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдкреАрдмреАрдПрдХреНрд╕ рд╕реИрдорд╕рдВрдЧ рдЖрдИрдбреАрд╕реАрдПрд╕500 рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдВрдкрдиреА рдореЗрдВ рдореБрдЦреНрдп рд╕рдВрдЪрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдереА; рдЖрдИрдкреА рдЯреЗрд▓реАрдлреЛрдиреА рдХреЗрд╡рд▓ рдмрд┐рдХреНрд░реА рд╡рд┐рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рдереАред рдФрд░ рд╕рдм рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдкрдХрддрд╛ рд░рд╣рд╛, рд▓реЗрдХрд┐рди рдПрдХ рджрд┐рди рд╕рднреА рдХреЛ рдЖрдИрдкреА рдЯреЗрд▓реАрдлреЛрдиреА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлрд░рдорд╛рди рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛, рд╕рдордп рд╕реАрдорд╛ рдкрд░ рд╕рд╣рдорддрд┐ рд╣реБрдИ, рдЙрдкрдХрд░рдг рдЦрд░реАрджреЗ рдЧрдП, рдФрд░ рдЙрджреНрдпрдо рдХреЛ 21 рд╡реАрдВ рд╕рджреА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдиреЗ рд▓рдЧреАред
рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЪрд┐рдВрддрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рд▓рдЧрддреА рд╣реИ рд╡рд╣ рд╣реИ рддреЗрдЬреА рд╕реЗ рдмрдврд╝рддреА рдЯреЗрд▓реАрдлреЛрди рд╕реЗрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рджреВрд╕рд░реА рдЪреАрдЬ рдЬреЛ рдмрд╣реБрдд рдЪрд┐рдВрддрд╛рдЬрдирдХ рдереА рд╡рд╣ рдереА рдлреЛрди рдмреБрдХред рдпрджрд┐ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкреНрд░рдмрдВрдзрдХ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ, рд╡реИрд╕реЗ, 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')

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдмрд╢рд░реНрддреЗ рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдлреЛрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗрд▓рд┐рдВрдХ рдЯреА19 рдЧреЗрдЯрд╡реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ? рдФрд░ рд╣рдорд╛рд░реЗ рдлреЛрди рдореЗрдВ рдХреМрди рд╕рд╛ рдореИрдХ рдФрд░ рдЖрдИрдкреА рд╣реИред

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

рдпрд╣рд╛рдВ рд╣рдо рд╕реНрдХреЗрдкреА рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рд╕реНрдирд┐рдлрд╝ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рд╣рдореЗрдВ рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдпреВрдбреАрдкреА рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, 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() рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рд╕реАрдПрди рд▓реЗрдВ (рдЬрд┐рд╕рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдкреВрд░рд╛ рдирд╛рдо рд╣реЛрддрд╛ рд╣реИ)ред

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

рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЬреБрдбрд╝рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдмрдирд╛рдпрд╛ рд╣реИ) рдФрд░ рд╡рд╣ рд╕рдм рдХреБрдЫ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рд╕реАрдЦрд╛, рдЕрд░реНрдерд╛рддреН: рдЖрдИрдкреА, рдореИрдХ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдоред

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 рдХреЗ рдкрд╛рд╕ рднреА рд╣реИрдВред

рдкреБрдирд╢реНрдЪ: рдЕрдзрд┐рдХ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдореБрдЦреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдЪрд░) рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ