Newer
Older
Import / projects / LGN-IP3870 / t / orig / snmp.py

#
# by shchun : receive from elpis on Mar20.
#

import socket
import runtime
import evas
import os
import os.path
import sys
import status
import config
import utils
from vdcisetting import vdci_setting
from profile import profile, lan_profile, wifi_profile, dns_profile

from baseui import FullBaloonDownloadUI, NotifyUI
from basemodel import Stage, FullNotifyStage, YesNoStage, NotifyStage
from model import IdleStage
import uiconfig

#by elpis
from setting import setting 

def killall(name, sig):
	for pid in os.listdir('/proc'):
		cmdline_path = '/proc/%s/cmdline' % pid
		if os.path.exists(cmdline_path):
			try:
				pid = int(pid)
			except ValueError:
				continue

			if open(cmdline_path).read().startswith(name):
				os.kill(pid, sig)

class Snmp:
	SOCK_FILE = '/tmp/.snmpvideo.sock'

	key_code_table = {
		'0' : 0,
		'1' : 1,
		'2' : 2,
		'3' : 3,
		'4' : 4,
		'5' : 5,
		'6' : 6,
		'7' : 7,
		'8' : 8,
		'9' : 9,
		'*' : 10,
		'#' : 11,
		config.ASTERISK_4 : 12,
		config.Menu1 : 19,
		config.Menu2 : 20,
		'Left' : 23,
		'Right' : 24,
		'Up' : 25,
		'Down' : 26,
	}


	def __init__(self):
		try:
			os.unlink(self.SOCK_FILE)
		except OSError: 
			pass
		
		
		#print 'snmp: init'
		self.server_s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
		self.server_s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
		self.server_s.bind(self.SOCK_FILE)
		self.server_s.listen(5)

		self.snmp_s = None
		self.snmp_tag = None

		self.total_files = ''
		self.currrent_file = ''
		#self.current_ps = ''		

		self.server_tag = utils.Input(self.server_s.fileno(), self.accept_snmp)

		self.pid = os.fork()
		if not self.pid:
#			cmd = ('snmpd', '-f', '-c', '/usr/etc/snmp.conf')
			cmd = ('/usr/local/bin/snmpd', '-Ln',  '-f', '-c', '/usr/etc/snmp/snmpd.conf')
			os.execlp(cmd[0], *cmd)
			print 'Cannot run command: ', args
			sys._exit(1)

	def set_callinfo_trap_control(self, callinfo_trap_control):
		from setting import setting
		setting.set_callinfo_trap_control(callinfo_trap_control)

	def set_call_statistics_trap_control(self, call_statistics_trap_control):
		from setting import setting
		setting.set_call_statistics_trap_control(call_statistics_trap_control)
		
	def getCallStatisticsTrapControl(self):
		return self.call_statistics_trap_control
		
	def kill_snmp(self):
		self.snmp_tag = None
		self.snmp_s = None
		if self.pid:
			try:
				import signal
				os.kill(self.pid, signal.SIGKILL)
				os.waitpid(self.pid, 0)
			except:
				pass

	def destroy(self):
		self.snmp_tag = None
		self.snmp_s = None

		
		if config.snmp_debug:
			print 'snmp: pid:', self.pid
		import signal
		os.kill(self.pid, signal.SIGKILL)
		os.waitpid(self.pid, 0)
		self.pid = 0

		killall('ftpget', signal.SIGKILL)
		os.unlink(self.SOCK_FILE)

	def accept_snmp(self, fd, type):
		#print 'accept_snmp. fd = %d, type = %d' % (fd, type)
		assert type == evas.INPUT_READ

		self.snmp_s, addr = self.server_s.accept()
		self.snmp_tag = utils.Input(self.snmp_s.fileno(), self.handle_snmp)
		return True

	def recv_packet(self):
		c = self.snmp_s.recv(1)
		l = ord(c)
		c = self.snmp_s.recv(1)
		length = l = ord(c)+l*256
		
		msg = ''
		while l > 0:
			m = self.snmp_s.recv(l)
			l -= len(m)
			msg += m
		
		if length > 0:
			if config.snmp_debug:
				print 'snmp: recv_packet len:', length, ', mesg:', msg
		
		return msg		
		
	def send_packet(self, buf):
		import struct
		length = len(buf)
		len1 = length/256
		len2 = length - len1 * 256
		p = struct.pack('B', len1)
		self.snmp_s.send(p)
		p = struct.pack('B', len2)
		self.snmp_s.send(p)
		#print len1, len2, buf

		if length > 0:
			self.snmp_s.send(buf)
			
			if config.snmp_debug:
				print 'snmp: send_packet len:', length,  ', mesg:', buf
		
	def handle_snmp(self, fd, type):
		#print 'handle_snmp. fd = %d, type = %d' % (fd, type)
		if type & evas.INPUT_HUP:
			#runtime.manager.handle_snmp_message('connection_closed')
			
			if config.snmp_debug:
				print 'snmp: *** CONNECTION_CLOSED ***'
			return False

		assert type & evas.INPUT_READ
		str = self.recv_packet()
		#print '##### str = [%s]' % str
		cur_profile = profile.get_profile()
		#
		# SNMP python code - shchun
		#

