コード例 #1
0
def main():
    """Função principal da aplicação."""
    manager = Manager(
        loop=asyncio.get_event_loop(),
        host=ASTERISK_IP,
        port=ASTERISK_PORT,
        username=ASTERISK_USER,
        secret=ASTERISK_PASSWORD,
    )

    @manager.register_event("QueueCallerLeave")
    @manager.register_event("AgentCalled")
    @manager.register_event("AgentConnect")
    @manager.register_event("AgentComplete")
    @manager.register_event("AgentDump")
    # @manager.register_event("AgentRingNoAnswer")
    @manager.register_event("MessageWaiting")
    # @manager.register_event('UserEvent')
    async def callback_agent(manager, message):
        fire(message)

    @manager.register_event("Hangup")
    async def callback_hangup(manager, message):
        # hangup from queue, external only
        if message.context == "ext-queues":
            fire(message)

    manager.connect()
    try:
        manager.loop.run_forever()
    except KeyboardInterrupt:
        manager.loop.close()
コード例 #2
0
    def attach(self, amihost):
        """
        attach amihost to a ChannelManager.

        Args:
            amihost (dict): A dictionary containing the connection settings for
                an AMI host.
        """
        # Create Panoramisk asterisk AMI manager.
        amimgr = Manager(loop=self.loop,
                         host=amihost['host'],
                         port=amihost['port'],
                         username=amihost['username'],
                         secret=amihost['password'],
                         ssl=False,
                         encoding='utf8',
                         log=self.logger)

        # Create our own channel manager.
        channel_manager = self.channel_manager(reporter=self.reporter, )

        # Tell Panoramisk to which events we want to listen.
        for event_name in channel_manager.INTERESTING_EVENTS:
            amimgr.register_event(event_name, self.on_event)

        # Record them for later use.
        self.amimgrs[amimgr] = channel_manager

        # Tell asyncio what to work on.
        asyncio.ensure_future(amimgr.connect())
コード例 #3
0
 async def start(self):
     # Set process name
     salt.utils.process.appendproctitle(self.__class__.__name__)
     manager_disconnected = asyncio.Event()
     # Ok let's connect to Asterisk and process events.
     self.loop = asyncio.get_event_loop()
     # Create event loop to receive actions as events.
     self.loop.create_task(self.action_event_loop())
     host = __salt__['config.get']('ami_host', 'localhost')
     port = int(__salt__['config.get']('ami_port', '5038'))
     login = __salt__['config.get']('ami_login', 'salt')
     self.manager = Manager(
         loop=self.loop,
         host=host,
         port=port,
         username=login,
         secret=__salt__['config.get']('ami_secret', 'stack'),
         forgetable_actions=('ping', 'login'),
     )
     log.info('AMI connecting to %s@%s:%s...', login, host, port)
     # Register events
     for ev_name in __salt__['config.get']('ami_register_events', []):
         log.info('Registering for AMI event %s', ev_name)
         self.manager.register_event(ev_name, self.on_asterisk_event)
     try:
         await self.manager.connect()
         log.info('Connected to AMI.')
     except Exception as e:
         log.error('Cannot connect to Asterisk AMI: %s', e)
     await manager_disconnected.wait()
コード例 #4
0
 def __init__(self, bot):
     self.bot = bot
     self.bot.asterirc = self
     self.config = config = dict(
         host='127.0.0.1',
         port=5038,
         http_port='8088',
         protocol='http',
         debug=True,
     )
     config.update(bot.config.get('asterisk', {}))
     self.log = logging.getLogger('irc3.ast')
     self.ilog = logging.getLogger('irc.asterirc')
     self.ilog.set_irc_targets(bot, self.config['channel'])
     self.log.info('Channel is set to {channel}'.format(**config))
     self.rooms = defaultdict(dict)
     self.http = None
     self.resolver = irc3.utils.maybedotted(self.config['resolver'])
     self.manager = Manager(log=logging.getLogger('irc3.ast.manager'),
                            **config)
     self.manager.register_event('Shutdown', self.handle_shutdown)
     self.manager.register_event('Meet*', self.handle_meetme)
     if config.get('debug'):
         self.manager.register_event('*', self.handle_event)
     if isinstance(self.resolver, type):
         self.resolver = self.resolver(bot)
