เชเซเชฏเชพเชฐเซ เชนเซเช เช เชเชเชชเชจเซ เชฎเชพเชเซ เชเชพเชฎ เชเชฐเชตเชพ เชเชตเซเชฏเซ เชนเชคเซ, เชคเซเชฏเชพเชฐเซ เชฎเชพเชฐเซ เชชเชพเชธเซ เชชเชนเซเชฒเซเชฅเซ เช เชเซเชเชฒเชพเช IP เชเชชเชเชฐเชฃเซเชจเซ เชกเซเชเชพเชฌเซเช เชนเชคเซ, เชซเซเชฆเชกเซเชตเชพเชณเชพ เชเซเชเชฒเชพเช เชธเชฐเซเชตเชฐเซเชธ เช
เชจเซ FreeBPX เชจเชพ เชฐเซเชชเชฎเชพเช เชชเซเช เชนเชคเชพ. เชตเชงเซเชฎเชพเช, เชเชจเชพเชฒเซเช เชชเซเชฌเซเชเชเซเชธ เชธเซเชฎเชธเชเช 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
เช เชนเซเช เชเชชเชฃเซ เชธเซเชเซ เชชเซ เชซเซเชฐเซเชฎเชตเชฐเซเชเชฎเชพเชเชฅเซ เชธเซเชจเชฟเชซ เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช, เชคเซเชจเซ เชฎเชฆเชฆเชฅเซ เช เชฎเชจเซ เชชเซเชฐเซเชตเชจเชฟเชฐเซเชงเชพเชฐเชฟเชค 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