# shchun : batch application for ip addresses
#		will use following temp values.
#		status.t_ipaddress = ''
#		status.t_netmask = ''
#		status.t_dhcp = ''
#		status.t_gateway = ''
#		status.t_dnsserver = ''
				
		if (str == 'set_ipMode'):
			str2 = self.recv_packet()
			ret = ''
			# static == '1', dhcp == '3'
			if str2 == '1': # static ip addresss
				ret = 0
			else: # dhcp 
				ret = 1
			status.t_dhcp = ret
			status.dumpTempIpInfo()
			#print "set_ipMode :", str
			
		elif (str == 'set_ipAddress'):
			str2 = self.recv_packet()
			status.t_ipaddress = str2
			status.dumpTempIpInfo()
			#print "set_ipAddress :", str
			
		elif (str == 'set_subnetMask'):
			str2 = self.recv_packet()
			status.t_netmask = str2
			status.dumpTempIpInfo()
			#print "set_subnetMask :", str	
			
		elif (str == 'set_gateway'):
			str2 = self.recv_packet()
			status.t_gateway = str2
			status.dumpTempIpInfo()
			#print "set_gateway :", str	
			
		elif (str == 'set_dnsServer'):
			str2 = self.recv_packet()
			status.t_dnsserver = str2
			status.dumpTempIpInfo()
			#print "set_dnsServer :", str	
					
		elif (str == 'set_systemApply'):
			#print "set_systemApply :", str
			if cur_profile == 1: # LAN
				if len(status.t_ipaddress) > 0:
					lan_profile.set_ipaddress(status.t_ipaddress)
				if len(status.t_netmask) > 0:
					lan_profile.set_netmask(status.t_netmask)
				if status.t_dhcp == 0:
					#print 'hyo: set_dhcp_false'
					lan_profile.set_dhcp(False)
					
				if status.t_dhcp == 1:
					#print 'hyo: set_dhcp_true'
					lan_profile.set_dhcp(True)
				if len(status.t_gateway) > 0:
					lan_profile.set_gateway(status.t_gateway)
				if len(status.t_dnsserver) > 0:
					dns_profile.set_dns1(status.t_dnsserver)

				lan_profile.save()
				dns_profile.save()
			else: # WIFI
				if len(status.t_ipaddress) > 0:
					wifi_profile.set_ipaddress(status.t_ipaddress)
				if len(status.t_netmask) > 0:
					wifi_profile.set_netmask(status.t_netmask)
				if status.t_dhcp == 0:
					#print 'hyo: set_dhcp_false'
					lan_profile.set_dhcp(False)
					
				if status.t_dhcp == 1:
					#print 'hyo: set_dhcp_true'
					lan_profile.set_dhcp(True)
				if len(status.t_gateway) > 0:
					wifi_profile.set_gateway(status.t_gateway)
				if len(status.t_dnsserver) > 0:
					wifi_profile.set_dns1(status.t_dnsserver)

				wifi_profile.save()
				dns_profile.save()			

			def reset_cb():
				import utils, time
				if runtime.vdciapp:
					runtime.vdciapp.req_deregister()
				time.sleep(1)				
				utils.releaseDhcp()
#MMW 2008.06.25 when reboot is called, reset vega and DCP related GPIO pin				
				utils.vega_reset_together()
#end of MMW		
#MMW	2008.07.07	when reboot send disassoc to AP and then unload the driver
				os.system('wlstop')
