เชฏเซ‡เชฒเชฟเช‚เช• T19 + เชกเชพเชฏเชจเซ‡เชฎเชฟเช• เชเชกเซเชฐเซ‡เชธ เชฌเซเช• เช‘เชŸเซ‹ เชชเซเชฐเซ‹เชตเชฟเชเชจเชฟเช‚เช—

เชœเซเชฏเชพเชฐเซ‡ เชนเซเช‚ เช† เช•เช‚เชชเชจเซ€ เชฎเชพเชŸเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹, เชคเซเชฏเชพเชฐเซ‡ เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช•เซ‡เชŸเชฒเชพเช• IP เช‰เชชเช•เชฐเชฃเซ‹เชจเซ‹ เชกเซ‡เชŸเชพเชฌเซ‡เช เชนเชคเซ‹, เชซเซ‚เชฆเชกเซ€เชตเชพเชณเชพ เช•เซ‡เชŸเชฒเชพเช• เชธเชฐเซเชตเชฐเซเชธ เช…เชจเซ‡ FreeBPX เชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชชเซ‡เชš เชนเชคเชพ. เชตเชงเซเชฎเชพเช‚, เชเชจเชพเชฒเซ‹เช— เชชเซ€เชฌเซ€เชเช•เซเชธ เชธเซ‡เชฎเชธเช‚เช— IDCS500 เชธเชฎเชพเช‚เชคเชฐ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เช•เช‚เชชเชจเซ€เชฎเชพเช‚ เชฎเซเช–เซเชฏ เชธเช‚เชšเชพเชฐ เชชเซเชฐเชฃเชพเชฒเซ€ เชนเชคเซ€; IP เชŸเซ‡เชฒเชฟเชซเซ‹เชจเซ€ เชฎเชพเชคเซเชฐ เชตเซ‡เชšเชพเชฃ เชตเชฟเชญเชพเช— เชฎเชพเชŸเซ‡ เชœ เช•เชพเชฎ เช•เชฐเชคเซ€ เชนเชคเซ€. เช…เชจเซ‡ เชฌเชงเซเช‚ เช† เชฐเซ€เชคเซ‡ เชฐเชพเช‚เชงเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซเชฏเซเช‚ เชนเซ‹เชค, เชชเชฐเช‚เชคเซ เชเช• เชธเชฐเชธ เชฆเชฟเชตเชธเซ‡ เชฆเชฐเซ‡เช•เชจเซ‡ เช†เช‡เชชเซ€ เชŸเซ‡เชฒเชฟเชซเซ‹เชจเซ€เชฎเชพเช‚ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชนเซเช•เชฎเชจเชพเชฎเซเช‚ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚, เชธเชฎเชฏเชฎเชฐเซเชฏเชพเชฆเชพ เชชเชฐ เชธเช‚เชฎเชค เชฅเชฏเชพ เชนเชคเชพ, เชธเชพเชงเชจเซ‹ เช–เชฐเซ€เชฆเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ, เช…เชจเซ‡ เชเชจเซเชŸเชฐเชชเซเชฐเชพเช‡เชเชจเซ‡ 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, 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 เชคเชฐเซ€เช•เซ‡ เชธเชพเชšเชตเซ€เช เช›เซ€เช. เชเชŸเชฒเซ‡ เช•เซ‡, เชฏเซ‡เชฒเชฟเช‚เช• เชฎเชพเชŸเซ‡ เชฌเซ‡ เชชเซเชฐเช•เชพเชฐเชจเชพ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช›เซ‡, เชเช• เชตเซˆเชถเซเชตเชฟเช• เช›เซ‡, เช…เชจเซ‡ เชฌเซ€เชœเซเช‚ เชšเซ‹เช•เซเช•เชธ เชซเซ‹เชจเชจเซ‡ เชฒเชพเช—เซ เชชเชกเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