αž€αžΆαžšαž•αŸ’αžαž›αŸ‹αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· Yealink T19 + αžŸαŸ€αžœαž—αŸ…αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžαžΆαž˜αžœαž“αŸ’αž

αž“αŸ…αž–αŸαž›αžαŸ’αž‰αž»αŸ†αž˜αž€αž’αŸ’αžœαžΎαž€αžΆαžšαž±αŸ’αž™αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸƒαž§αž”αž€αžšαžŽαŸ IP αžšαž½αž…αž αžΎαž™ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž‰αŸ’αž‰αžΆαž•αŸ’αž€αžΆαž™ αž“αž·αž„αž”αŸ†αžŽαŸ‡αž‡αžΆαž‘αž˜αŸ’αžšαž„αŸ‹ FreeBPX αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž analogue PBX Samsung IDCS500 αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆ αž αžΎαž™αž‡αžΆαž‘αžΌαž‘αŸ…αž‚αžΊαž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžŸαŸ†αžαžΆαž“αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ IP αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž•αŸ’αž“αŸ‚αž€αž›αž€αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž αžΎαž™αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž“αžΉαž„αž”αž“αŸ’αžαž…αž˜αŸ’αž’αž·αž“αžŠαžΌαž…αž“αŸαŸ‡ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž„αŸƒαž˜αž½αž™αžŠαŸαž›αŸ’αž’ αž€αŸ’αžšαžΉαžαŸ’αž™αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž²αŸ’αž™αž•αŸ’αž‘αŸαžšαž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαž‘αŸ…αž€αžΆαž“αŸ‹αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ IP αž–αŸαž›αžœαŸαž›αžΆαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αŸ’αžšαž˜αž–αŸ’αžšαŸ€αž„αž‚αŸ’αž“αžΆ αžŸαž˜αŸ’αž—αžΆαžšαŸˆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž·αž‰ αž αžΎαž™αž•αŸ‚αž“αž€αžΆαžšαž•αŸ’αž‘αŸαžšαžŸαž αž‚αŸ’αžšαžΆαžŸαž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαžαžœαžαŸ’αžŸαž‘αžΈ 21 αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ”
αžšαžΏαž„αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αŸ’αžšαž½αž™αž”αžΆαžšαž˜αŸ’αž—αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ‚αž”αž“αŸαŸ‡αž‚αžΊαž€αžΆαžšαž€αžΎαž“αž‘αžΎαž„αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαž“αŸƒαžŸαŸ†αžŽαž»αŸ†αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αžŠαŸ‚αž›αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆ αž αžΎαž™αžšαžΏαž„αž‘αžΈαž–αžΈαžšαžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αž–αŸ’αžšαž½αž™αž”αžΆαžšαž˜αŸ’αž—αž“αŸ„αŸ‡αž‚αžΊαžŸαŸ€αžœαž—αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎ Endpoint Manager αž’αžΆαž…αž‡αž½αž™αž™αžΎαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΈαž˜αž½αž™ (αžŠαŸ‚αž›αžαžΆαž˜αžœαž·αž’αžΈαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžΆαžαŸ‹αž…αŸαž‰αž–αžΈαž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž“αŸƒ 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')

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸαŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž•αŸ’αžαž›αŸ‹αžαžΆαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž”αžŽαŸ’αžαžΆαž‰αžαžΆαž˜αžšαž™αŸˆαž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ αž–αŸ’αžšαŸ„αŸ‡ 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 framework αžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™αžšαž”αžŸαŸ‹αžœαžΆ αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ 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, 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 αŸ” αž“αŸ„αŸ‡αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