#end of MMW
				time.sleep(1)
				
				os.system('reboot')
			stage = NotifyStage( _('The phone will be reboot shortly'), uiconfig.baloon_setting_system_reset_icon, reset_cb)
			runtime.manager.stack_stage(stage)
		
		#
		# SNMP : KT Voip specific - in General.
		#
		elif (str == 'set_cpeId'):
			# DONE : re-register... 4/27
			#str2 = self.recv_packet()
			#vdci_setting.tel_num = str2
			#vdci_setting.save()
			import utils
			if status.get_register_mode() == status.Registered: 
				if len(vdci_setting.tel_num) == 0: 
					status.set_register_mode(status.NotRegistered)
					runtime.trapHandler.setRegisterStatus(2)
					#os.system('sipunregistered_noti.sh 1 1 &')
				else:
					if (utils.check_private_range()):  #private ip address
						if len(vdci_setting.primary_sbc_addr) == 0 \
								and len(vdci_setting.secondary_sbc_addr) == 0:
							status.set_register_mode(status.NotRegistered)
							runtime.trapHandler.setRegisterStatus(2)
							#os.system('sipunregistered_noti.sh 1 47 &')

					else: #gloval ip address
						if len(vdci_setting.proxy_addr) == 0 \
								and len(vdci_setting.backup_proxy_addr) == 0:
							status.set_register_mode(status.NotRegistered)
							runtime.trapHandler.setRegisterStatus(2)
							#os.system('sipunregistered_noti.sh 1 47 &')
					
			import menu
			stage = menu.RegisteringStage
			runtime.manager.stack_stage(stage)

			#self.init_vdciapp()
			#runtime.vdci_startup()			
		elif (str == 'get_voipSystemProtocol'):
			self.send_packet('2')
		#elif (str == 'get_sipUnRegReason'):

		elif (str == 'get_sipDomain'):
			self.send_packet(vdci_setting.domain)
		elif (str == 'set_sipDomain'):
			str2 = self.recv_packet()
			vdci_setting.domain = str2
			vdci_setting.save()
		#
		# SNMP : KT Voip specific - cscf related.
		#
		elif (str == 'get_cscfSvrPort'):
			index = self.recv_packet()
			ret = ''
			if index == '1':
				ret += vdci_setting.proxy_port
			else:
				ret += vdci_setting.backup_proxy_port
			self.send_packet(ret)
			#print "get_cscfSvrPort :", index		
		elif (str == 'set_cscfSvrPort'):
			index = self.recv_packet()
			str2 = self.recv_packet()
			if index == '1':
				vdci_setting.proxy_port = str2
			else:
				vdci_setting.backup_proxy_port = str2
			vdci_setting.save()
			#print "set_cscfSvrPort :", index, str		

		elif (str == 'get_cscfSvrAddr'):
			index = self.recv_packet()
			ret = ''
			if index == '1':
				ret += vdci_setting.proxy_addr
			else:
				ret += vdci_setting.backup_proxy_addr
			self.send_packet(ret)
			#print "get_cscfSvrAddr :", index		
		elif (str == 'set_cscfSvrAddr'):
			index = self.recv_packet()
			str2 = self.recv_packet()
			if index == '1':
				vdci_setting.proxy_addr = str2
			else:
				vdci_setting.backup_proxy_addr = str2
			vdci_setting.save()
			#print "set_cscfSvrAddr :", index, str2		
		
		elif (str == 'get_cscfSvrTransType'):
			# sip signaling type : should be AUTO
			index = self.recv_packet()
			self.send_packet("1")		# 1: AUTO

		#elif (str == 'get_SvrTableStatus'):
		#elif (str == 'set_SvrTableStatus'):

		#
		# SNMP : KT Voip specific - sbc related.
		#
		elif (str == 'get_sbcSvrPort'):
			index = self.recv_packet()
			ret = ''
			if index == '1':
				ret += vdci_setting.primary_sbc_port
			else:
				ret += vdci_setting.secondary_sbc_port
			self.send_packet(ret)
			#print "get_sbcSvrPort :", index, ret

		elif (str == 'set_sbcSvrPort'):
			index = self.recv_packet()
			str2 = self.recv_packet()
			if index == '1':
				vdci_setting.primary_sbc_port = str2
			else:
				vdci_setting.secondary_sbc_port = str2
			vdci_setting.save()
			#print "set_sbcSvrPort :", index, str2
			
		elif (str == 'get_sbcSvrAddr'):
			index = self.recv_packet()
			ret = ''
			if index == '1':
				ret += vdci_setting.primary_sbc_addr
			else:
				ret += vdci_setting.secondary_sbc_addr
			self.send_packet(ret)
			#print "get_sbcSvrAddr :", index	

		elif (str == 'set_sbcSvrAddr'):
			index = self.recv_packet()
			str2 = self.recv_packet()
			if index == '1':
				vdci_setting.primary_sbc_addr = str2
			else:
				vdci_setting.secondary_sbc_addr = str2
			vdci_setting.save()
			#print "set_sbcSvrAddr :", index, str2	
			
		elif (str == 'get_sbcSvrTransType'):
			# sip signaling type : udp only
			index = self.recv_packet()
			self.send_packet("2")	
			#print "get_sbcSvrTransType :", index									

		#
		# SNMP: KT Voip specific - Sip Ua table
		#
		elif (str == 'get_sipUaUrlMode'):
			# 1: sip, 2:tel, value used when sip registration.
			index = self.recv_packet()
			ret = ''
			try:
				if vdci_setting.reg_url_mode == 0: # sip
					ret += '1' # sip: per KT snmp spec.
				else:	# tel
					ret += '2' # tel: per KT snmp spec.
			except:
				vdci_setting.reg_url_mode = 1
				vdci_setting.save()
				ret += '1'
			self.send_packet(ret)
			#print "get_sipUaUrlMode :", index	
		elif (str == 'set_sipUaUrlMode'):
			index = self.recv_packet()
			mode = self.recv_packet()
			if mode == '1':
				vdci_setting.reg_url_mode = 0
			else:
				vdci_setting.reg_url_mode = 1
			vdci_setting.save()
			#print "set_sipUaUrlMode :", index, mode
			
		elif (str == 'get_sipUaRegIndex'):
			# TODO: put proper value according to CRCF, SBC proxy
			#		to get CRCR index from core software

			# DONE: registered == 1, else == -1
			index = self.recv_packet()
			if status.get_register_mode()== status.Registered:
				if status.register_proxy=='0' or status.register_proxy=='2':
					self.send_packet("1")
				else:
					self.send_packet("2")
				
			else:
				self.send_packet("-1")
			
			#print "get_sipUaRegIndex :", index

		elif (str == 'get_sipUaReasonCode'):
			# TODO: need to implement according to Q.850 table
			#		need to contect KT appointed person to clarify requirement esp. Q.850
			
			# DOWN: if reg, 200, if unreg. -1 ( to be updated) 
			index = self.recv_packet()
			if status.get_register_mode() == status.Registered:
				self.send_packet("200")
			else:
				try:
					if (status.reason_code == "None" or status.reason_code == None):
						self.send_packet("0")
					else:
						self.send_packet(status.reason_code)
				except:
					self.send_packet("-1")
			
			#print "get_sipUaReasonCode :", index			

		elif (str == 'get_sipUaExpires'):
			# TODO: for now sends '3600', need to reflect real value of VDCIApp
			#		for now OK.
			index = self.recv_packet()
			#self.send_packet("3600")
			self.send_packet(vdci_setting.subscriber_expires)
			#print "get_sipUaExpires :", index				

			
		elif (str == 'get_sipUaSIPURI'):
			index = self.recv_packet()
			# assuming there is only 1 ua, index = 1.  

			if len(vdci_setting.sip_uri):
				self.send_packet(vdci_setting.sip_uri)
			else:
				uri = 'sip:' + vdci_setting.tel_num + '@' + vdci_setting.domain
				self.send_packet(uri)

			'''
			uri = 'sip:' + vdci_setting.tel_num + '@' + vdci_setting.domain
			
			self.send_packet(uri)

			print "get_sipUaSIPURI :", index, uri
			'''
			
		elif (str == 'set_sipUaSIPURI'):
			index = self.recv_packet()
			# assuming there is only 1 ua, index = 1.  
			uri = self.recv_packet()
			try:
				'''
				uri = uri.replace('sip:', '')
				auth_name, domain = uri.split('@')
				vdci_setting.auth_name = auth_name
				vdci_setting.domain = domain
				'''
				vdci_setting.sip_uri=uri
				vdci_setting.save()
			except:
				pass

			#print "set_sipUaSIPURI :", index, uri

		elif (str == 'get_sipUaId'): # == TEL_NUM
			index = self.recv_packet()
			# assuming there is only 1 ua, index = 1.
			# NOTE : if you send null, sipUaTable will not show.
			ret = ''
			if len(vdci_setting.tel_num):
				ret += vdci_setting.tel_num
			else:
				ret += ''
			self.send_packet(ret)
			#print "get_sipUaId :", index
			
		elif (str == 'set_sipUaId'):
			index = self.recv_packet()
			# assuming there is only 1 ua, index = 1.  
			id = self.recv_packet()
			vdci_setting.tel_num = id
			vdci_setting.save()
			#print "set_sipUaId :", index, id			

		elif (str == 'get_sipUaPass'):
			index = self.recv_packet()
			# assuming there is only 1 ua, index = 1.  
			self.send_packet(vdci_setting.auth_pwd)
			#print "get_sipUaId :", index
			
		elif (str == 'set_sipUaPass'):
			index = self.recv_packet()
			password = self.recv_packet()
			# assuming there is only 1 ua, index = 1.  
			vdci_setting.auth_pwd = password
			vdci_setting.save()
			#print "set_sipUaId :", index, password				

		elif (str == 'get_sipUaTelURI'):
			# assuming sipUaTelURI == "tel" + sipUaId
			index = self.recv_packet()
			self.send_packet('tel:' + vdci_setting.tel_num)
			#print "get_sipUaTelURI :", index	
			
		elif (str == 'set_sipUaTelURI'):	
			# TODO: need clarification.
			#		how about raise an exception?
			#		4/27 assume not used.
			index = self.recv_packet()
			uri = self.recv_packet()
			#print "set_sipUaTelURI :", index, uri
		
		elif (str == 'get_sipUaPrivateId'):
			index = self.recv_packet()
			# assuming there is only 1 ua, index = 1
			# assuming sipUaPrivateId == sipUaId.  ==> X
			# 4/27 assumes as auth_name.
			self.send_packet(vdci_setting.auth_name)
			#print "get_sipUaPrivateId :", index
			
		elif (str == 'set_sipUaPrivateId'):
			index = self.recv_packet()
			id = self.recv_packet()
			vdci_setting.auth_name = id
			vdci_setting.save()
			#print "set_sipUaPrivateId :", index, id				
			
		elif (str == 'del_sipUaTable'):
			# Mar27 new
			# 4/27 need clarifiction... : will be implemented at daejun...
			index = self.recv_packet()
			#changed by elpis
			#sipuaid = self.recv_packet()
			vdci_setting.tel_num = ""
			vdci_setting.auth_pwd = ""
			vdci_setting.auth_name = ""
			vdci_setting.sip_uri=''
			vdci_setting.save()
			
		#
		# SNMP: KT Voip specific - DECT handy table
		#

		elif (str == 'get_sipUaIndexNo'):
			# assuming there is only 1 ua, index = 1.  
			index = self.recv_packet()
			
			#ELPIS
			if index == '1':
				import time
				runtime.dectCallManager.getSnmpInfo()
				time.sleep(2.5)

				if config.snmp_debug:
					print setting.dect_information_list
				
			if (int(index) <= len(setting.dect_information_list)):

				temp=setting.dect_information_list[int(index)-1].split(":")
				if temp[0] == '1':
					if (status.get_register_mode() == status.Registered):
						self.send_packet("1")
					else:
						self.send_packet("-1")	
				else:
					self.send_packet("-1")	
			else:
				self.send_packet("-1")
			
			#elpis end		
			#print "get_sipUaIndexNo :", index	
			
		elif (str == 'get_handyTelNo'):
			# assuming handyTelNo == sipUaId.  
			index = self.recv_packet()

			#elpis
			if (int(index) <= len(setting.dect_information_list)):
				temp=setting.dect_information_list[int(index)-1].split(":")
			
				if temp[0] == '1':

					self.send_packet(vdci_setting.tel_num)
				else:
					self.send_packet("")
			else:
				self.send_packet("")
			
			#elpis end
			#self.send_packet(vdci_setting.auth_name)
			#print "get_handyTelNo :", index			

		elif (str == 'get_handyModelName'):
			# TODO: contect KT appointed person of LGN sales dept, get proper value of this field.
			index = self.recv_packet()
			#elpis
			if (int(index) <= len(setting.dect_information_list)):
				temp=setting.dect_information_list[int(index)-1].split(":")
				if temp[0] == '1':
					self.send_packet("LN201-805D")
				else:
					self.send_packet("")	
					
			else:
				self.send_packet("")
			#elpis end
			#self.send_packet("IP3870")
			#print "get_handyModelName :", index			
		
		elif (str == 'get_handyFwVersion'):
			# TODO: get info from base station s/w
			index = self.recv_packet()

	
			if (int(index) <= len(setting.dect_information_list)):
				try:
					temp=setting.dect_information_list[int(index)-1].split(":")
					if temp[0] == '1':
						self.send_packet(temp[1]+"."+temp[2]+"."+temp[3])
					else:
						self.send_packet("0.0.0")		
				except:
					self.send_packet("0.0.0")	
			else:
				self.send_packet("0.0.0")
		
			
			#self.send_packet("1.1.1")
			#print "get_handyFwVersion :", index			

		elif (str == 'get_handyStatus'):
			# TODO: get info from base station s/w
			index = self.recv_packet()

			#elpis
			if (int(index) <= len(setting.dect_information_list)):
				temp=setting.dect_information_list[int(index)-1].split(":")
				if temp[0] == '1':
					self.send_packet("1")
				else:
					self.send_packet("0")		
					
			else:
				self.send_packet("0")
				
			#elpis end			
			
			#self.send_packet("1")
			#print "get_handyStatus :", index				

		elif (str == 'get_handySerialNum'):
			# TODO: get info from base station s/w. 
			index = self.recv_packet()
			
			#elpis
			if (int(index) <= len(setting.dect_information_list)):
				temp=setting.dect_information_list[int(index)-1].split(":")
				
				import struct
				try:
					intSerial = struct.unpack('L', temp[4])[0]
					self.send_packet("%s" % intSerial)
				except:
					self.send_packet("")
			else:
				self.send_packet("")
			#elpis end
			
			
			#self.send_packet("2345")
			#print "get_handySerialNum :", index

		elif (str == 'get_HandyReboot'):
			# not used by KT for now
			index = self.recv_packet()
			self.send_packet("0")
			#print "get_HandyReboot :", index

		elif (str == 'set_HandyReboot'):
			# not used by KT for now
			index = self.recv_packet()
			reb = self.recv_packet()
			#print "set_HandyReboot :", index, reb		
		
		elif (str == 'get_smsPw'):
			# not used by KT for now
			index = self.recv_packet()
			self.send_packet("Not Support")
			#print "get_smsPw :", index	

		elif (str == 'set_smsPw'):
			# not used by KT for now
			index = self.recv_packet()
			pa = self.recv_packet()
			#print "set_smsPw :", index, pa		
			
		elif (str == 'get_handyCallStatus'):
			# TODO: get info from base station s/w. 
			index = self.recv_packet()
		
			#elpis
			if (int(index) <= len(setting.dect_information_list)):
				temp=setting.dect_information_list[int(index)-1].split(":")

				if temp[0] == '1':
					dectStatus = runtime.dectCallManager.getDectStatus()
					
					if dectStatus == 0:
						self.send_packet("1")
					else:
						self.send_packet("2")	
				else:
					self.send_packet("0")
			else:
				self.send_packet("0")
			#elpis end
		
			#self.send_packet("")
			#print "get_handyCallStatus :", index	
			
		#
		# SNMP: KT Voip specific - Call statstics
		#			
		elif (str == 'get_callStaticsVoipOrgCall'):
			# need planning the structure
			index = self.recv_packet()
			self.send_packet("%d" % setting.voipOrgCall)
			#print "get_callStaticsVoipOrgCall :", index
			
		elif (str == 'get_callStaticsVoipTermCall'):
			# need planning the structure
			index = self.recv_packet()
			self.send_packet("%d" % setting.voipTermCall)
			#print "get_callStaticsVoipTermCall :", index			
			
		elif (str == 'get_callStaticsVoipOrgCallTime'):
			# need planning the structure
			index = self.recv_packet()
			try:
				self.send_packet("%d" % (int(setting.voipOrgCallTime)/60))
			except:	
				self.send_packet("%d" % setting.voipOrgCallTime/60)

			#print "get_callStaticsVoipOrgCallTime :", index							
				
		elif (str == 'get_callStaticsVoipTermCallTime'):
			# need planning the structure
			index = self.recv_packet()
			try:
				self.send_packet("%d" % (int(setting.voipTermCallTime)/60))
			except:
				self.send_packet("%d" % setting.voipTermCallTime/60)
			
			#print "get_callStaticsVoipTermCallTime :", index	

		elif (str == 'get_callStaticsCallSucc'):
			# need planning the structure
			index = self.recv_packet()
			self.send_packet("%d" % setting.callSucc)
			#print "get_callStaticsCallSucc :", index
						
		elif (str == 'get_callStaticsDropCall'):
			# need planning the structure
			index = self.recv_packet()
			self.send_packet("%d" % setting.dropCall)
			#print "get_callStaticsDropCall :", index

		elif (str == 'get_callStaticsCallErr'):
			# need planning the structure
			index = self.recv_packet()
			self.send_packet("%d" % setting.callErr)
			#print "get_callStaticsDropCall :", index
		#
		# SNMP : etc
		#
		elif (str == 'get_manual_download_url'):
			# ex) http://150.150.141.1:2020/

			#server_url = 'http://%s:%d/'%(setting.download_server_ip, setting.download_server_port)
			from dnsetting import down_setting
			server_url = down_setting.get_download_server_url()
			#print "get_manual_download_url :"
			self.send_packet(server_url)
			
		
		elif (str == 'set_manual_download_url'):
			rec = self.recv_packet()
			# TODO : http://server:port/
			# ex) http://150.150.141.1:2020/
			rec= rec.replace('http://', '')
			rec=rec.split('/')[0]
			
			#setting.download_server_ip = rec.split(':')[0]
			#setting.download_server_port = int(rec.split(':')[1])
			#setting._save()
			from dnsetting import down_setting
			if len(rec) !=0 :
				down_setting.set_download_server_ip(rec.split(':')[0])
				try:
					down_setting.set_download_server_port(int(rec.split(':')[1]))
				except:
					down_setting.set_download_server_port(0)
			else:
				down_setting.set_download_server_ip("")
				down_setting.set_download_server_port(0)

			#print "set_manual_download_url :", rec
		
		elif (str == 'start_again'):
			print "kill snmp client and start again"

		#
		# SNMP : DOT11
		#
		elif (str == 'get_ssid' ):
			self.send_packet(wifi_profile.essid)
		elif (str == 'set_ssid' ):
			str2 = self.recv_packet()
			wifi_profile.essid = str2
			wifi_profile.save()
		elif (str == 'get_std_mode' ):
			self.send_packet("b/g")
		elif (str == 'set_std_mode' ):
			str2 = self.recv_packet()
			
			if config.snmp_debug:
				print 'snmp: set_std_mode - handler undefined.'
			self.send_packet("b/g")
		elif (str == 'get_config_channel' ):
			self.send_packet(wifi_profile.channelid)
		elif (str == 'set_config_channel' ):
			str2 = self.recv_packet()
			
			if config.snmp_debug:
				print 'snmp: set_config_channel - handler undefined.'
			self.send_packet("0")
		elif (str == 'get_current_channel' ):
			if config.snmp_debug:
				print 'snmp: get_current_channel - handler undefined.'
			self.send_packet(wifi_profile.channelid)
		elif (str == 'get_auth_mode' ):
		# 1: open, 2: shared, 3: WPA, 4: WPA-PSK
			ret = '1'
			if wifi_profile.authentication == 'SHARED':
				ret = '2'
			elif wifi_profile.authentication == 'WPA':
				ret = '3'
			elif wifi_profile.authentication == 'WPA-PSK':
				ret = '4'

			self.send_packet(ret)
		elif (str == 'set_auth_mode' ):
		# 1: open, 2: shared, 3: WPA, 4: WPA-PSK
			str2 = self.recv_packet()
			ret = 'NONE'
			if str2 == '2':
				ret = 'SHARED'
			elif str2 == '3':
				ret = 'WPA'
			elif str2 == '4':
				ret = 'WPA-PSK'
			wifi_profile.authentication = ret
			wifi_profile.save()
			#self.send_packet(str2)

		elif (str == 'get_encryption_method' ):
		# 1: none, 2: wep64, 3: wep128, 4: tkip, 5: aes
		# shchun : how to handle tkip, aes??
			ret = '1'
			if wifi_profile.encryption == 'WEP64BIT':
				ret = '2'
			elif wifi_profile.encryption == 'WEP128BIT':
				ret = '3'
			self.send_packet(ret)	
		elif (str == 'set_encryption_method' ):
		# 1: none, 2: wep64, 3: wep128, 4: tkip, 5: aes
			str2 = self.recv_packet()
			ret = 'NONE'
			if str2 == '2':
				ret = 'WEP64BIT'
			elif str2 == '3':
				ret = 'WEP128BIT'
			wifi_profile.encryption = ret
			wifi_profile.save()
			#self.send_packet(str2)
		elif (str == 'get_encryption_key' ):
			auth = wifi_profile.authentication
			enc = wifi_profile.encryption 
			ret = ''
			if (auth == 'NONE' or auth == '') and (enc == 'NONE' or enc == ''):
				#ret = 'N/A'
				ret = ''
			elif auth == 'WPA' and (enc == 'NONE' or enc == ''):
				# shchun: need to revise
				#ret = 'N/A'
				ret = ''
			elif auth == 'WPA-PSK' and (enc == 'NONE' or enc == ''):
				ret = wifi_profile.wpa_psk_tkip
			elif (auth == 'NONE' or auth == '') and (enc == 'WEP64BIT'):
				kn = wifi_profile.wepkeyno_64
				if kn == '1':
					ret = wifi_profile.wepkey1_64
				elif ke == '2':
					ret = wifi_profile.wepkey2_64
				elif ke == '3':
					ret = wifi_profile.wepkey3_64
				elif ke == '4':
					ret = wifi_profile.wepkey4_64
				else:
					
					if config.snmp_debug:
						print 'snmp: error key selection not acceptble...1'	
			elif (auth == 'NONE' or auth == '') and (enc == 'WEP64BIT'):
				kn = wifi_profile.wepkeyno_128
				if kn == '1':
					ret = wifi_profile.wepkey1_128
				elif ke == '2':
					ret = wifi_profile.wepkey2_128
				elif ke == '3':
					ret = wifi_profile.wepkey3_128
				elif ke == '4':
					ret = wifi_profile.wepkey4_128
				else:
					
					if config.snmp_debug:
						print 'snmp: error key selection not acceptble...2'		
			self.send_packet(ret)
			
		elif (str == 'set_encryption_key' ):
			str2 = self.recv_packet()
			auth = wifi_profile.authentication
			enc = wifi_profile.encryption 
			ret = ''
			if (auth == 'NONE' or auth == '') and (enc == 'NONE' or enc == ''):
				
				if config.snmp_debug:
					print 'snmp: error key not acceptble...'				
			elif auth == 'WPA' and (enc == 'NONE' or enc == ''):
				# shchun: need to revise
				
				if config.snmp_debug:
					print 'snmp: error key not acceptble...- WPA'				
			elif auth == 'WPA-PSK' and (enc == 'NONE' or enc == ''):
				wifi_profile.wpa_psk_tkip = str2
			elif (auth == 'NONE' or auth == '') and (enc == 'WEP64BIT'):
				kn = wifi_profile.wepkeyno_64
				if kn == '1':
					wifi_profile.wepkey1_64 = str2
				elif ke == '2':
					wifi_profile.wepkey2_64 = str2
				elif ke == '3':
					wifi_profile.wepkey3_64 = str2
				elif ke == '4':
					wifi_profile.wepkey4_64 = str2
				else:
					
					if config.snmp_debug:
						print 'snmp: error key selection not acceptble...3'	
			
			elif (auth == 'NONE' or auth == '') and (enc == 'WEP64BIT'):
				kn = wifi_profile.wepkeyno_128
				if kn == '1':
					wifi_profile.wepkey1_128 = str2
				elif ke == '2':
					wifi_profile.wepkey2_128 = str2
				elif ke == '3':
					wifi_profile.wepkey3_128 = str2
				elif ke == '4':
					wifi_profile.wepkey4_128 = str2	
				else:
					if config.snmp_debug:
						print 'snmp: error key selection not acceptble...4'	
			wifi_profile.save()
		elif (str == 'get_signal_level' ):
			# need to revise
			try:
				pvalue = os.popen('wl rssi')
				pstr = pvalue.read()
				pstr = pstr[:-1]
				def get_siglevel(pwr):
					val = abs(int(pwr))
					icon_idx='0'
					if val == 0:
						icon_idx='0'
					elif 0 < val and val <= 55:
						icon_idx='5'
					elif 55 < val and val <= 65:
						icon_idx='4'
					elif 65 < val and val <= 75:
						icon_idx='3'
					elif 75 < val and val <= 85:
						icon_idx='2'
					else:
						icon_idx='1'
					return icon_idx
				
				#print 'pstr == ', pstr
				self.send_packet(get_siglevel(pstr))

			except:
				#print 'wifi-exception'
				self.send_packet('0')
		elif (str== 'set_restart_web_server'):
			# add Mar31 upon request of Cho
			os.system("killall webs")
			os.system("webs &")
		elif (str == 'test'):
			self.send_packet('ok')
		# KA: [20080403] snmp UI
		elif (str == 'get_linestatus'):
			if self.check_download_ready() == True:
				# CALL이 오는 경우 BUSY처리를 위해 
				status.snmp_start = True
				self.send_packet('ok')
			else:
				self.send_packet('busy')
		elif (str == 'found_download_module'):
			stage = SnmpDownloadStage()
			runtime.manager.change_stage(stage)
		elif (str.startswith ('total_number_of_files:')):
			key, value = str.split(':')
			self.total_files = value
		elif (str.startswith('current_package:')):
			key, value = str.split(':')
			self.currrent_file = value
			#print '##############', self.total_files, self.currrent_file
			#stage = SnmpDownloadingStage(self.total_files, self.currrent_file)
			if runtime.manager.stage.get_name() == 'snmpdownload':
				stage = SnmpDownloadingStage(self.total_files, self.currrent_file)
				runtime.manager.change_stage(stage)
			elif runtime.manager.stage.get_name() == 'snmpfail':
				stage = SnmpDownloadingStage(self.total_files, self.currrent_file)
				runtime.manager.change_stage(stage) 
			else:
				runtime.manager.stage.update_currrent_file(self.currrent_file)
		elif (str.startswith('percentage_of_current_file:')):
			key, value = str.split(':')
			current_ps = value
			if runtime.manager.stage.get_name() == 'snmpdownloading':
				runtime.manager.stage.update_status(current_ps)
				self.send_packet('ok')
		elif (str.startswith('install_downloaded_modules')):
			stage = SnmpDownloadInstallStage()
			runtime.manager.change_stage(stage)
		elif (str == 'install_finished'):
			stage = FullNotifyStage(_('Install complete.')+ '\n' +('Reboot')+'...', uiconfig.baloon_message_icon)
			runtime.manager.change_stage(stage)
			import utils, time
			if runtime.vdciapp:
				runtime.vdciapp.req_deregister()
			time.sleep(1)			
			utils.releaseDhcp()
