เดฏเดพเดฒเดฟเด™เตเด•เต เดŸเดฟ19 + เดกเตˆเดจเดพเดฎเดฟเด•เต เด…เดกเตเดฐเดธเต เดฌเตเด•เตเด•เต เด“เดŸเตเดŸเต‹ เดชเตเดฐเตŠเดตเดฟเดทเดจเดฟเด‚เด—เต

เดžเดพเตป เดˆ เด•เดฎเตเดชเดจเดฟเดฏเดฟเตฝ เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเดพเตป เดตเดจเตเดจเดชเตเดชเต‹เตพ, เดŽเดจเดฟเด•เตเด•เต เด‡เดคเดฟเดจเด•เด‚ เดเดชเดฟ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเดŸเต† เด•เตเดฑเดšเตเดšเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต, เดจเด•เตเดทเดคเตเดฐเดšเดฟเดนเตเดจเดฎเตเดณเตเดณ เดจเดฟเดฐเดตเดงเดฟ เดธเต†เตผเดตเดฑเตเด•เตพ, FreeBPX เดฐเต‚เดชเดคเตเดคเดฟเตฝ เด’เดฐเต เดชเดพเดšเตเดšเต. เด•เต‚เดŸเดพเดคเต†, เด’เดฐเต เด…เดจเดฒเต‹เด—เต PBX เดธเดพเด‚เดธเด™เต เดเดกเดฟเดธเดฟเดŽเดธเต 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"

เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เด‰เดชเด•เดฐเดฃเด‚ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ 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 เดธเต†เตผเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เดธเด‚เดฐเด•เตเดทเดฟเดšเตเดš เดถเต‡เดทเด‚, เด‰เดชเด•เดฐเดฃเด‚ เดชเตเดฐเตŠเดตเดฟเดทเตป เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดฑเต€เดฌเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดžเด™เตเด™เตพ เดซเต‹เดฃเดฟเดจเต เด•เดฎเดพเตปเดกเต เดจเตฝเด•เตเดจเตเดจเต.

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•