コード例 #5
0
def queue_status():
    manager = Manager(loop=asyncio.get_event_loop(),
                      host='127.0.0.1', port=5039,
                      username='******', secret='mysecret')
    yield from manager.connect()
    queues_details = yield from manager.send_action({'Action': 'QueueStatus', 'Queue': 'queue_name'})
    manager.close()
    pprint(queues_details)
コード例 #6
0
def extension_status():
    manager = Manager(loop=asyncio.get_event_loop(),
                      host='127.0.0.1', port=5039,
                      username='******', secret='password')
    yield from manager.connect()
    extension = yield from manager.send_action({'Action': 'ExtensionState',
                                                'Exten': '2001',
                                                'Context': 'default'})
    manager.close()
    pprint(extension)
コード例 #7
0
ファイル: originate.py プロジェクト: vegaelle/panoramisk
def originate():
    manager = Manager(loop=asyncio.get_event_loop(), host='127.0.0.1', username='******', secret='password')
    yield from manager.connect()
    result = yield from manager.send_action_via_manager({'Action': 'Originate',
                                                            'Channel': 'SIP/gawel',
                                                            'WaitTime': 20,
                                                            'CallerID': 'gawel',
                                                            'Exten': '0299999999',
                                                            'Context': 'default',
                                                            'Priority': 1,})
    pprint(result)
コード例 #8
0
ファイル: queue_status.py プロジェクト: vegaelle/panoramisk
def queue_status():
    MANAGER = Manager(loop=asyncio.get_event_loop(),
                      host='127.0.0.1',
                      username='******',
                      secret='password')
    yield from MANAGER.connect()
    queues_details = yield from MANAGER.send_action_via_manager({
        'Action':
        'QueueStatus',
        'Queue':
        'queue_name'
    })
    pprint(queues_details)
コード例 #9
0
ファイル: perpetual_ping.py プロジェクト: smurfix/panoramisk
async def ping(lp, username, secret):
    manager = Manager(loop=lp,
                      host='127.0.0.1',
                      port=5038,
                      username=username,
                      secret=secret)
    await manager.connect()
    while True:
        p = await manager.send_action({'Action': 'ping'})
        # p = await manager.send_action({'Action': 'SIPpeers'})
        pprint(p)
        await asyncio.sleep(1)
    manager.close()
コード例 #10
0
def ping(lp, username, secret):
    manager = Manager(loop=lp,
                      host='127.0.0.1',
                      port=5038,
                      username=username,
                      secret=secret,
                      forgetable_actions=('login', ))
    yield from manager.connect()
    while True:
        p = yield from manager.send_action({'Action': 'ping'})
        # p = yield from manager.send_action({'Action': 'SIPpeers'})
        pprint(p)
        yield from asyncio.sleep(1)
    manager.close()
コード例 #11
0
async def test_reconnection_without_lost(event_loop):
    unused_tcp_port = unused_tcp_port_factory()

    print('Start server on %s' % unused_tcp_port)
    manager = Manager(loop=event_loop,
                      host='127.0.0.1',
                      port=unused_tcp_port,
                      username='******',
                      secret='secret')
    server = Asterisk(event_loop, unused_tcp_port)

    await server.start()
    await manager.connect()
    await server.data_received()
    print(server.actions)
    login = server.actions[0]
    assert login['action'] == 'Login'
    unused_tcp_port = unused_tcp_port_factory()

    print('Restart server on %s' % unused_tcp_port)
    server.port = unused_tcp_port
    manager.config['port'] = unused_tcp_port
    await server.stop()

    manager.send_action({'Action': 'Ping'})
    f = manager.send_action({'Action': 'Test', 'Command': 'test'})
    fully_booted = Event('FullyBooted')

    await asyncio.sleep(.1)
    assert manager.awaiting_actions
    await server.start()
    await asyncio.sleep(2)
    assert manager.awaiting_actions
    manager.dispatch(fully_booted)
    await asyncio.sleep(.5)
    assert not manager.awaiting_actions
    resp = await f
    await server.stop()

    login2 = server.actions[0]
    assert login2['action'] == 'Login'
    assert login['actionid'] != login2['actionid']

    test_action = server.actions[-1]
    assert test_action.id == resp.id
    assert test_action['action'] == 'Test'