#MMW 2008.06.25 when reboot is called, reset vega and DCP related GPIO pin				
			utils.vega_reset_together()
#end of MMW	
#MMW	2008.07.07	when reboot send disassoc to AP and then unload the driver
			os.system('wlstop')
#end of MMW
			time.sleep(1)
			os.system('reboot')

		elif (str.startswith('download_error:')):
			key, value = str.split(":")

			if (value == '20'): 
				#stage = NotifyStage(_('Download login failed.'), uiconfig.baloon_message_icon)
				stage = NotifyStage(_('Download login failed.'), uiconfig.baloon_message_icon)
				
			elif (value == '21'):
				#stage = NotifyStage(_('Download connection failed.'), uiconfig.baloon_message_icon)
				stage = NotifyStage(_('Download connection failed'), uiconfig.baloon_message_icon)
				
			elif (value == '22'): 
				#stage = NotifyStage(_('Download connection failed.'), uiconfig.baloon_message_icon)
				stage = NotifyStage(_('Download connection failed'), uiconfig.baloon_message_icon)
	
			elif (value == '24'): 
				#stage = NotifyStage(_('Download server failed.'), uiconfig.baloon_message_icon)
				stage = NotifyStage(_('Download server failed.'), uiconfig.baloon_message_icon)

			elif (value == '27'):
				#stage = NotifyStage(_('Download checksum failed.'), uiconfig.baloon_message_icon)
				stage = NotifyStage(_('Download checksum failed.'), uiconfig.baloon_message_icon)
				
			else:
				#stage = NotifyStage(_('Download server setting is not valid'), uiconfig.baloon_message_icon)
				stage = NotifyStage(_('Download failed'), uiconfig.baloon_message_icon)
	
			runtime.manager.change_stage(stage, True)
			#print "download error"

			#call 허용
			status.snmp_start = False


		elif (str == 'get_retry'):
			if runtime.manager.stage.get_name() == 'snmpfail':
				user_input = runtime.manager.stage.user_input()
				self.send_packet(user_input)
				if user_input == 'no':
					runtime.manager.change_stage(IdleStage, True)

		elif (str == 'get_upgrade_status'):			#send  download status to SNMP
			strval= '%s'%runtime.manual_down_status
			self.send_packet(strval)

		elif (str == 'set_callinfo_trap_control'):
			lvalue = self.recv_packet()
			self.set_callinfo_trap_control(int(lvalue))

		elif (str == 'set_call_statistics_trap_control'):
			lvalue = self.recv_packet()
			self.set_call_statistics_trap_control(int(lvalue))
		elif (str == 'reboot'):
			# IMPROVEME: noti user...
			def reset_cb():
				import utils, time
				if runtime.vdciapp:
					runtime.vdciapp.req_deregister()
				time.sleep(1)				
				utils.releaseDhcp()
