def render_GET(self, request): res = None logged = session.get_user(request) if not logged: return redirectTo('/', request) parts = request.path.split("/") if len(parts) > 2 and logged.admin: user_ext = parts[2] else: user_ext = logged.voip_id args = {'ext': user_ext, 'lowquality': '', 'tls': '', 'srtp': '', 'voicemail': ''} options = get_options(user_ext) if 'codecs' in options and 'gsm' in options['codecs']: args['lowquality'] = ' checked ' if options['tls']: args['tls'] = ' checked ' if options['srtp']: args['srtp'] = ' checked ' if options['voicemail']: args['voicemail'] = ' checked ' model = Model() user = model.query(User).filter_by(voip_id=user_ext).first() if user and (logged.admin or user.id == logged.id): args['bitcoin'] = self.render_btc(logged, user, wallet) else: return redirectTo('/', request) content = print_template('options', args) return print_template('content-pbx-lorea', {'content': content})
def render_all(self, user_ext=None): """ Render calls for the given extensions. user_ext -- extension to render calls for. """ model = Model() result = {} result['dateTimeFormat'] = 'iso8601' result['wikiURL'] = 'http://simile.mit.edu/shelf/' result['wikiSection'] = 'Simile Cubism Timeline' result['events'] = [] events = result['events'] if user_ext: user = model.query(User).filter_by(voip_id=user).first() calls = model.query(Call).filter_by(user=user) else: calls = model.query(Call) for call in calls: if not call.user: print "call without user!", call continue event = {} event['start'] = self.format_date(call.timestamp) event['end'] = self.format_date(call.timestamp+datetime.timedelta(seconds=float(call.duration))) event['title'] = "from %s to %s" % (call.user.voip_id, call.destination) provider_name = self.get_provider_name(call.provider) event['description'] = "from %s to %s.<br/>duration: %.2fmin<br/>provider: %s" % (call.user.voip_id, call.destination, float(call.duration)/60.0, provider_name) event['color'] = self.get_color(call.provider) # event['description'] = "" # event['image'] = "" # event['link'] = "" events.append(event) return json.dumps(result)
def general_stats(self): res = "" total = 0 total_free = 0 free_calls = 0 cost_calls = 0 total_cost = Decimal() total_benefit = Decimal() model = Model() calls = model.query(Call) for call in calls: cost = Decimal(call.cost) duration = call.charged minutes = duration/60 if cost: total += duration cost_calls += 1 total_cost += cost total_benefit += Decimal(minutes)*Decimal(0.001) + Decimal(0.001) else: total_free += duration free_calls += 1 res += "<p>Minutos con coste: %s</p>\n" % (total/60,) res += "<p>Minutos gratis: %s</p>\n" % (total_free/60,) res += "<p>Llamadas: %s Gratis: %s Con coste: %s</p>\n" % (calls.count(), free_calls, cost_calls) res += "<p>Coste total %.3f Beneficio %.3f</p>\n" % (total_cost, total_benefit) return res
def render_GET(self, request): res = None logged = session.get_user(request) if not logged: return redirectTo('/', request) parts = request.path.split("/") if len(parts) > 2 and logged.admin: user_ext = parts[2] else: user_ext = logged.voip_id args = { 'ext': user_ext, 'lowquality': '', 'tls': '', 'srtp': '', 'voicemail': '' } options = get_options(user_ext) if 'codecs' in options and 'gsm' in options['codecs']: args['lowquality'] = ' checked ' if options['tls']: args['tls'] = ' checked ' if options['srtp']: args['srtp'] = ' checked ' if options['voicemail']: args['voicemail'] = ' checked ' model = Model() user = model.query(User).filter_by(voip_id=user_ext).first() if user and (logged.admin or user.id == logged.id): args['bitcoin'] = self.render_btc(logged, user, wallet) else: return redirectTo('/', request) content = print_template('options', args) return print_template('content-pbx-lorea', {'content': content})
def apply_transaction(self, address, balance, balance_confirmed, timestamp): model = Model() wallet = model.query(Wallet).filter_by(address=address).first() if wallet and wallet.user: user = wallet.user balance_unconfirmed = Decimal(balance) / Decimal("100000000") balance_confirmed = Decimal(balance_confirmed) / Decimal( "100000000") received = wallet.received if not wallet.received: received = Decimal("0") new_coins = balance_confirmed - received wallet.received = balance_confirmed wallet.unconfirmed = balance_unconfirmed # XXX need to add a mechanism to account credit (convert to euros) #user.credit += new_coins print "applied transaction", balance_confirmed, balance_unconfirmed, user, user.voip_id model.session.commit() sse.resource.notify( { 'confirmed': float(balance_confirmed), 'unconfirmed': float(balance_unconfirmed), 'currency': 'BTC' }, 'balance', user) else: print "unknown tx destination"
def render_mailbox(self, user_ext): output = "<h1>Correo de voz</h1>\n" model = Model() model.session.commit() # refresh session all_messages = model.query(VoiceMailMessage).filter_by(mailboxuser=user_ext) folders = set() for message in all_messages: folders.add(message.dir) folders = list(folders) folders.sort() for folder in folders: result = [] messages = model.query(VoiceMailMessage).filter_by(mailboxuser=user_ext, dir=folder) output += "<h2>"+os.path.basename(folder)+"</h2>\n" for message in messages: actions2 = "" if message.msg_id: audio = html.format_audio('/voicemail/message/' + message.msg_id) actions = '<form method="POST" action="/voicemail/delete/%s/%s"><input type="hidden" name="msg_id" value="%s" /><input type="hidden" name="user_ext" value="%s" /><input type="submit" name="submit" value="Borrar" /></form>' % (user_ext, message.msg_id, message.msg_id, user_ext) if folder.endswith('INBOX'): actions2 += '<form method="POST" action="/voicemail/archive/%s/%s"><input type="hidden" name="msg_id" value="%s" /><input type="hidden" name="user_ext" value="%s" /><input type="submit" name="submit" value="Archivar" /></form>' % (user_ext, message.msg_id, message.msg_id, user_ext) else: audio = "" actions = "" result.append([message.callerid, time.ctime(message.origtime), str(message.duration), audio, actions, actions2]) output += html.format_table([['origen', 'fecha', 'duracion', 'audio', 'actions', '']] + result) return output
def __init__(self, id, cost, app_from, app_to): self._id = id self._callID = 0 self._provider = 'unknown' if cost: self._realcost = Decimal(cost) else: self._realcost = Decimal() try: self._cost = Decimal(cost) if self._cost: self._cost += Decimal(0.001) # benefit margin except: self._cost = Decimal(0.0) self._from = app_from self._to = app_to self._real_to = app_to model = Model() peer = model.query(SipPeer).filter_by(regexten=self._from).first() if peer: self._from = peer.name self._user = model.query(User).filter_by(voip_id=peer.regexten).first() self._from_exten = peer.regexten else: self._user = None self._from_exten = ''
def get_user(request): model = Model() session_id = str(request.getSession().uid) web_session = model.query(WebSession).filter_by(session_id=session_id).first() if web_session: web_session.user.update_wallet(model) return web_session.user
def render_user(self, user_ext, request): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() creditlink = '' if peer: username = peer.name else: username = user_ext user = model.get_user_fromext(user_ext) logged = session.get_user(request) if user: credit = "%.3f" % (user.credit,) user_charges = charges.get_charges(user_ext) n_calls = len(user.calls) pager = self.render_pager(user_ext, n_calls) user_calls = calls.get_calls(user_ext, logged, 10) + "<p>%s</p>" % (pager,) creditlink = "" if user.credit > 0: if user.voip_id == logged.voip_id: creditlink += '<a href="/credit/transfer">Transferir</a>' else: creditlink += '<a href="/credit/transfer/%s">Transferir</a>' % (user.voip_id) if logged.admin: creditlink += ' <a href="/credit/add/%s">Crear</a>' % (user.voip_id) else: credit = 0.0 user_charges = "" user_calls = "" all_calls = self.render_user_calls(user_ext, request) args = {'ext': user_ext, 'username': username, 'credit': credit, 'credit_link':creditlink ,'calls': user_calls, 'charges': user_charges, 'all_calls': all_calls} return print_template('user-pbx-lorea', args)
def parse_users(filename=None): extensions = {} model = Model() peers = model.query(SipPeer).order_by('regexten') for peer in peers: extensions[peer.regexten] = peer.name return extensions
def parse_users(filename=None): extensions = {} model = Model() peers = model.query(SipPeer).order_by("regexten") for peer in peers: extensions[peer.regexten] = peer.name return extensions
def render_GET(self, request): session_id = str(request.getSession().uid) request.getSession().expire() model = Model() web_session = model.query(WebSession).filter_by(session_id=session_id).first() if web_session: model.session.delete(web_session) model.session.commit() return redirectTo("/", request)
def render_user_calls(self, user_ext, request): FILE = "/var/log/asterisk/cdr-csv/Master.csv" if not os.path.exists(FILE): return f = open(FILE) csv_file = csv.reader(f) data = list(csv_file) logged = session.get_user(request) model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() user_extensions = [user_ext] if peer: user_extensions.append(peer.name) res = "" calls = "" for a in data: if 'queue-multicall' in a: continue time_1 = a[9] time_2 = a[10] time_3 = a[11] duration = a[12] billsecs = int(a[13]) from_ext = a[1] from_name = a[4] appdata = a[8] status = a[-4] id = a[-2] delta = 0.0 #totalsecs += int(billsecs) t1 = datetime.strptime(time_1, "%Y-%m-%d %H:%M:%S") to_ext = a[2] if to_ext.startswith("stdexten-"): status = to_ext.split("-")[1] to_ext = a[8].split("@")[0] if "@" in appdata and "/" in appdata: dest = appdata.split("/")[1].split(",")[0] to_ext = dest if time_3: t2 = datetime.strptime(time_3, "%Y-%m-%d %H:%M:%S") delta = t2 - t1 if from_ext in user_extensions or to_ext in user_extensions: #calls = "<p>[%s] %s to %s for %s secs on %s/%s/%s %s</p>" % (id, from_ext, to_ext, delta, t1.day, t1.month, t1.year, status) + calls date = "%s/%s/%s" % (t1.day, t1.month, t1.year) if not from_ext in user_extensions and logged.admin: from_ext = "<a href='/user/%s'>%s</a>" % (from_ext, from_ext) if not to_ext in user_extensions and logged.admin: to_ext = "<a href='/user/%s'>%s</a>" % (to_ext, to_ext) calls = ( "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>" % (date, from_ext, to_ext, delta, status)) + calls #if status == "ANSWERED" and (billsecs > umbra or not umbra): # print from_ext,"->"," "*(14-len(a[2]))+a[2]+" ["+str(billsecs)+"]\t"+str(t1.day)+"\t"+str(t1.hour) res += calls return res
def change_password(user_ext, password): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() pass_string = "%s:asterisk:%s" % (peer.name, password) hashed = md5.new(pass_string).hexdigest() peer.md5secret = hashed peer.secret = "" model.session.commit() # reload asterisk reload_peer(peer.name)
def change_password(user_ext, password): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() pass_string = "%s:asterisk:%s" % (peer.name, password) hashed = md5.new(pass_string).hexdigest() peer.md5secret = hashed peer.secret = '' model.session.commit() # reload asterisk reload_peer(peer.name)
def render_user_calls(self, user_ext, request): FILE = "/var/log/asterisk/cdr-csv/Master.csv" if not os.path.exists(FILE): return f = open(FILE) csv_file = csv.reader(f) data = list(csv_file) logged = session.get_user(request) model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() user_extensions = [user_ext] if peer: user_extensions.append(peer.name) res = "" calls = "" for a in data: if 'queue-multicall' in a: continue time_1 = a[9] time_2 = a[10] time_3 = a[11] duration = a[12] billsecs = int(a[13]) from_ext = a[1] from_name = a[4] appdata = a[8] status = a[-4] id = a[-2] delta = 0.0 #totalsecs += int(billsecs) t1 = datetime.strptime(time_1, "%Y-%m-%d %H:%M:%S") to_ext = a[2] if to_ext.startswith("stdexten-"): status = to_ext.split("-")[1] to_ext = a[8].split("@")[0] if "@" in appdata and "/" in appdata: dest = appdata.split("/")[1].split(",")[0] to_ext = dest if time_3: t2 = datetime.strptime(time_3, "%Y-%m-%d %H:%M:%S") delta = t2-t1 if from_ext in user_extensions or to_ext in user_extensions: #calls = "<p>[%s] %s to %s for %s secs on %s/%s/%s %s</p>" % (id, from_ext, to_ext, delta, t1.day, t1.month, t1.year, status) + calls date = "%s/%s/%s" % (t1.day, t1.month, t1.year) if not from_ext in user_extensions and logged.admin: from_ext = "<a href='/user/%s'>%s</a>" % (from_ext, from_ext) if not to_ext in user_extensions and logged.admin: to_ext = "<a href='/user/%s'>%s</a>" % (to_ext, to_ext) calls = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>" % (date, from_ext, to_ext, delta, status)) + calls #if status == "ANSWERED" and (billsecs > umbra or not umbra): # print from_ext,"->"," "*(14-len(a[2]))+a[2]+" ["+str(billsecs)+"]\t"+str(t1.day)+"\t"+str(t1.hour) res += calls return res
def render_voice_message(self, request, logged, msg_id): model = Model() msg = model.query(VoiceMailMessage).filter_by(msg_id=msg_id).first() if msg and msg.recording and (msg.mailboxuser == logged.voip_id): # no admin here: request.setHeader('Content-Description', 'File Transfer') request.setHeader('Content-Type', 'application/octet-stream') request.setHeader('Content-Disposition', 'attachment; filename=recording-'+msg_id+'-.ogg') request.setHeader('Content-Transfer-Encoding', 'binary') #request.setHeader('Expires', '0') request.setHeader('Content-Length', len(msg.recording)) return msg.recording return "no access"
def get_charges(user_ext): model = Model() user = model.get_user_fromext(user_ext) res = "" for charge in user.charges: date = charge.timestamp credit = charge.credit if charge.concept: concept = charge.concept else: concept = '' res += "<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n" % (date, credit,concept) return res
def minutes_stats(self, request, period, columns, val_checker, obj_class): model = Model() ts_start = time.time() - period ts_end = time.time() data = [] current = 0 for a in range(columns): selected = model.query(obj_class).filter(and_(obj_class.timestamp>datetime.fromtimestamp(ts_start), obj_class.timestamp<datetime.fromtimestamp(ts_end))) pars = list(val_checker(selected)) data.insert(0, [pars, {'label': str(current)}]) ts_start -= period ts_end -= period current -= 1 return json.dumps(data)
def add_charge(user_ext, amount, concept=""): model = Model() user = model.get_user_fromext(user_ext) if not user: user = User(user_ext) model.session.add(user) if concept: charge = Charge(user=user, timestamp=datetime.now(), credit=amount, concept=concept) else: charge = Charge(user=user, timestamp=datetime.now(), credit=amount) model.session.add(charge) model.session.commit()
def change_options(user_ext, options): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() if not peer: return False username = peer.name # password if 'passwd' in options: pass_string = "%s:asterisk:%s" % (username, options['password']) hashed = md5.new(pass_string).hexdigest() peer.md5secret = hashed peer.secret = '' # newcodecs newcodecs = options.get('codecs', False) if newcodecs: peer.disallow = 'all' peer.allow = ','.join(newcodecs) else: peer.disallow = '' peer.allow = '' # tls if options.get('tls', False): peer.transport = 'tls' else: peer.transport = 'udp' # srtp if options.get('srtp', False): peer.encryption = 'yes' else: peer.encryption = 'no' # voicemail exten = model.query(Extension).filter_by(exten=peer.regexten).first() if options.get('voicemail', False): exten.app = 'Gosub' exten.appdata = 'stdexten,%s,1(SIP/%s,default)' % (peer.regexten, peer.name) else: exten.app = 'Dial' exten.appdata = 'SIP/%s,60' % (peer.name, ) exten_sip = model.query(Extension).filter_by(exten=peer.name).first() exten_sip.app = exten.app exten_sip.appdata = exten.appdata model.session.commit() # reload asterisk reload_peer(peer.name) return True
def add_charge(logged, user_ext, amount, concept=""): model = Model() user = model.get_user_fromext(user_ext) initiator_id = logged.id if not user: user = User(user_ext) model.session.add(user) if concept: charge = Charge(user=user, timestamp=datetime.now(), credit=amount, concept=concept, initiator_id=initiator_id, funded=True) else: charge = Charge(user=user, timestamp=datetime.now(), credit=amount, initiator_id=initiator_id, funded=True) model.session.add(charge) model.session.commit()
def get_charges(user_ext): model = Model() user = model.get_user_fromext(user_ext) res = "" for charge in user.charges: date = charge.timestamp credit = charge.credit if charge.concept: concept = charge.concept else: concept = '' res += "<tr><td>%s</td><td>%s</td><td>%s</td></tr>\n" % (date, credit, concept) return res
def change_options(user_ext, options): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() if not peer: return False username = peer.name # password if "passwd" in options: pass_string = "%s:asterisk:%s" % (username, options["password"]) hashed = md5.new(pass_string).hexdigest() peer.md5secret = hashed peer.secret = "" # newcodecs newcodecs = options.get("codecs", False) if newcodecs: peer.disallow = "all" peer.allow = ",".join(newcodecs) else: peer.disallow = "" peer.allow = "" # tls if options.get("tls", False): peer.transport = "tls" else: peer.transport = "udp" # srtp if options.get("srtp", False): peer.encryption = "yes" else: peer.encryption = "no" # voicemail exten = model.query(Extension).filter_by(exten=peer.regexten).first() if options.get("voicemail", False): exten.app = "Gosub" exten.appdata = "stdexten,%s,1(SIP/%s,default)" % (peer.regexten, peer.name) else: exten.app = "Dial" exten.appdata = "SIP/%s,60" % (peer.name,) exten_sip = model.query(Extension).filter_by(exten=peer.name).first() exten_sip.app = exten.app exten_sip.appdata = exten.appdata model.session.commit() # reload asterisk reload_peer(peer.name) return True
def check_password(self, username, password, user_ext=None): model = Model() peer = None if user_ext: peer = model.query(SipPeer).filter_by(regexten=user_ext).first() else: peer = model.query(SipPeer).filter_by(name=username).first() if peer: username = peer.name user_input = md5.new(username + ":asterisk:" + password).hexdigest() hashed = peer.md5secret if peer.secret and not hashed: hashed = md5.new(username + ":asterisk:" + peer.secret).hexdigest() if hashed == user_input: return peer return False
def minutes_stats(self, request, period, columns, val_checker, obj_class): model = Model() ts_start = time.time() - period ts_end = time.time() data = [] current = 0 for a in range(columns): selected = model.query(obj_class).filter( and_(obj_class.timestamp > datetime.fromtimestamp(ts_start), obj_class.timestamp < datetime.fromtimestamp(ts_end))) pars = list(val_checker(selected)) data.insert(0, [pars, {'label': str(current)}]) ts_start -= period ts_end -= period current -= 1 return json.dumps(data)
def delete_voicemail(self, request, logged, user_ext, msg_id): model = Model() msg = model.query(VoiceMailMessage).filter_by(msg_id=msg_id, mailboxuser=user_ext).first() if msg and msg.recording and (msg.mailboxuser == logged.voip_id or logged.admin): mb_user = msg.mailboxuser number = msg.msgnum msgdir = msg.dir model.session.delete(msg) model.session.commit() # reorder other messages in the folder msgs = model.query(VoiceMailMessage).filter_by(mailboxuser=mb_user) for amsg in msgs: if amsg.msgnum > number and amsg.dir == msgdir: amsg.msgnum -= 1 model.session.commit() return mb_user return logged.voip_id
def render_user(self, user_ext, request): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() creditlink = '' if peer: username = peer.name else: username = user_ext user = model.get_user_fromext(user_ext) logged = session.get_user(request) if user: credit = "%.3f" % (user.credit, ) user_charges = charges.get_charges(user_ext) n_calls = len(user.calls) pager = self.render_pager(user_ext, n_calls) user_calls = calls.get_calls(user_ext, logged, 10) + "<p>%s</p>" % (pager, ) creditlink = "" if user.credit > 0: if user.voip_id == logged.voip_id: creditlink += '<a href="/credit/transfer">Transferir</a>' else: creditlink += '<a href="/credit/transfer/%s">Transferir</a>' % ( user.voip_id) if logged.admin: creditlink += ' <a href="/credit/add/%s">Crear</a>' % ( user.voip_id) else: credit = 0.0 user_charges = "" user_calls = "" all_calls = self.render_user_calls(user_ext, request) args = { 'ext': user_ext, 'username': username, 'credit': credit, 'credit_link': creditlink, 'calls': user_calls, 'charges': user_charges, 'all_calls': all_calls } return print_template('user-pbx-lorea', args)
def get_options(user_ext): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() username = peer.name options = {'srtp': False, 'tls': False, 'codecs': []} if peer.encryption == 'yes': options['srtp'] = True if peer.transport == 'tls': options['tls'] = True if peer.disallow == 'all': options['codecs'] = [] if peer.allow: options['codecs'] = peer.allow.split(',') exten = model.query(Extension).filter_by(exten=peer.regexten).first() if exten.app == 'Gosub': options['voicemail'] = True else: options['voicemail'] = False return options
def add_call(user_ext, destination, date, real_duration, duration, cost, rate, provider_name): model = Model() user = model.get_user_fromext(user_ext) provider = model.query(Provider).filter_by(name=provider_name).first() if not provider: provider = Provider(provider_name) model.session.add(provider) model.session.commit() call = Call(user=user, destination=destination, timestamp=datetime.fromtimestamp(float(date)), duration=real_duration, charged=duration, cost=cost, rate=rate, provider=provider) model.session.add(call) model.session.commit()
def get_options(user_ext): model = Model() peer = model.query(SipPeer).filter_by(regexten=user_ext).first() username = peer.name options = {"srtp": False, "tls": False, "codecs": []} if peer.encryption == "yes": options["srtp"] = True if peer.transport == "tls": options["tls"] = True if peer.disallow == "all": options["codecs"] = [] if peer.allow: options["codecs"] = peer.allow.split(",") exten = model.query(Extension).filter_by(exten=peer.regexten).first() if exten.app == "Gosub": options["voicemail"] = True else: options["voicemail"] = False return options
def create_user(username, password): username_avail = 1 model = Model() # check if username is taken if model.query(SipPeer).filter_by(name=username).first(): print "username already taken", username return False # find next available extension peers = model.query(SipPeer).order_by("regexten") maxexten = 0 for peer in peers: exten = int(peer.regexten) if exten < 9999 and exten > maxexten: maxexten = exten nextexten = maxexten + 1 if nextexten < 1000: nextexten = 1000 # create user in database password = md5.new("%s:asterisk:%s" % (username, password)).hexdigest() peer = create_user_internal( model, regexten=str(nextexten), name=username, md5secret=password, callerid="%s <%s>" % (username, nextexten), type="friend", host="dynamic", nat="comedia,force_rport", # natted qualify="yes", # follow status mailbox=str(nextexten), # register with voicemail mwi context="from-freeuser", ) # reload asterisk reload_peer(peer.name) print "user created", username, nextexten return peer
def on_peer_event(self, event): peer_name = event['peer'].split('/')[1] model = Model() peer = model.query(SipPeer).filter_by(name=peer_name).first() if peer: event['username'] = peer_name event['exten'] = peer.regexten event['useragent'] = peer.useragent event['channel'] = False if peer.fullcontact and 'transport=tls' in peer.fullcontact.lower(): event['tls'] = True else: event['tls'] = False if peer.encryption == 'yes': event['srtp'] = True else: event['srtp'] = False sse.resource.notify(event, 'peer' ,'admin') else: event['channel'] = True sse.resource.notify(event, 'peer' ,'admin')
def login(self, login, password, request, email=''): peer = self.check_password(login, password) if peer: user_ext = peer.regexten model = Model() user = model.get_user_fromext(user_ext) if not user: user = User(user_ext) if email: user.email = email model.session.add(user) model.session.commit() session_id = str(request.getSession().uid) web_session = model.query(WebSession).filter_by(session_id=session_id).first() if not web_session: web_session = WebSession(session_id=session_id, timestamp=datetime.now(), user=user) model.session.add(web_session) model.session.commit() return redirectTo("/user/"+user_ext, request) return redirectTo("/", request)
def render_accounts(self, request): res = "<h2>accounts</h2>" logged = session.get_user(request) if not logged or not logged.admin: return redirectTo("/", request) model = Model() all_users = model.query(User) total_credit = Decimal() for user in all_users: ext = user.voip_id credit = user.credit peer = model.query(SipPeer).filter_by(regexten=ext).first() if peer and peer.name: username = peer.name else: username = "******" res += "<p>%s <a href='/user/%s'>%s</a> %.3f %s</p>" % (str(ext), str(ext), str(username), credit, str(user.email)) total_credit += Decimal(credit) res += "<p>total credit: %s</p>" % (total_credit,) return res
def create_user(username, password): username_avail = 1 model = Model() # check if username is taken if model.query(SipPeer).filter_by(name=username).first(): print "username already taken", username return False # find next available extension peers = model.query(SipPeer).order_by('regexten') maxexten = 0 for peer in peers: exten = int(peer.regexten) if exten < 9999 and exten > maxexten: maxexten = exten nextexten = maxexten + 1 if nextexten < 1000: nextexten = 1000 # create user in database password = md5.new("%s:asterisk:%s" % (username, password)).hexdigest() peer = create_user_internal( model, regexten=str(nextexten), name=username, md5secret=password, callerid='%s <%s>' % (username, nextexten), type='friend', host='dynamic', nat='comedia,force_rport', # natted qualify='yes', # follow status mailbox=str(nextexten), # register with voicemail mwi context="from-freeuser") # reload asterisk reload_peer(peer.name) print "user created", username, nextexten return peer
def on_peer_event(self, event): peer_name = event['peer'].split('/')[1] model = Model() peer = model.query(SipPeer).filter_by(name=peer_name).first() if peer: event['username'] = peer_name event['exten'] = peer.regexten event['useragent'] = peer.useragent event['channel'] = False if peer.fullcontact and 'transport=tls' in peer.fullcontact.lower( ): event['tls'] = True else: event['tls'] = False if peer.encryption == 'yes': event['srtp'] = True else: event['srtp'] = False sse.resource.notify(event, 'peer', 'all') else: event['channel'] = True sse.resource.notify(event, 'peer', 'all')
def render_accounts(self, request): res = "<h2>accounts</h2>" logged = session.get_user(request) if not logged or not logged.admin: return redirectTo("/", request) model = Model() all_users = model.query(User) total_credit = Decimal() for user in all_users: ext = user.voip_id credit = user.credit peer = model.query(SipPeer).filter_by(regexten=ext).first() if peer and peer.name: username = peer.name else: username = "******" res += "<p>%s <a href='/user/%s'>%s</a> %.3f</p>" % ( str(ext), str(ext), str(username), credit) total_credit += Decimal(credit) res += "<p>total credit: %s</p>" % (total_credit, ) return res
def get_calls(user_ext, logged, limit=0, offset=0, format='html'): model = Model() user = model.get_user_fromext(user_ext) if not user: return "" if format == 'html': res = "" else: res = [] all_calls = user.calls last = len(all_calls) if limit and len(user.calls) > limit + offset: all_calls = user.calls[last-offset-limit:last-offset] for call in all_calls: destination = call.destination date = call.timestamp duration = call.duration duration = "%sm %ss" % (duration/60, duration%60) cost = call.cost rate = call.rate if call.provider: provider = call.provider.name else: provider = 'unknown' pars = [date, destination, duration, cost, rate] if logged and logged.admin: pars.append(provider) if format == 'html': res = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%.3f</td><td>%.3f</td><td>%s</td></tr>\n" % tuple(pars)) + res else: if format == 'html': res = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%.3f</td><td>%.3f</td></tr>\n" % tuple(pars)) + res if format == 'json': pars[0] = str(pars[0]) pars[3] = float(pars[3]) pars[4] = float(pars[4]) res = [pars] + res return res
def notifyChildren(self, value, section='message', sessions=[]): """ Notify all children of given sessions of some event with data. value -- message payload (string or json serializable object). section -- event name. sessions -- sessions to send to. """ model = Model() for req in self._connections.keys(): if req._disconnected: print "sse client disconnected", req self._connections.pop(req) else: conn = self._connections[req] web_session = model.query(WebSession).filter_by(session_id=conn.session).first() if sessions == 'all' or (conn.session in sessions) or (web_session and web_session.user and web_session.user.admin): #if not sessions or (conn.session in sessions) or (web_session and web_session.user and web_session.user.admin): if value.__class__ == str: conn.write(time.time(), value, section) else: conn.write(time.time(), json.dumps(value), section)
def login(self, login, password, request, email=''): peer = self.check_password(login, password) if peer: user_ext = peer.regexten model = Model() user = model.get_user_fromext(user_ext) if not user: user = User(user_ext) if email: user.email = email model.session.add(user) model.session.commit() session_id = str(request.getSession().uid) web_session = model.query(WebSession).filter_by( session_id=session_id).first() if not web_session: web_session = WebSession(session_id=session_id, timestamp=datetime.now(), user=user) model.session.add(web_session) model.session.commit() return redirectTo("/user/" + user_ext, request) return redirectTo("/", request)
def archive_voicemail(self, request, logged, user_ext, msg_id): model = Model() msg = model.query(VoiceMailMessage).filter_by(msg_id=msg_id, mailboxuser=user_ext).first() if msg and msg.recording and (msg.mailboxuser == logged.voip_id or logged.admin): mb_user = msg.mailboxuser number = msg.msgnum msgdir = msg.dir destdir = '/var/spool/asterisk/voicemail/default/%s/Old' % (logged.voip_id,) msg.dir = destdir msg.msgnum = 500 model.session.commit() # reorder other messages in the folder msgs = model.query(VoiceMailMessage).filter_by(mailboxuser=mb_user) lastmsg = -1 for amsg in msgs: if amsg.msgnum > number and amsg.dir == msgdir: amsg.msgnum -= 1 if amsg.dir == destdir and amsg.msgnum > lastmsg and not amsg.msg_id == msg_id: lastmsg = amsg.msgnum msg.msgnum = lastmsg + 1 model.session.commit() return mb_user return logged.voip_id
def get_calls(user_ext, logged): model = Model() user = model.get_user_fromext(user_ext) if not user: return "" res = "" for call in user.calls: destination = call.destination date = call.timestamp duration = call.duration duration = "%sm %ss" % (duration/60, duration%60) cost = call.cost rate = call.rate if call.provider: provider = call.provider.name else: provider = 'unknown' if logged and logged.admin: res = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%.3f</td><td>%.3f</td><td>%s</td></tr>\n" % (date, destination, duration, cost, rate, provider)) + res else: res = ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%.3f</td><td>%.3f</td></tr>\n" % (date, destination, duration, cost, rate)) + res return res
def render_all_text(self): model = Model() calls = model.query(Call).order_by(desc(Call.timestamp)).limit(1000) origins = set() count_country = defaultdict(int) result = "" call_data = [['Origin', 'Destination', 'Country', 'Duration', 'Date']] for call in calls: country_data = ext2country(str(call.destination)) count_country[country_data[0]+"-"+country_data[1]] += 1 if call.user: origin = str(call.user.voip_id) origins.add(str(call.user.voip_id)) else: origin = "unknown" origins.add('unknown') destination = str(call.destination) country_data = ": ".join(country_data) duration = "%.2f min" % (call.duration/60.0,) date = str(self.format_date(call.timestamp)) call_data.append([origin, destination, country_data, duration, date]) result += html.format_table(call_data) # country stats country_data = [['Country', 'Count']] for key, value in count_country.iteritems(): country_data.append([key, str(value)]) result += html.format_table(country_data) # number of origins origins = list(origins) origins.sort() result += "<p>Origins (%s): %s</p>" % (len(origins), str(origins)) return print_template('content-pbx-lorea', {'content': result})
def apply_transaction(self, address, balance, balance_confirmed, timestamp): model = Model() wallet = model.query(Wallet).filter_by(address=address).first() if wallet and wallet.user: user = wallet.user balance_unconfirmed = Decimal(balance) / Decimal("100000000") balance_confirmed = Decimal(balance_confirmed) / Decimal("100000000") received = wallet.received if not wallet.received: received = Decimal("0") new_coins = balance_confirmed - received wallet.received = balance_confirmed wallet.unconfirmed = balance_unconfirmed # XXX need to add a mechanism to account credit (convert to euros) #user.credit += new_coins log.msg("btc %s/%s: %s (+%s)" %(address, user.voip_id, balance_confirmed, balance_unconfirmed), system='BTC,tx') model.session.commit() sse.resource.notify( {'confirmed': float(balance_confirmed), 'unconfirmed': float(balance_unconfirmed), 'currency': 'BTC'}, 'balance', user) else: print "unknown tx destination"
def add_extension(username, extension): model = Model() new_extension = Extension( 'to-internal', extension, 1, 'Gosub', 'stdexten,%s,1(SIP/%s,default)' % (extension, username)) new_extension2 = Extension( 'to-internal-sip', username, 1, 'Gosub', 'stdexten,%s,1(SIP/%s,default)' % (extension, username)) new_voicemail = VoiceMail(context='default', mailbox=extension, password='******') model.session.add(new_extension) model.session.add(new_extension2) model.session.add(new_voicemail) model.session.commit()
def create_user(username, password): # create user for asterisk peer = create_asterisk_user(username, password) if not peer: return False # now, also create user in kamailio if configured if config.get('kamailio', False): create_kamailio_user(username, password) create_alias(username, peer.regexten) # we take the password kamailio has and put it into the obelisk table # so when or if kamailio is using asterisk db it will find it there) model = Model() user = session.query(KamailioUser).filter_by(username=username).first() peer.sippasswd = user.ha1 model.session.commit() return peer
def general_stats(self): res = "" total = 0 total_free = 0 free_calls = 0 cost_calls = 0 total_cost = Decimal() total_benefit = Decimal() model = Model() calls = model.query(Call) for call in calls: cost = Decimal(call.cost) duration = call.charged minutes = duration / 60 if cost: total += duration cost_calls += 1 total_cost += cost total_benefit += Decimal(minutes) * Decimal(0.001) + Decimal( 0.001) else: total_free += duration free_calls += 1 model = Model() btc_received = model.query(func.sum(Wallet.received)).scalar() btc_unconfirmed = model.query(func.sum(Wallet.unconfirmed)).scalar() btc_accounted = model.query(func.sum(Wallet.accounted)).scalar() if btc_unconfirmed: unconfirmed = '(+%.3f)' % (float(btc_unconfirmed), ) else: unconfirmed = '' res += "<p>Minutos con coste: %s</p>\n" % (total / 60, ) res += "<p>Minutos gratis: %s</p>\n" % (total_free / 60, ) res += "<p>Llamadas: %s Gratis: %s Con coste: %s</p>\n" % ( calls.count(), free_calls, cost_calls) res += "<p>Coste total %.3f Beneficio %.3f</p>" % (total_cost, total_benefit) res += "<p>btc in: %.3f %s out: %.3f</p>\n" % ( float(btc_received), unconfirmed, float(btc_accounted)) return res