コード例 #12
0
    def __init__(self, loop):
        self.manager = Manager(loop=loop,
                               host='178.248.87.116',
                               port=1709,
                               username='******',
                               secret='100')
        self.callManager = CallBaseManager()
        self.httpclient = HttpClientTornado()

        self.manager.register_event('FullyBooted', self.FullyBooted)
        self.manager.register_event('BridgeEnter', self.BridgeEnter)
        self.manager.register_event('Hangup', self.Hangup)

        self.manager.connect()
        try:
            self.manager.loop.run_forever()
        except KeyboardInterrupt:
            self.manager.loop.close()
コード例 #13
0
    def attach(self, asterisk):
        """
        Set up a connection to the specified Asterisk

        Args:
            asterisk (str): A connection string
        """
        ami_host = urlparse(asterisk)

        # Create Panoramisk asterisk AMI manager.
        manager = Manager(loop=self.loop,
                          host=ami_host.hostname,
                          port=ami_host.port,
                          username=ami_host.username,
                          secret=ami_host.password,
                          ssl=ami_host.scheme in ('ssl', 'tls'),
                          encoding='utf8',
                          log=self.logger)

        # Create our own channel manager.
        event_handler = self.event_handler(
            reporter=self.reporter,
            hostname=ami_host.hostname,
            logger=self.logger,
        )

        # Tell Panoramisk to which events we want to listen.
        if event_handler.FILTER_EVENTS:
            for event_name in event_handler.event_handlers().keys():
                manager.register_event(event_name, self.on_event)
        else:
            manager.register_event('*', self.on_event)

        # Record them for later use.
        self.ami_managers[manager] = event_handler

        # Tell asyncio what to work on.
        asyncio.ensure_future(manager.connect())
コード例 #14
0
def putCids(lp, args, config):
    auth = HTTPBasicAuth(config['carddav']['user'], config['carddav']['pass'])
    url = config['carddav']['url']

    # connect to asterisk
    ami = Manager(host=config['ami']['host'],
                  port=config['ami']['port'],
                  username=config['ami']['user'],
                  secret=config['ami']['pass'])
    yield from ami.connect()

    # get phone numbers from vcard
    for vurl in getAllVcardLinks(url, auth):
        r = requests.request("GET", vurl, auth=auth)
        try:
            vcard = vobject.readOne(r.text)
        except ParseError as e:
            print(e)
            continue
        if "tel" in vcard.contents:
            for telno in vcard.contents['tel']:
                num = tidyPhoneNumber(config, telno.value)
                if num and "fn" in vcard.contents:
                    name = vcard.fn.value
                    print("Adding/updating Number: %s Name: %s" % (num, name),
                          end="... ")
                    if not args.no_update:
                        ami_result = yield from ami.send_action({
                            "Action": "DBPut",
                            "Family": "cidname",
                            "Key": num,
                            "Val": name
                        })
                        print(ami_result.Response)
                    else:
                        print("no-update")
    ami.close()
コード例 #15
0
ファイル: main.py プロジェクト: ipsip-vn/asterisk-stats
AMI_USER = os.environ.get('AMI_USER', 'asterisk')
AMI_SECRET = os.environ.get('AMI_SECRET', 'secret')

stats = statsd.StatsClient(*STATSD_HOST.split(':'))

