Esempio n. 1
0
    def acctounting(self):
        if not self.account:
            dispatch.pub(UNLOCK_ONLINE_EVENT,
                         self.request.account_number,
                         self.request.nas_addr,
                         self.request.acct_session_id,
                         async=True)
            return logger.error(
                "[Acct] Received an accounting update request but user[%s] not exists"
                % self.request.account_number)

        ticket = Storage(**self.request)
        online = self.get_online(ticket.nas_addr, ticket.acct_session_id)
        if not online:
            sessiontime = ticket.acct_session_time
            updatetime = datetime.datetime.now()
            _starttime = updatetime - datetime.timedelta(seconds=sessiontime)
            online = Storage(
                account_number=self.account.account_number,
                nas_addr=ticket.nas_addr,
                acct_session_id=ticket.acct_session_id,
                acct_start_time=_starttime.strftime("%Y-%m-%d %H:%M:%S"),
                framed_ipaddr=ticket.framed_ipaddr,
                mac_addr=ticket.mac_addr or '',
                nas_port_id=ticket.nas_port_id,
                billing_times=ticket.acct_session_time,
                input_total=self.get_input_total(),
                output_total=self.get_output_total(),
                start_source=STATUS_TYPE_UPDATE)
            self.add_online(online)

        self.billing(online)
        logger.info('%s Accounting update request, update online' %
                    self.account.account_number)
Esempio n. 2
0
    def acctounting(self):
        if not self.account:
            return logger.error(
                "[Acct] Received an accounting update request but user[%s] not exists"% self.request.account_number)  

        ticket = Storage(**self.request)
        _datetime = datetime.datetime.now() 
        online = self.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
            self.add_ticket(ticket)
        else:
            self.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
            self.add_ticket(ticket)

            self.billing(online)
            logger.info('%s Accounting stop request, remove online'% self.account.account_number)
Esempio n. 3
0
    def acctounting(self):
        if self.is_online(self.request.nas_addr, self.request.acct_session_id):
            return logger.error('online %s is exists' %
                                self.request.acct_session_id)

        if not self.account:
            dispatch.pub(UNLOCK_ONLINE_EVENT,
                         self.request.account_number,
                         self.request.nas_addr,
                         self.request.acct_session_id,
                         async=True)
            return logger.error('user %s not exists' %
                                self.request.account_number)

        online = Storage(account_number=self.request.account_number,
                         nas_addr=self.request.nas_addr,
                         acct_session_id=self.request.acct_session_id,
                         acct_start_time=datetime.datetime.now().strftime(
                             "%Y-%m-%d %H:%M:%S"),
                         framed_ipaddr=self.request.framed_ipaddr,
                         mac_addr=self.request.mac_addr or '',
                         nas_port_id=self.request.nas_port_id,
                         billing_times=0,
                         input_total=0,
                         output_total=0,
                         start_source=STATUS_TYPE_START)
        self.add_online(online)
        logger.info('%s Accounting start request, add new online' %
                    online.account_number)
Esempio n. 4
0
    def bill_botimes(self, online, product):
        #买断时长
        dispatch.pub(
            logger.EVENT_INFO,
            '%s > Buyout long time billing ' % self.account.account_number)
        time_length = self.get_user_time_length()
        sessiontime = self.request.acct_session_time
        billing_times = online.billing_times
        acct_times = sessiontime - billing_times
        user_time_length = time_length - acct_times
        if user_time_length < 0:
            user_time_length = 0

        self.update_billing(
            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=self.request.acct_session_time,
                    input_total=self.get_input_total(),
                    output_total=self.get_output_total(),
                    acct_times=acct_times,
                    acct_flows=0,
                    acct_fee=0,
                    actual_fee=0,
                    balance=0,
                    time_length=user_time_length,
                    flow_length=0,
                    is_deduct=1,
                    create_time=datetime.datetime.now().strftime(
                        "%Y-%m-%d %H:%M:%S")))

        if user_time_length == 0:
            self.disconnect(online)
Esempio n. 5
0
 def fetch_result():
     table = models.TrProductAttr.__table__
     with self.dbengine.begin() as conn:
         vals = conn.execute(table.select().where(
             table.c.product_id == product_id).where(
                 table.c.attr_type == 1))
         return vals and [Storage(val.items()) for val in vals] or []
