āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻž āĻ‡āĻ¯āĻŧā§‡āĻ˛āĻŋāĻ™ā§āĻ• T19 + āĻ—āĻ¤āĻŋāĻļā§€āĻ˛ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻŦāĻ‡

āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻŋ āĻāĻ‡ āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻāĻ¸ā§‡āĻ›āĻŋ, āĻ¤āĻ–āĻ¨ āĻ†āĻŽāĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻ†āĻ‡āĻĒāĻŋ āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸ā§‡āĻ° āĻ•āĻŋāĻ›ā§ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸, āĻ¤āĻžāĻ°āĻ•āĻžāĻšāĻŋāĻšā§āĻ¨ āĻ¸āĻš āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻāĻŦāĻ‚ FreeBPX āĻ†āĻ•āĻžāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻš āĻ›āĻŋāĻ˛āĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ¨āĻžāĻ˛āĻ— PBX Samsung IDCS500 āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡, āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨āĻŋāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻž āĻ›āĻŋāĻ˛; āĻ†āĻ‡āĻĒāĻŋ āĻŸā§‡āĻ˛āĻŋāĻĢā§‹āĻ¨āĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŦāĻŋāĻ•ā§āĻ°āĻ¯āĻŧ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛āĨ¤ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻ°āĻžāĻ¨ā§āĻ¨āĻž āĻ•āĻ°āĻž āĻ…āĻŦā§āĻ¯āĻžāĻšāĻ¤ āĻĨāĻžāĻ•āĻ¤, āĻ¤āĻŦā§‡ āĻāĻ•āĻĻāĻŋāĻ¨ āĻ¸ā§‚āĻ•ā§āĻˇā§āĻŽ āĻĻāĻŋāĻ¨ āĻĒā§āĻ°āĻ¤ā§āĻ¯ā§‡āĻ•āĻ•ā§‡ āĻ†āĻ‡āĻĒāĻŋ āĻŸā§‡āĻ˛āĻŋāĻĢā§‹āĻ¨āĻŋāĻ¤ā§‡ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĄāĻŋāĻ•ā§āĻ°āĻŋ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻž āĻ¸āĻŽā§āĻŽāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ āĻ•ā§‡āĻ¨āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻāĻ¨ā§āĻŸāĻžāĻ°āĻĒā§āĻ°āĻžāĻ‡āĻœāĻŸāĻŋāĻ•ā§‡ 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')

āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻžāĻ°ā§‡ āĻšāĻ˛ā§‡ āĻāĻŦāĻ‚ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ¯āĻĻāĻŋ āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻžāĻ°āĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻĢā§‹āĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻĨāĻžāĻ•ā§‡, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ 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"

āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻŋ āĻ¯ā§‡ āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸āĻŸāĻŋ āĻĒā§āĻ°āĻ•ā§ƒāĻ¤āĻĒāĻ•ā§āĻˇā§‡ āĻ‡āĻ¯āĻŧā§‡āĻ˛āĻŋāĻ™ā§āĻ• āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ (āĻ†āĻ‡āĻĒāĻŋ āĻāĻŦāĻ‚ āĻŽā§āĻ¯āĻžāĻ•) āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻĢā§‹āĻ¨ā§‡ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻŸāĻŋ āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻŋāĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻĢā§‹āĻ¨ āĻĨā§‡āĻ•ā§‡ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒāĻžāĻ°ā§āĻ¸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

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 āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŋāĨ¤ āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻ‡āĻ¯āĻŧā§‡āĻ˛āĻŋāĻ™ā§āĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻā§āĻŸāĻŋ āĻ§āĻ°āĻŖā§‡āĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āĻ¯āĻžāĻĒā§€ āĻāĻŦāĻ‚ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĢā§‹āĻ¨ā§‡ āĻĒā§āĻ°āĻ¯ā§‹āĻœā§āĻ¯ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ mac_phone.cfg āĻĢāĻ°ā§āĻŽā§‡āĻ° āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤

āĻĢāĻžāĻ‡āĻ˛ā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻŸāĻŋāĻāĻĢāĻŸāĻŋāĻĒāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸āĻŸāĻŋāĻ•ā§‡ āĻĒā§āĻ°āĻ­āĻŋāĻļāĻ¨ āĻāĻŦāĻ‚ āĻ°āĻŋāĻŦā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĢā§‹āĻ¨āĻ•ā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋāĻ‡āĨ¤

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

āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸āĻŸāĻŋ āĻ°āĻŋāĻŦā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻĢā§‹āĻ¨ā§‡āĻ° āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¨ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°ā§‹ āĻ¨āĻžāĻŽ āĻĒāĻžāĻ‡ + āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ†āĻ•āĻžāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻĒā§‚āĻ°āĻŖ āĻ•āĻ°āĻž āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻŦāĻ‡, āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ¯āĻž āĻ…āĻŦāĻļāĻŋāĻˇā§āĻŸ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻž āĻšāĻ˛ āĻāĻ•ā§āĻ¸āĻāĻŽāĻāĻ˛ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§āĻŸāĻŋ āĻ—āĻ¤āĻŋāĻļā§€āĻ˛āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻžāĻŽāĻžāĻ¨ā§āĻ¯ āĻĒāĻŋāĻāĻ‡āĻšāĻĒāĻŋāĨ¤ āĻāĻ°āĻ•āĻŽ āĻ…āĻ¨ā§‡āĻ• āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ†āĻ›ā§‡, āĻāĻŽāĻ¨āĻ•āĻŋ YEALINK āĻ¨āĻŋāĻœā§‡āĻ“ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ†āĻ›ā§‡ā§ˇ

PS: āĻŦā§ƒāĻšāĻ¤ā§āĻ¤āĻ° āĻŽāĻžāĻĒāĻ¯ā§‹āĻ—ā§āĻ¯āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ (āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛) āĻ¸āĻ°āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