loop = asyncio.get_event_loop()

logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)

# Asterisk AMI manager client
manager = Manager(loop=loop,
                  host=AMI_HOST, port=AMI_PORT,
                  username=AMI_USER,
                  secret=AMI_SECRET,
                  ping_interval=10,  # Periodically ping AMI (dead or alive)
                  reconnect_timeout=2,  # Timeout reconnect if connection lost
                  )
manager.loop.set_debug(True)

channels_current = {}  # Current channels gauge
sip_reachable_peers = set()
iax_reachable_peers = set()
sip_total_peers = 0
iax_total_peers = 0


def main():
    logger.info('Connecting to {}:{}.'.format(AMI_HOST, AMI_PORT))
コード例 #16
0
ファイル: bitrix-sync.py プロジェクト: bulnv/ami_bitrix
        'call_posted_time': '',
        'call_finished': False,
        'call_registred': False,
        'call_record_attached': False
    }
}

if not DEBUG:
    logging.config.dictConfig(LOGGING)
logger = logging.getLogger('ParkLogger')

manager = Manager(
    host=os.getenv('AMI_HOST', '127.0.0.1'),
    port=os.getenv('AMI_PORT', 5038),
    username=os.getenv('AMI_USERNAME', 'user'),
    secret=os.getenv('AMI_SECRET', 'password'),
    ping_delay=10,  # Delay after start
    ping_interval=10,  # Periodically ping AMI (dead or alive)
    reconnect_timeout=2,  # Timeout reconnect if connection lost
)


def grab_bx_users(bx24):
    return {
        user['UF_PHONE_INNER']: user['ID']
        for user in bx24.callMethod('user.get') if user['UF_PHONE_INNER']
    }


def on_connect(mngr: Manager):
    logging.info('Connected to %s:%s AMI socket successfully' %
コード例 #17
0
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'call_center.settings')
django.setup()
from django.conf import settings
from crm.models import Call, Client
from django.utils import timezone
import asyncio
import pytz
import requests
from datetime import datetime, timedelta
from panoramisk import Manager

manager = Manager(loop=asyncio.get_event_loop(),
                  host=settings.IP,
                  username=settings.ASTER_USER,
                  secret=settings.ASTER_PASS)

# Получение необходимой группы номеров.


def groups_phone_numbers():
    url = settings.GROUP_PHONE_NUMBER_URL
    phones_json = requests.get(url, verify=False).json()
    return phones_json[settings.NAME_GROUP_PHONE_NUMBER].split('-')


numbers = groups_phone_numbers()


@manager.register_event('Hangup')
コード例 #18
0
#
# AMI CONF in ASTERISK
#
# add this below, adapting permit and deny accordingly
# to /etc/asterisk/manager_custom.conf
# [queue_alert_user]
# secret=queue_alert_pwd
# deny=0.0.0.0/0.0.0.0
# permit=0.0.0.0/0.0.0.0
# read = all
# eventfilter=Event: QueueCallerAbandon

manager = Manager(
    loop=asyncio.get_event_loop(),
    host="localhost",
    username="******",
    secret="queue_alert_pwd",
)
#
# you need to create the above webhook in Rocket.Chat
# and paste the Script from incoming.webhook.Rocket.Chat.js
# this is the webhook url
incoming_endpoint = (
    "http://localhost:3000/hooks/" +
    "620e9615701ffe000986a1c8/8fRecuRk5Muyf3mtsGtDGFgJDkZ8wuEjm5qNqNFqxuCLaErE"
)

# this is an example.
# you can filter the callback by different method
# or inside the method, using message.event
# you can also duplicate the code below, and send different
コード例 #19
0
ファイル: amiAPI.py プロジェクト: Alquemist/AsteriskAPI
import asyncio
from panoramisk import Manager
import json
from pprint import pprint

sipLog = 'sipLog.txt'
manager = Manager(loop=asyncio.get_event_loop(),
                  host='192.168.2.62',
                  username='',
                  secret='')

