def process(req=None,admin=None): msg_id = req.get("msg_id") nas_addr = req.get("nas_addr") acct_session_id = req.get("acct_session_id") message_type =req.get("message_type") if not nas_addr or not acct_session_id: reply = {'msg_id':msg_id,'code':1,'data':u"nas_addr and acct_session_id Does not allow nulls"} return admin.sendMessage(json.dumps(reply),False) coa_client = admin.coa_clients.get(nas_addr) if not coa_client: reply = {'msg_id':msg_id,'code':1,'data':u"CoA Client instance not exists for %s"%nas_addr} return admin.sendMessage(json.dumps(reply),False) online = store.get_online(nas_addr,acct_session_id) if not online: reply = {'msg_id':msg_id,'code':1,'data':u"online not exists"} return admin.sendMessage(json.dumps(reply),False) if message_type == 'disconnect': attrs = { 'User-Name' : online['account_number'], 'Acct-Session-Id' : acct_session_id, 'NAS-IP-Address' : nas_addr, 'Framed-IP-Address' : online['framed_ipaddr'] } dmeq = coa_client.createDisconnectPacket(**attrs) coa_client.sendCoA(dmeq) reply = {'msg_id':msg_id,'code':0,'data':u"disconnect message send"} admin.sendMessage(json.dumps(reply),False)
def process(req=None, user=None, runstat=None): if not req.get_acct_status_type() == STATUS_TYPE_UPDATE: return if not user: return log.err( "[Acct] Received an accounting update request but user[%s] not exists" % req.get_user_name()) runstat.acct_update += 1 online = store.get_online(req.get_nas_addr(), req.get_acct_sessionid()) if not online: sessiontime = req.get_acct_sessiontime() updatetime = datetime.datetime.now() _starttime = updatetime - datetime.timedelta(seconds=sessiontime) online = utils.Storage( account_number=user['account_number'], nas_addr=req.get_nas_addr(), acct_session_id=req.get_acct_sessionid(), acct_start_time=_starttime.strftime("%Y-%m-%d %H:%M:%S"), framed_ipaddr=req.get_framed_ipaddr(), mac_addr=req.get_mac_addr(), nas_port_id=req.get_nas_portid(), billing_times=0, start_source=STATUS_TYPE_UPDATE) store.add_online(online) product = store.get_product(user['product_id']) if not product or product['product_policy'] not in (FEE_BUYOUT, FEE_MONTH, FEE_TIMES): return if product['product_policy'] == FEE_TIMES: # PrePay fee times policy user_balance = store.get_user_balance(user['account_number']) sessiontime = decimal.Decimal(req.get_acct_sessiontime()) billing_times = decimal.Decimal(online['billing_times']) acct_length = sessiontime - billing_times fee_price = decimal.Decimal(product['fee_price']) usedfee = acct_length / decimal.Decimal(3600) * fee_price usedfee = actual_fee = int(usedfee.to_integral_value()) balance = user_balance - usedfee if balance < 0: balance = 0 actual_fee = user_balance store.update_billing( utils.Storage(account_number=online['account_number'], nas_addr=online['nas_addr'], acct_session_id=online['acct_session_id'], acct_start_time=online['acct_start_time'], acct_session_time=req.get_acct_sessiontime(), acct_length=int(acct_length.to_integral_value()), acct_fee=usedfee, actual_fee=actual_fee, balance=balance, is_deduct=1, create_time=datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S")), True)
def process(req=None,user=None,runstat=None): if not req.get_acct_status_type() == STATUS_TYPE_UPDATE: return if not user: return log.err("[Acct] Received an accounting update request but user[%s] not exists"%req.get_user_name()) runstat.acct_update += 1 online = store.get_online(req.get_nas_addr(),req.get_acct_sessionid()) if not online: sessiontime = req.get_acct_sessiontime() updatetime = datetime.datetime.now() _starttime = updatetime - datetime.timedelta(seconds=sessiontime) online = utils.Storage( account_number = user['account_number'], nas_addr = req.get_nas_addr(), acct_session_id = req.get_acct_sessionid(), acct_start_time = _starttime.strftime( "%Y-%m-%d %H:%M:%S"), framed_ipaddr = req.get_framed_ipaddr(), mac_addr = req.get_mac_addr(), nas_port_id = req.get_nas_portid(), billing_times = 0, start_source = STATUS_TYPE_UPDATE ) store.add_online(online) product = store.get_product(user['product_id']) if not product or product['product_policy'] not in (FEE_BUYOUT,FEE_MONTH,FEE_TIMES): return if product['product_policy'] == FEE_TIMES: # PrePay fee times policy user_balance = store.get_user_balance(user['account_number']) sessiontime = decimal.Decimal(req.get_acct_sessiontime()) billing_times = decimal.Decimal(online['billing_times']) acct_length = sessiontime-billing_times fee_price = decimal.Decimal(product['fee_price']) usedfee = acct_length/decimal.Decimal(3600) * fee_price usedfee = actual_fee = int(usedfee.to_integral_value()) balance = user_balance - usedfee if balance < 0 : balance = 0 actual_fee = user_balance store.update_billing(utils.Storage( account_number = online['account_number'], nas_addr = online['nas_addr'], acct_session_id = online['acct_session_id'], acct_start_time = online['acct_start_time'], acct_session_time = req.get_acct_sessiontime(), acct_length = int(acct_length.to_integral_value()), acct_fee = usedfee, actual_fee = actual_fee, balance = balance, is_deduct = 1, create_time = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S") ),True)
def process(req=None, admin=None): msg_id = req.get("msg_id") nas_addr = req.get("nas_addr") acct_session_id = req.get("acct_session_id") message_type = req.get("message_type") if not nas_addr or not acct_session_id: reply = { 'msg_id': msg_id, 'code': 1, 'data': u"nas_addr and acct_session_id Does not allow nulls" } return admin.sendMessage(json.dumps(reply), False) coa_client = admin.coa_clients.get(nas_addr) if not coa_client: reply = { 'msg_id': msg_id, 'code': 1, 'data': u"CoA Client instance not exists for %s" % nas_addr } return admin.sendMessage(json.dumps(reply), False) online = store.get_online(nas_addr, acct_session_id) if not online: reply = {'msg_id': msg_id, 'code': 1, 'data': u"online not exists"} return admin.sendMessage(json.dumps(reply), False) if message_type == 'disconnect': attrs = { 'User-Name': online['account_number'], 'Acct-Session-Id': acct_session_id, 'NAS-IP-Address': nas_addr, 'Framed-IP-Address': online['framed_ipaddr'] } dmeq = coa_client.createDisconnectPacket(**attrs) coa_client.sendCoA(dmeq) reply = { 'msg_id': msg_id, 'code': 0, 'data': u"disconnect message send" } admin.sendMessage(json.dumps(reply), False)
def process(req=None,user=None,runstat=None): if not req.get_acct_status_type() == STATUS_TYPE_STOP: return runstat.acct_stop += 1 ticket = req.get_ticket() if not ticket.nas_addr: ticket.nas_addr = req.source[0] _datetime = datetime.datetime.now() online = store.get_online(ticket.nas_addr,ticket.acct_session_id) if not online: session_time = ticket.acct_session_time stop_time = _datetime.strftime( "%Y-%m-%d %H:%M:%S") start_time = (_datetime - datetime.timedelta(seconds=int(session_time))).strftime( "%Y-%m-%d %H:%M:%S") ticket.acct_start_time = start_time ticket.acct_stop_time = stop_time ticket.start_source= STATUS_TYPE_STOP ticket.stop_source = STATUS_TYPE_STOP store.add_ticket(ticket) else: store.del_online(ticket.nas_addr,ticket.acct_session_id) ticket.acct_start_time = online['acct_start_time'] ticket.acct_stop_time= _datetime.strftime( "%Y-%m-%d %H:%M:%S") ticket.start_source = online['start_source'] ticket.stop_source = STATUS_TYPE_STOP store.add_ticket(ticket) if not user:return product = store.get_product(user['product_id']) if product and product['product_policy'] == FEE_TIMES: # PrePay fee times policy user_balance = store.get_user_balance(user['account_number']) sessiontime = decimal.Decimal(req.get_acct_sessiontime()) billing_times = decimal.Decimal(online['billing_times']) acct_length = sessiontime-billing_times fee_price = decimal.Decimal(product['fee_price']) usedfee = acct_length/decimal.Decimal(3600) * fee_price usedfee = actual_fee = int(usedfee.to_integral_value()) balance = user_balance - usedfee if balance < 0 : balance = 0 actual_fee = user_balance store.update_billing(utils.Storage( account_number = online['account_number'], nas_addr = online['nas_addr'], acct_session_id = online['acct_session_id'], acct_start_time = online['acct_start_time'], acct_session_time = req.get_acct_sessiontime(), acct_length = int(acct_length.to_integral_value()), acct_fee = usedfee, actual_fee = actual_fee, balance = balance, is_deduct = 1, create_time = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S") ),False) log.msg('%s Accounting stop request, remove online'%req.get_user_name(),level=logging.INFO)