File: //usr/lib/python2.7/site-packages/salt/beacons/telegram_bot_msg.py
# -*- coding: utf-8 -*-
'''
Beacon to emit Telegram messages
Requires the python-telegram-bot library
'''
# Import Python libs
from __future__ import absolute_import, unicode_literals
import logging
from salt.ext.six.moves import map
# Import 3rd Party libs
try:
import telegram
logging.getLogger('telegram').setLevel(logging.CRITICAL)
HAS_TELEGRAM = True
except ImportError:
HAS_TELEGRAM = False
log = logging.getLogger(__name__)
__virtualname__ = 'telegram_bot_msg'
def __virtual__():
if HAS_TELEGRAM:
return __virtualname__
else:
return False
def validate(config):
'''
Validate the beacon configuration
'''
if not isinstance(config, list):
return False, ('Configuration for telegram_bot_msg '
'beacon must be a list.')
_config = {}
list(map(_config.update, config))
if not all(_config.get(required_config)
for required_config in ['token', 'accept_from']):
return False, ('Not all required configuration for '
'telegram_bot_msg are set.')
if not isinstance(_config.get('accept_from'), list):
return False, ('Configuration for telegram_bot_msg, '
'accept_from must be a list of usernames.')
return True, 'Valid beacon configuration.'
def beacon(config):
'''
Emit a dict with a key "msgs" whose value is a list of messages
sent to the configured bot by one of the allowed usernames.
.. code-block:: yaml
beacons:
telegram_bot_msg:
- token: "<bot access token>"
- accept_from:
- "<valid username>"
- interval: 10
'''
_config = {}
list(map(_config.update, config))
log.debug('telegram_bot_msg beacon starting')
ret = []
output = {}
output['msgs'] = []
bot = telegram.Bot(_config['token'])
updates = bot.get_updates(limit=100, timeout=0, network_delay=10)
log.debug('Num updates: %d', len(updates))
if not updates:
log.debug('Telegram Bot beacon has no new messages')
return ret
latest_update_id = 0
for update in updates:
message = update.message
if update.update_id > latest_update_id:
latest_update_id = update.update_id
if message.chat.username in _config['accept_from']:
output['msgs'].append(message.to_dict())
# mark in the server that previous messages are processed
bot.get_updates(offset=latest_update_id + 1)
log.debug('Emitting %d messages.', len(output['msgs']))
if output['msgs']:
ret.append(output)
return ret