# This will print NewChannel Events.
# AppData='hangupcall, CallerIDName='test2' CallerIDNum='112' Channel='PJSIP/112-0000004a' ChannelState='6',
# ChannelState='6' ChannelStateDesc='Up' ConnectedLineName='Test1' ConnectedLineNum='111' Context='ext-local' Event='Newexten'
#
#
@manager.register_event('Newexten')
def callback(manager, message):
    # resp = yield from manager.send_action({'Action': 'Status'})
    # print(resp)

    state = int(message.get('ChannelState')) if message.get('Application') != 'Hangup' and message.get('Application') != 'Finished' else message.get('Application')

    callStateSwitcher = {
        4: 'Incoming',
        5: 'Ringing',
        6: 'Answered',
        7: 'Busy',
        'Hangup': 'Hangup',
        'Finished': 'NoAnswer',
    }
コード例 #20
0
import asyncio
from panoramisk import Manager

manager = Manager(loop=asyncio.get_event_loop(),
                  host='ip',
                  username='******',
                  secret='secret')


@manager.register_event('*')
def callback(event, manager):
    if "FullyBooted" not in manager.event:
        """This will print every event, but the FullyBooted events as these
        will continuously spam your screen"""
        print(manager)


"""
# This will print NewChannel Events
@manager.register_event('NewChannel')
def callback(event, manager):
    print(manager)


# This will print Hangup Events
@manager.register_event('Hangup')
def callback(event, manager):
    print(manager)
"""

コード例 #21
0
AMI_HOST = os.environ.get('AMI_HOST', 'localhost')
AMI_PORT = os.environ.get('AMI_PORT', '5038')
AMI_USER = os.environ.get('AMI_USER', 'asterisk')
AMI_SECRET = os.environ.get('AMI_SECRET', 'secret')

stats = statsd.StatsClient(*STATSD_HOST.split(':'))

loop = asyncio.get_event_loop()

logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)

# Asterisk AMI manager client
manager = Manager(loop=loop,
                  host=AMI_HOST, port=AMI_PORT,
                  username=AMI_USER,
                  secret=AMI_SECRET)
manager.loop.set_debug(True)

channels_current = {} # Current channels gauge
sip_reachable_peers = set()

def main():
    logger.info('Connecting to {}:{}.'.format(AMI_HOST, AMI_PORT))
    manager.connect()
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        loop.close()

コード例 #22
0
ファイル: sipcheck.py プロジェクト: iiiusky/sipcheck
    maxNumTries = int(config['attacker']['maxNumTries'])
    maxNumInvitesWithoutAuth = int(config['attacker']['maxNumInvites'])
    BLExpireTime = int(config['attacker']['BLExpireTime'])
    WLExpireTime = int(config['attacker']['WLExpireTime'])
    TLExpireTime = int(config['attacker']['TLExpireTime'])
    iptablesChain = config['attacker']['iptablesChain']
else:
    maxNumTries = 5
    BLExpireTime = 86400
    WLExpireTime = 21600
    TLExpireTime = 3600
    iptablesChain = "INPUT"


# We connect into a Asterisk Manager (Asterisk 11 or newer with Security permissions to read)
manager = Manager(loop=asyncio.get_event_loop(), host=managerHost, port=managerPort, username=managerUser, secret=managerPass)

# Set the logging system to dump everything we do
logging.basicConfig(filename=logFile,level=logging.DEBUG,format='%(asctime)s %(levelname)s: %(message)s')
Log = logging.getLogger()
level = logging.getLevelName(logLevel)
Log.setLevel(level)

logging.debug("Configured Blacklist expire time: "+str(BLExpireTime))
logging.debug("Configured Whitelist expire time: "+str(WLExpireTime))
logging.debug("Configured Templist expire time: "+str(TLExpireTime))

# We set the lists where we storage the addresses.
templist={}             # Suspected addresses
whitelist={}            # Trusted addresses
blacklist={}            # Attackers addresses