เจ†เจŸเฉ‹ เจชเฉเจฐเฉ‹เจตเจฟเจœเจผเจจเจฟเฉฐเจ— เจฏเฉ‡เจฒเจฟเฉฐเจ• T19 + เจกเจพเจ‡เจจเจพเจฎเจฟเจ• เจเจกเจฐเฉˆเฉฑเจธ เจฌเฉเฉฑเจ•

เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจ‡เจธ เจ•เฉฐเจชเจจเฉ€ เจฒเจˆ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจ†เจ‡เจ†, เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ IP เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจฆเจพ เจ•เฉเจ เจกเจพเจŸเจพเจฌเฉ‡เจธ, เจคเจพเจฐเฉ‡ เจตเจพเจฒเฉ‡ เจ•เจˆ เจธเจฐเจตเจฐ เจ…เจคเฉ‡ FreeBPX เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉˆเจš เจธเฉ€เฅค เจ‡เจธเจฆเฉ‡ เจ‡เจฒเจพเจตเจพ, เจ‡เฉฑเจ• เจเจจเจพเจฒเจพเจ— PBX เจธเฉˆเจฎเจธเฉฐเจ— IDCS500 เจธเจฎเจพเจจเจพเจ‚เจคเจฐ เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจธเฉ€ เจ…เจคเฉ‡, เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ•เฉฐเจชเจจเฉ€ เจตเจฟเฉฑเจš เจฎเฉเฉฑเจ– เจธเฉฐเจšเจพเจฐ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจธเฉ€; IP เจŸเฉˆเจฒเฉ€เจซเฉ‹เจจเฉ€ เจธเจฟเจฐเจซ เจตเจฟเจ•เจฐเฉ€ เจตเจฟเจญเจพเจ— เจฒเจˆ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจธเฉ€เฅค เจ…เจคเฉ‡ เจธเจญ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจชเจ•เจพเจ‰เจฃเจพ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจฃเจพ เจธเฉ€, เจชเจฐ เจ‡เฉฑเจ• เจตเจงเฉ€เจ† เจฆเจฟเจจ เจธเจพเจฐเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ†เจˆเจชเฉ€ เจŸเฉˆเจฒเฉ€เจซเฉ‹เจจเฉ€ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจซเจผเจฐเจฎเจพเจจ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ†, เจ…เฉฐเจคเจฎ เจคเจพเจฐเฉ€เจ–เจพเจ‚ 'เจคเฉ‡ เจธเจนเจฟเจฎเจคเฉ€ เจฆเจฟเฉฑเจคเฉ€ เจ—เจˆ, เจ‰เจชเจ•เจฐเจฃ เจ–เจฐเฉ€เจฆเฉ‡ เจ—เจ, เจ…เจคเฉ‡ 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')

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจ•เฉฐเจชเจฟเจŠเจŸเจฐ 'เจคเฉ‡ เจšเฉฑเจฒเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจฌเจธเจผเจฐเจคเฉ‡ เจ•เจฟ เจ•เฉฐเจชเจฟเจŠเจŸเจฐ เจ‡เฉฑเจ• เจซเจผเฉ‹เจจ เจฐเจพเจนเฉ€เจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจตเฉ‡, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฏเฉ‡เจฒเจฟเฉฐเจ• 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