Example #1
0
def check_o2_balance():
    """Check o2 balance"""
    ser = serial.Serial(find_device())
    code = "*#10#"
    data="AT+CUSD=1,%s,15" % pdu.pack7bit(code)[1].encode('hex').upper()
    ser.write(data + "\r")
    start = int(os.times()[4])
    while start + 10 > int(os.times()[4]):
        line = ser.readline().replace('"',"")
        if "+CUSD:" in line:
            response = line.split(",")[1]
            result = gsm0338().decode(pdu.unpack7bit(response.decode('hex')))[0]
            result = result[:-1].replace(u'Your balance is \xa3','')
            logging.debug("Balance is %s" %result)
            return float(result)
    return -1
Example #2
0
def check_o2_balance():
    """Check o2 balance"""
    ser = serial.Serial(find_device())
    code = "*#10#"
    data = "AT+CUSD=1,%s,15" % pdu.pack7bit(code)[1].encode('hex').upper()
    ser.write(data + "\r")
    start = int(os.times()[4])
    while start + 10 > int(os.times()[4]):
        line = ser.readline().replace('"', "")
        if "+CUSD:" in line:
            response = line.split(",")[1]
            result = gsm0338().decode(pdu.unpack7bit(
                response.decode('hex')))[0]
            result = result[:-1].replace(u'Your balance is \xa3', '')
            logging.debug("Balance is %s" % result)
            return float(result)
    return -1
Example #3
0
 def test_gsm_encode(self):
     c = smspdu.gsm0338()
     self.assertEquals(c.encode('hello'), 'hello')
     self.assertEquals(c.encode(u'\u20AC'), '\x1b\x65')
     self.assertRaises(UnicodeError, c.encode, u'\u20AD')
Example #4
0
 def test_gsm_encode(self):
     c = smspdu.gsm0338()
     self.assertEqual(c.encode('hello'), b'hello')
     self.assertEqual(c.encode('\u20AC'), b'\x1b\x65')
     self.assertRaises(UnicodeError, c.encode, '\u20AD')
Example #5
0
def main():
	global modemport, modem_fh, timeout_for_answer, pin
	global use_cleartext, cancel_ussd_session, debug
	global expect, expect_logfilename, ussd_queries
	global modem_lockfile, saved_stty_value, gsm_codec

	# Set up signal handler for INT (Ctrl-C) and TERM
	signal.signal(signal.SIGINT, clean_exit)
	signal.signal(signal.SIGTERM, clean_exit)
	
	# Parse options and react to them
	parser = create_cmd_line_parser()
	parsed = parser.parse_args()
	
	if parsed.modem != None:
		modemport = parsed.modem
	if parsed.timeout:
		timeout_for_answer = parsed.timeout
	if parsed.pin != None:
		pin = parsed.pin
	if parsed.cleartext:
		use_cleartext = True
	if parsed.no_cleartext:
		use_cleartext = False
	if parsed.cancel:
		cancel_ussd_session = True
	if parsed.debug:
		debug = True
	if parsed.logfile != None:
		expect_logfilename = parsed.logfile
	
	loglevel = logging.DEBUG if debug else logging.INFO
	logging.basicConfig(level=loglevel)
						
	# Further arguments are USSD queries
	if parsed.ussd_queries:
		ussd_queries = parsed.ussd_queries
	
	logging.debug("Start, Version %s, Args: %s", VERSION, all_args)
	
	gsm_codec = smspdu.gsm0338()
	
	check_modemport(modemport)

	# Obtain exclusive access to modem
	modem_lockfile = lock_modemport(modemport)
	if not modem_lockfile:
		logging.error("Can't get lock file for %s!\n" +
			"* Wrong modem device? (use -m <dev>)?\n" +
			"* Stale lock file for %s in /var/lock?", 
			modemport, modemport)
		sys.exit(exit_error)
		
	# Locking succeeded, so set up exit hook
	atexit.register(clean_up)

	logging.debug("Opening modem")
	try:
		modem_fh = serial.serial_for_url(modemport, timeout=timeout_for_answer)
	except serial.SerialException as exc:
		logging.error("Modem port %s could not be opened: %s", 
			modemport, exc)
		sys.exit(exit_error)
		
	saved_stty_value = save_serial_opts(modem_fh)
	set_serial_opts(modem_fh)
	
	logging.debug("Initialising Expect")
	expect_logfile = None
	if expect_logfilename:
		expect_logfile = open(expect_logfilename, 'a')
	expect	= pexpect.fdpexpect.fdspawn(modem_fh.fileno(), 
		logfile=expect_logfile)
	expect_setup()
	
	set_modem_echo(True)
	
	modem_model = get_modem_model()
	if modem_model == None:
		modem_model = ''
		
	if use_cleartext == None:
		if modem_needs_pdu_format(modem_model):
			logging.debug("Modem type \"%s\" needs PDU format for " +
				"USSD query.", modem_model)
			use_cleartext = False
		else:
			logging.debug("Modem type \"%s\" needs cleartext " +
				"for USSD query.", modem_model)
			use_cleartext = True
	
	if pin_needed():
		logging.debug("PIN needed")
		if pin == None:
			logging.error("SIM card is locked, but no PIN to unlock " +
				"given.\nUse \"-p <pin>\"!\n")
			sys.exit(exit_nopin)
		if enter_pin(pin):
			logging.debug("Pin %s accepted.", pin)
		else:
			logging.error("SIM card is locked, PIN %s not accepted!\n" +
				"Start me again with the correct PIN!\n", pin)
			sys.exit(exit_wrongpin)

	net_is_available, reason = get_net_registration_state(
		num_net_reg_retries)
	if not net_is_available:
		logging.error("Sorry, no network seems to be available:\n%s\n",
			reason)
		sys.exit(exit_nonet)
		
	if cancel_ussd_session:
		cancel_result = try_cancel_ussd_session()
		if cancel_result['ok']:
			print(cancel_result['msg'])
		else:
			sys.stderr.write(cancel_result['msg'] + "\n")
	else:
		for ussd_query in ussd_queries:
			if not is_valid_ussd_query(ussd_query):
				sys.stderr.write(("\"{0}\" is not a valid USSD " +
					"query - ignored.\n").format(ussd_query))
				continue
				
			ussd_result = do_ussd_query(ussd_query)
			if ussd_result['ok']:
				print(ussd_result['msg'])
			else:
				sys.stderr.write(ussd_result['msg'] + "\n")

	logging.debug("Shutting down")
	sys.exit(exit_success) # will give control to clean_up