Esempio n. 6
0
    def bill_boflows(self, online, product):
        #买断流量
        logger.info('%s > Buyout flow billing ' % self.account.account_number)
        flow_length = self.get_user_flow_length()
        output_total = self.get_output_total()
        billing_output_total = online.output_total
        acct_flows = output_total - billing_output_total
        user_flow_length = flow_length - acct_flows
        if user_flow_length < 0:
            user_flow_length = 0
        self.update_billing(
            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=self.request.acct_session_time,
                    input_total=self.get_input_total(),
                    output_total=self.get_output_total(),
                    acct_times=0,
                    acct_flows=acct_flows,
                    acct_fee=0,
                    actual_fee=0,
                    balance=0,
                    time_length=0,
                    flow_length=user_flow_length,
                    is_deduct=1,
                    create_time=datetime.datetime.now().strftime(
                        "%Y-%m-%d %H:%M:%S")))

        if user_flow_length == 0:
            self.disconnect(online)
Esempio n. 7
0
 def get_request(self, online):
     session_time = (datetime.datetime.now() - datetime.datetime.strptime(
         online.acct_start_time,"%Y-%m-%d %H:%M:%S")).total_seconds()
     return Storage(
         account_number = online.account_number,
         mac_addr = online.mac_addr,
         nas_addr = online.nas_addr,
         nas_port = 0,
         service_type = '',
         framed_ipaddr = online.framed_ipaddr,
         framed_netmask = '',
         nas_class = '',
         session_timeout = 0,
         calling_station_id = '',
         acct_status_type = STATUS_TYPE_STOP,
         acct_input_octets = 0,
         acct_output_octets = 0,
         acct_session_id = online.acct_session_id,
         acct_session_time = session_time,
         acct_input_packets = 0,
         acct_output_packets = 0,
         acct_terminate_cause = '',
         acct_input_gigawords = 0,
         acct_output_gigawords = 0,
         event_timestamp = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S"),
         nas_port_type='',
         nas_port_id=online.nas_port_id
     )
Esempio n. 8
0
 def __init__(self, dbengine=None, cache=None, aes=None, request=None):
     self.dbengine = dbengine
     self.cache = cache
     self.aes = aes
     self.request = Storage(request)
     self.account = self.get_account_by_username(
         self.request.account_number)
Esempio n. 9
0
 def fetch_result():
     table = models.TrAccountAttr.__table__
     with self.dbengine.begin() as conn:
         val = conn.execute(table.select().where(
             table.c.account_number==self.account.account_number).where(
             table.c.attr_name==attr_name).where(
             table.c.attr_type==(radius and 1 or 0))).first()
         return val and Storage(val.items()) or ''
Esempio n. 10
0
 def new_ticket(online):
     _datetime = datetime.datetime.now()
     _starttime = datetime.datetime.strptime(online.acct_start_time,"%Y-%m-%d %H:%M:%S")
     session_time = (_datetime - _starttime).seconds
     stop_time = _datetime.strftime( "%Y-%m-%d %H:%M:%S")
     ticket = Storage()
     ticket.account_number = online.account_number,
     ticket.acct_session_id = online.acct_session_id,
     ticket.acct_start_time = online.acct_start_time,
     ticket.nas_addr = online.nas_addr,
     ticket.framed_ipaddr = online.framed_ipaddr,
     ticket.acct_session_time = session_time,
     ticket.acct_stop_time = stop_time,
     return ticket
Esempio n. 11
0
def parse_form_request(api_secret, request):
    """
        >>> parse_form_request("123456",{"nonce": 1451122677, "msg": "helllo", "code": 0, "sign": "DB30F4D1112C20DFA736F65458F89C64"})
        <Storage {'nonce': 1451122677, 'msg': 'helllo', 'code': 0, 'sign': 'DB30F4D1112C20DFA736F65458F89C64'}>
    """
    if not check_sign(api_secret, request):
        raise SignError(u"message sign error")

    return Storage(request)
Esempio n. 12
0
 def new_ticket(online):
     _datetime = datetime.datetime.now()
     _starttime = datetime.datetime.strptime(online.acct_start_time,"%Y-%m-%d %H:%M:%S")
     session_time = (_datetime - _starttime).seconds
     stop_time = _datetime.strftime( "%Y-%m-%d %H:%M:%S")
     ticket = Storage()
     ticket.account_number = online.account_number,
     ticket.acct_session_id = online.acct_session_id,
     ticket.acct_start_time = online.acct_start_time,
     ticket.nas_addr = online.nas_addr,
     ticket.framed_ipaddr = online.framed_ipaddr,
     ticket.acct_session_time = session_time,
     ticket.acct_stop_time = stop_time,
     return ticket
