ಯೆಲಿಂಕ್ T19 + ಡೈನಾಮಿಕ್ ವಿಳಾಸ ಪುಸ್ತಕವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಒದಗಿಸುವುದು

ನಾನು ಈ ಕಂಪನಿಗೆ ಕೆಲಸ ಮಾಡಲು ಬಂದಾಗ, ನಾನು ಈಗಾಗಲೇ ಐಪಿ ಸಾಧನಗಳ ಕೆಲವು ಡೇಟಾಬೇಸ್, ನಕ್ಷತ್ರ ಚಿಹ್ನೆಯೊಂದಿಗೆ ಹಲವಾರು ಸರ್ವರ್‌ಗಳು ಮತ್ತು ಫ್ರೀಬಿಪಿಎಕ್ಸ್ ರೂಪದಲ್ಲಿ ಪ್ಯಾಚ್ ಅನ್ನು ಹೊಂದಿದ್ದೇನೆ. ಇದರ ಜೊತೆಗೆ, ಒಂದು ಅನಲಾಗ್ PBX Samsung IDCS500 ಸಮಾನಾಂತರವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಿತು ಮತ್ತು ಸಾಮಾನ್ಯವಾಗಿ, ಕಂಪನಿಯಲ್ಲಿ ಮುಖ್ಯ ಸಂವಹನ ವ್ಯವಸ್ಥೆಯಾಗಿತ್ತು; IP ಟೆಲಿಫೋನಿ ಮಾರಾಟ ವಿಭಾಗಕ್ಕೆ ಮಾತ್ರ ಕೆಲಸ ಮಾಡಿತು. ಮತ್ತು ಎಲ್ಲವನ್ನೂ ಈ ರೀತಿ ಬೇಯಿಸುವುದು ಮುಂದುವರಿಯುತ್ತದೆ, ಆದರೆ ಒಂದು ಉತ್ತಮ ದಿನ ಎಲ್ಲರನ್ನೂ ಐಪಿ ಟೆಲಿಫೋನಿಗೆ ವರ್ಗಾಯಿಸಲು ತೀರ್ಪು ನೀಡಲಾಯಿತು, ಗಡುವನ್ನು ಒಪ್ಪಲಾಯಿತು, ಉಪಕರಣಗಳನ್ನು ಖರೀದಿಸಲಾಯಿತು ಮತ್ತು ಉದ್ಯಮವನ್ನು 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

ಇಲ್ಲಿ ನಾವು ಸ್ಕೇಪಿ ಫ್ರೇಮ್‌ವರ್ಕ್‌ನಿಂದ ಸ್ನಿಫ್ ಕಾರ್ಯವನ್ನು ಬಳಸುತ್ತೇವೆ, ಅದರ ಸಹಾಯದಿಂದ ನಾವು ಪೂರ್ವನಿರ್ಧರಿತ ಯುಡಿಪಿ ಪ್ಯಾಕೆಟ್ ಅನ್ನು ಸ್ವೀಕರಿಸುತ್ತೇವೆ, 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, ಬಳಕೆದಾರಹೆಸರು.

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

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