แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ Yealink T19 + แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒ˜ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒฌแƒ˜แƒ’แƒœแƒ˜

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒแƒ› แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒแƒจแƒ˜ แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ“ แƒ›แƒแƒ•แƒ”แƒ“แƒ˜, แƒฃแƒ™แƒ•แƒ” แƒ›แƒฅแƒแƒœแƒ“แƒ IP แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ, แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ•แƒแƒ แƒกแƒ™แƒ•แƒšแƒแƒ•แƒ˜แƒ— แƒ“แƒ แƒžแƒแƒขแƒฉแƒ˜ FreeBPX-แƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ—. แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒžแƒแƒ แƒแƒšแƒ”แƒšแƒฃแƒ แƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ แƒแƒœแƒแƒšแƒแƒ’แƒฃแƒ แƒ˜ 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 frame-แƒ“แƒแƒœ, แƒ›แƒ˜แƒกแƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒš 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

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