#MMW 2008.06.25 when reboot is called, reset vega and DCP related GPIO pin				
				utils.vega_reset_together()
#end of MMW		
#MMW	2008.07.07	when reboot send disassoc to AP and then unload the driver
				os.system('wlstop')
#end of MMW
				time.sleep(1)

				os.system('reboot')
			stage = NotifyStage( _('The phone will be reboot shortly'), uiconfig.baloon_setting_system_reset_icon, reset_cb)
			runtime.manager.stack_stage(stage)
		
		elif (str == 'set_configInit'):
			cval= self.recv_packet()
			def reset_cb():
				import utils,time
				if runtime.vdciapp:
					runtime.vdciapp.req_deregister()
				time.sleep(1)				
				utils.releaseDhcp()
#MMW 2008.06.25 when reboot is called, reset vega and DCP related GPIO pin				
				utils.vega_reset_together()
#end of MMW	
#MMW	2008.07.07	when reboot send disassoc to AP and then unload the driver
				os.system('wlstop')
#end of MMW
				time.sleep(1)

				os.system('reboot')
			def sys_reset():
				import utils
				utils.system_reset()
				stage = NotifyStage( _('The phone will be reboot shortly'), uiconfig.baloon_setting_system_reset_icon, reset_cb)
				runtime.manager.stack_stage(stage)
			def setting_reset():
				#utils.system_reset()
				setting.reset()
				stage = NotifyStage( _('The phone will be reboot shortly'), uiconfig.baloon_setting_system_reset_icon, reset_cb)
				runtime.manager.stack_stage(stage)
			if  cval == '1':
				# factory init
				reset_action = sys_reset 
				message = _('System reset!')
			else:
				reset_action = setting_reset
				message = _('Settings reset!')

			reset_duration = 3000
			stage = NotifyStage(message, uiconfig.baloon_setting_system_reset_icon, reset_action, duration=reset_duration)
			runtime.manager.stack_stage(stage)
				# setting init
			
		# KA: [20080403] snmp UI ==
		else:
			if config.snmp_debug:
				print 'snmp: ERROR no handler for', str
			
		return True
	
	def check_download_ready(self):
		if runtime.manager.stage.get_name() == 'idle':
			return True
		else:
			return False