Esempio n. 13
0
    def bill_pptimes(self, online, product):
        # 预付费时长
        logger.info('%s > Prepaid long time billing ' %
                    self.account.account_number)
        user_balance = self.get_user_balance()
        sessiontime = decimal.Decimal(self.request.acct_session_time)
        billing_times = decimal.Decimal(online.billing_times)
        acct_times = sessiontime - billing_times
        if acct_times < 0:
            acct_times = 0
        fee_price = decimal.Decimal(product['fee_price'])
        usedfee = acct_times / 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

        self.update_billing(
            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=self.request.acct_session_time,
                    input_total=self.get_input_total(),
                    output_total=self.get_output_total(),
                    acct_times=int(acct_times.to_integral_value()),
                    acct_flows=0,
                    acct_fee=usedfee,
                    actual_fee=actual_fee,
                    balance=balance,
                    time_length=0,
                    flow_length=0,
                    is_deduct=1,
                    create_time=datetime.datetime.now().strftime(
                        "%Y-%m-%d %H:%M:%S")))

        if balance == 0:
            dispatch.pub(UNLOCK_ONLINE_EVENT,
                         online.account_number,
                         online.nas_addr,
                         online.acct_session_id,
                         async=True)
Esempio n. 14
0
def parse_request(api_secret, reqbody, dec_func=False):
    """
        >>> parse_request("123456",'{"nonce": 1451122677, "msg": "helllo", "code": 0, "sign": "DB30F4D1112C20DFA736F65458F89C64"}')
        <Storage {u'nonce': 1451122677, u'msg': u'helllo', u'code': 0, u'sign': u'DB30F4D1112C20DFA736F65458F89C64'}>
    """
    try:
        if type(reqbody) == type(dict):
            return self.parse_form_request(reqbody)

        if callable(dec_func):
            req_msg = json.loads(dec_func(reqbody))
        else:
            req_msg = json.loads(reqbody)
    except Exception as err:
        raise ParseError(u"parse params error")

    if not check_sign(api_secret, req_msg):
        raise SignError(u"message sign error")

    return Storage(req_msg)
Esempio n. 15
0
    def acctounting(self):
        if self.is_online(self.request.nas_addr,self.request.acct_session_id):
            return dispatch.pub(logger.EVENT_ERROR,'online %s is exists' % self.request.acct_session_id)

        if not self.account:
            return dispatch.pub(logger.EVENT_ERROR,'user %s not exists' % self.request.account_number)

        online = Storage(
            account_number = self.request.account_number,
            nas_addr = self.request.nas_addr,
            acct_session_id = self.request.acct_session_id,
            acct_start_time = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S"),
            framed_ipaddr = self.request.framed_ipaddr,
            mac_addr = self.request.mac_addr,
            nas_port_id = self.request.nas_port_id,
            billing_times = 0,
            input_total = 0,
            output_total = 0,
            start_source = STATUS_TYPE_START
        )
        self.add_online(online)
        dispatch.pub(logger.EVENT_INFO,'%s Accounting start request, add new online'%online.account_number)
Esempio n. 16
0
    def bill_ppflows(self, online, product):
        #预付费流量
        dispatch.pub(
            logger.EVENT_INFO,
            '%s > Prepaid flow billing ' % self.account.account_number)
        user_balance = self.get_user_balance()
        output_total = decimal.Decimal(self.get_output_total())
        billing_output_total = decimal.Decimal(online.output_total)
        acct_flows = output_total - billing_output_total
        fee_price = decimal.Decimal(product.fee_price)
        usedfee = acct_flows / decimal.Decimal(1024) * fee_price
        usedfee = actual_fee = int(usedfee.to_integral_value())
        balance = user_balance - usedfee

        if balance < 0:
            balance = 0
            actual_fee = user_balance

        self.update_billing(
            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=self.request.acct_session_time,
                    input_total=self.get_input_total(),
                    output_total=self.get_output_total(),
                    acct_times=0,
                    acct_flows=int(acct_flows.to_integral_value()),
                    acct_fee=usedfee,
                    actual_fee=actual_fee,
                    balance=balance,
                    time_length=0,
                    flow_length=0,
                    is_deduct=1,
                    create_time=datetime.datetime.now().strftime(
                        "%Y-%m-%d %H:%M:%S")))

        if balance == 0:
            self.disconnect(online)
Esempio n. 17
0
 def fetch_result():
     table = models.TrProduct.__table__
     with self.dbengine.begin() as conn:
         val = conn.execute(
             table.select().where(table.c.id == product_id)).first()
         return val and Storage(val.items()) or None
