เบชเบฐเปœเบญเบ‡เบ›เบถเป‰เบกเบ—เบตเปˆเบขเบนเปˆเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‚เบญเบ‡ Yealink T19 + เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเบกเบฒเป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบšเปเบฅเบดเบชเบฑเบ”เบ™เบตเป‰, เบ‚เป‰เบญเบเบกเบตเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบญเบธเบ›เบฐเบเบญเบ™ IP, เบšเบฒเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเบกเบตเบ”เบฒเบงเปเบฅเบฐ patch เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡ FreeBPX. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, A analogue PBX Samsung IDCS500 เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบฐเบซเบ™เบฒเบ™เบเบฑเบ™เปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เปเบกเปˆเบ™เบฅเบฐเบšเบปเบšเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบ•เบปเป‰เบ™เบ•เปเปƒเบ™เบšเปเบฅเบดเบชเบฑเบ”; เป‚เบ—เบฅเบฐเบชเบฑเบš IP เป€เบฎเบฑเบ”เบงเบฝเบเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบžเบฐเปเบ™เบเบเบฒเบ™เบ‚เบฒเบ. เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เป€เบ›เบฑเบ™เปเบšเบšเบ™เบตเป‰, เปเบ•เปˆเบกเบทเป‰เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบ”เบตเบกเบตเบ”เปเบฒเบฅเบฑเบ”เปƒเบซเป‰เป‚เบญเบ™เบ—เบธเบเบ„เบปเบ™เป„เบ›เบซเบฒเป‚เบ—เบฅเบฐเบชเบฑเบš IP, เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเป„เบ”เป‰เบ•เบปเบเบฅเบปเบ‡, เบญเบธเบ›เบฐเบเบญเบ™เป„เบ”เป‰เบ–เบทเบเบŠเบทเป‰เปเบฅเบฐเปเบœเบ™เบเบฒเบ™เป‚เบญเบ™เบงเบดเบชเบฒเบซเบฐเบเบดเบ”เป„เบ›เบชเบนเปˆเบชเบฐเบ•เบฐเบงเบฑเบ”เบ—เบต 21 เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ›เบฐเบ•เบดเบšเบฑเบ”.
เบชเบดเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเป€เบฅเบตเปˆเบกเบเบฑเบ‡เบงเบปเบ™เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปเบกเปˆเบ™เบˆเปเบฒเบ™เบงเบ™เบŠเบธเบ”เป‚เบ—เบฅเบฐเบชเบฑเบšเบ—เบตเปˆเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เป„เบงเบงเบฒเบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡, เบชเบดเปˆเบ‡เบ—เบตเบชเบญเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเป€เบ›เบฑเบ™เบซเปˆเบงเบ‡เบซเบผเบฒเบเปเบกเปˆเบ™เบ›เบทเป‰เบกเป‚เบ—เบฅเบฐเบชเบฑเบš. เบ–เป‰เบฒ Endpoint Manager เบชเบฒเบกเบฒเบ”เบŠเปˆเบงเบเบžเบงเบเป€เบฎเบปเบฒเบ”เป‰เบงเบเบ•เบปเบงเบ—เปเบฒเบญเบดเบ” (เป€เบŠเบดเปˆเบ‡, เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เป„เบ”เป‰เบ–เบทเบเบ•เบฑเบ”เบญเบญเบเบˆเบฒเบ 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 เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเป€เบ›เบฑเบ™เบ›เบฐเบ•เบนเป„เบ”เป‰.

เบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบšเป? เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆ 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, เบ”เป‰เบงเบเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบกเบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ” 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, เบžเบงเบเป€เบฎเบปเบฒเปƒเบซเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡เบเบฑเบšเป‚เบ—เบฅเบฐเบชเบฑเบšเป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบญเบ‡เปเบฅเบฐ reboot เบญเบธเบ›เบฐเบเบญเบ™.

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')

เบซเบผเบฑเบ‡เบˆเบฒเบ reboot เบญเบธเบ›เบฐเบเบญเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบŠเบทเปˆเป€เบ•เบฑเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™เบซเบ™เป‰เบฒเบˆเปเป‚เบ—เบฅเบฐเบชเบฑเบš + เบ›เบทเป‰เบกเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบ‚เบฝเบ™เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เบชเบฐเป€เบซเบกเบตเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เบเบฒเบ™เป€เบžเบตเปˆเบก XML เปเบฅเบฐ PHP เป€เบฅเบฑเบเบ™เป‰เบญเบเป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เป€เบ™เบทเป‰เบญเบซเบฒเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เบกเบตเบซเบผเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ YEALINK เป€เบญเบ‡เบเปเปˆเบกเบตเบžเบงเบเบกเบฑเบ™.

PS: เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปƒเบซเบเปˆเบ‚เบทเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเป‰เบฒเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเป‰เบ™เบ•เป (เบ•เบปเบงเปเบ›) เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบŸเบฅเปŒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™