# KA: [20080403] snmp UI
class SnmpDownloadStage(Stage):
	name = 'snmpdownload'
	def __init__(self):
		#message = _('New software detacted.') + '\n' +_('Start updating')
		message = _('New software detacted.') + '\n' +_('Start updating')
		icon = uiconfig.phone_setting_icon
		self.ui = NotifyUI(message)
	
	def handle_key(self, key):
		return True
		# for test
		if key in ('1', '2', '3', '4', '5', '6', '7', '8', '9'):
			stage = SnmpDownloadingStage(5, 1)
			runtime.manager.change_stage(stage)
		return False
		
class SnmpDownloadingStage(Stage):
	name = 'snmpdownloading'
	def __init__(self, total_files='', currrent_file='', step=1):
		#msg = _('Updating S/W.')+'\n'+_('Dont turn off the power.')+'\n'+('Please wait for a monent.')+'\n'+ ('Updating...')
		msg = _('Updating S/W.') + '\n' + _('Dont turn off the power.')# + '\n' + _('Updating...')
		# UI object add
		self.ui = FullBaloonDownloadUI(message = msg)
		self.ui.set_state(currrent_file, total_files)

	def update_status(self, current_ps):
		self.ui.set_value(current_ps)

	def update_currrent_file(self, current_file):
		self.ui.set_current_file(current_file)
		
	def handle_key(self, key):
		return True
		# for test
		if key in ('1', '2', '3', '4', '5', '6', '7', '8', '9'):
			self.update_status(key)
		elif key == config.Menu1:
			stage = SnmpDownloadInstallStage()
			runtime.manager.change_stage(stage)
			return True
		return False