Esempio n. 18
0
 def fetch_result():
     table = models.TrAccount.__table__
     with self.dbengine.begin() as conn:
         val = conn.execute(table.select().where(
             table.c.account_number == username)).first()
         return val and Storage(val.items()) or None
Esempio n. 19
0
#!/usr/bin/env python
#coding=utf-8

import decimal, os
from toughlib.storage import Storage

decimal.getcontext().prec = 11
decimal.getcontext().rounding = decimal.ROUND_UP

# ToughCloud 定义

TOUGHCLOUD = Storage(apiurl="https://www.toughcloud.net/api/v1")

# 资费类型定义 预付费包月,预付费时长,买断包月,买断时长,预付费流量,买断流量,自由资费
FEES = (PPMonth, PPTimes, BOMonth, BOTimes, PPFlow, BOFlows,
        FreeFee) = (0, 1, 2, 3, 4, 5, 6)

# 账号状态 预授权,正常,停机,销户,过期
ACCOUNT_STATUS = (UsrPreAuth, UsrNormal, UsrPause, UsrCancel,
                  UsrExpire) = (0, 1, 2, 3, 4)

# 自由资费类型 自由日期,自由流量,自由时长
FREE_FEE_BILLS = (FreeFeeDate, FreeFeeFlow, FreeTimeLen) = (0, 1, 2)
#自由资费ID
FREE_FEE_PID = 1

# Radius记账类型
STAT_AUTH_ALL = 'STAT_AUTH_ALL'
STAT_AUTH_ACCEPT = 'STAT_AUTH_ACCEPT'
STAT_AUTH_REJECT = 'STAT_AUTH_REJECT'
STAT_AUTH_DROP = 'STAT_AUTH_DROP'
Esempio n. 20
0
 def __init__(self, app, request):
     self.app = app
     self.cache = self.app.mcache
     self.request = Storage(request)
     self.account = self.get_account_by_username(
         self.request.account_number)
Esempio n. 21
0
        resp = yield requests.post(gateway,data=urlencode(params))
        veryfy_result = yield resp.content()

        defer.returnValue(veryfy_result.lower().strip() == 'true')


if __name__ == '__main__':
    from toughlib.storage import Storage
    settings = Storage(
        ALIPAY_KEY = '234234',
        ALIPAY_INPUT_CHARSET = 'utf-8',
        # 合作身份者ID,以2088开头的16位纯数字
        ALIPAY_PARTNER = '234',
        # 签约支付宝账号或卖家支付宝帐户
        ALIPAY_SELLER_EMAIL = '*****@*****.**',
        ALIPAY_SIGN_TYPE = 'MD5',
        # 付完款后跳转的页面(同步通知) 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
        ALIPAY_RETURN_URL='',
        # 交易过程中服务器异步通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
        ALIPAY_NOTIFY_URL='',
        ALIPAY_SHOW_URL='',
        # 访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
        ALIPAY_TRANSPORT='https'
    )
    alipay = AliPay(settings)
    params = {}
    params['service']       = 'create_direct_pay_by_user'
    params['payment_type']  = '1'
    params['aaaa'] = u"好"
    print alipay.make_request_url(**params)
    print alipay.create_direct_pay_by_user('2323525', u"阿士大夫", u"啥打法是否", 0.01)
Esempio n. 22
0
from toughlib import logger
from toughlib.storage import Storage
from collections import namedtuple

ApiStatus = namedtuple('ApiStatus', 'code desc msg')
apistatus = Storage(success=ApiStatus(code=0, desc='success', msg=u"处理成功"),
                    sign_err=ApiStatus(code=90001,
                                       desc='message sign error',
                                       msg=u"消息签名错误"),
                    parse_err=ApiStatus(code=90002,
                                        desc='param parse error',
                                        msg=u"参数解析失败"),
                    verify_err=ApiStatus(code=90003,
                                         desc='message verify error',
                                         msg=u"消息校验错误"),
                    timeout=ApiStatus(code=90004,
                                      desc='request timeout',
                                      msg=u"请求超时"),
                    limit_err=ApiStatus(code=90005,
                                        desc='api limit',
                                        msg=u"频率限制"),
                    server_err=ApiStatus(code=90006,
                                         desc='server process failure',
                                         msg=u"服务器处理失败"),
                    unknow=ApiStatus(code=99999,
                                     desc='unknow error',
                                     msg=u"未知错误"))


class SignError(Exception):
    pass