class SnmpDownloadInstallStage(Stage):
	name = 'snmpdownloadinstall'
	def __init__(self):
		icon = uiconfig.phone_setting_icon
		#msg = _('S/W download complete.')+ '\n' + ('Please wait for a monent.')
		message = _('Download finished') +  _('After reboot, continues to update software')
		self.ui = NotifyUI(message, icon)
		# UI object add
		#self.ui = FullBaloonDownloadUI(message = msg, auto_duration = True)
		#self.ui.update_status()
		self.reboot_timer = utils.Timer(2*1000, self.rebooting)
		
	def rebooting(self):
#MMW 2008.06.25 when reboot is called, reset vega and DCP related GPIO pin				
		utils.vega_reset_together()
#end of MMW	
#MMW	2008.07.07	when reboot send disassoc to AP and then unload the driver
		os.system('wlstop')
#end of MMW
		os.system('reboot')

	def destroy(self):
		self.ui.progress_timer = None
		Stage.destroy(self)
		
	
	def handle_key(self, key):
		return True
		# for test
		if key in ('1', '2', '3', '4', '5', '6', '7', '8', '9'):
			self.update_status(key)
		return False


class SnmpFailStage(Stage):
	name = 'snmpfail'
	def __init__(self):
		icon = uiconfig.phone_setting_icon
		msg = _('Download server setting is not valid')
		self.ui = FullNotifyUI(msg, icon, '', _('OK'), '')
		self.choice = 'yet'
	def yes_cb(self):
		self.choice = 'ok'
		
	def no_cb(self):
		self.choice = 'no'
		
	def user_input(self):
		return self.choice

	def handle_key(self, key):
		if key == config.Menu1 or key == config.Red:
			runtime.manager.change_stage(IdleStage, True)
		return True

	'''
	name = 'snmpfail'
	def __init__(self,left =_('YES'), right=_('NO')):
		icon = uiconfig.phone_setting_icon
		msg = _('Download faied, Retry?.')
		self.ui = FullNotifyUI(msg, icon, '', left, right)
		self.choice = 'yet'
	def yes_cb(self):
		self.choice = 'ok'
		
	def no_cb(self):
		self.choice = 'no'
		
	def user_input(self):
		return self.choice

	def handle_key(self, key):
		if key == config.Menu1: self.yes_cb()
		elif key == config.Menu2: self.no_cb()
		else: return False
		return True
	'''

# KA: [20080403] snmp UI ==