diff --git a/pandora_plugins/message_app_connectors/discord/.gitignore b/pandora_plugins/message_app_connectors/discord/.gitignore index 5ceb3864c2..9c10928fd9 100644 --- a/pandora_plugins/message_app_connectors/discord/.gitignore +++ b/pandora_plugins/message_app_connectors/discord/.gitignore @@ -1 +1,3 @@ -venv +build +dist +*spec \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/discord/pandora_discord_cli.py b/pandora_plugins/message_app_connectors/discord/pandora_discord_cli.py index 715657da28..1efa696d19 100644 --- a/pandora_plugins/message_app_connectors/discord/pandora_discord_cli.py +++ b/pandora_plugins/message_app_connectors/discord/pandora_discord_cli.py @@ -1,4 +1,4 @@ -import requests, argparse, sys, os +import requests, argparse, sys, os, signal from datetime import datetime from re import search from base64 import b64decode @@ -26,6 +26,18 @@ parser.add_argument('--tmp_dir', help='Temporary path to store graph images', de args = parser.parse_args() +# Define a function to handle the SIGINT signal +def sigint_handler(signal, frame): + print ('\nInterrupted by user') + sys.exit(0) +signal.signal(signal.SIGINT, sigint_handler) + +# Define a function to handle the SIGTERM signal +def sigterm_handler(signum, frame): + print("Received SIGTERM signal.") + sys.exit(0) +signal.signal(signal.SIGTERM, sigterm_handler) + ### Functions: def parse_dic(cValues): """convert coma separate keypairs into a dic. EX "test=5,house=8,market=2" wil return "{'test': '5', 'casa': '8', 'mercado': '2'}" """ diff --git a/pandora_plugins/message_app_connectors/gchat/.gitignore b/pandora_plugins/message_app_connectors/gchat/.gitignore new file mode 100644 index 0000000000..9c10928fd9 --- /dev/null +++ b/pandora_plugins/message_app_connectors/gchat/.gitignore @@ -0,0 +1,3 @@ +build +dist +*spec \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/gchat/pandora-gchat-cli.py b/pandora_plugins/message_app_connectors/gchat/pandora-gchat-cli.py index 4584768ec7..b062cc34ed 100644 --- a/pandora_plugins/message_app_connectors/gchat/pandora-gchat-cli.py +++ b/pandora_plugins/message_app_connectors/gchat/pandora-gchat-cli.py @@ -1,8 +1,4 @@ -import requests -import argparse -import sys -import os -import json +import requests, signal, argparse, sys, os, json ### Variables and arg parser ### parser = argparse.ArgumentParser(description='Google chat webhook conector') @@ -23,6 +19,18 @@ parser.add_argument('--btn_url', help='button url', args = parser.parse_args() +# Define a function to handle the SIGINT signal +def sigint_handler(signal, frame): + print ('\nInterrupted by user') + sys.exit(0) +signal.signal(signal.SIGINT, sigint_handler) + +# Define a function to handle the SIGTERM signal +def sigterm_handler(signum, frame): + print("Received SIGTERM signal.") + sys.exit(0) +signal.signal(signal.SIGTERM, sigterm_handler) + # classes diff --git a/pandora_plugins/message_app_connectors/ilert/.gitignore b/pandora_plugins/message_app_connectors/ilert/.gitignore new file mode 100644 index 0000000000..9c10928fd9 --- /dev/null +++ b/pandora_plugins/message_app_connectors/ilert/.gitignore @@ -0,0 +1,3 @@ +build +dist +*spec \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/ilert/pandora_ilert.py b/pandora_plugins/message_app_connectors/ilert/pandora_ilert.py new file mode 100644 index 0000000000..33f9654a6e --- /dev/null +++ b/pandora_plugins/message_app_connectors/ilert/pandora_ilert.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +__author__ = "PandoraFMS Team" +__copyright__ = "Copyright 2023, PandoraFMS" +#__credits__ = ["Rob Knight", "Peter Maxwell", "Gavin Huttley", "Matthew Wakefield"] +__maintainer__ = "Projects/QA department" +__status__ = "Test" +__version__ = "1" + +import requests, json, sys, argparse, signal, re,datetime + +current_date=datetime.datetime.now() +info= f""" +PandoraFMS ilert integration. +Version: {__version__} +""" + +parser = argparse.ArgumentParser(description= info, formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('-a', '--api_key', help='Api key from ilert', required=True) +parser.add_argument('-t', '--event_type', help='Type of the created event. Can be "alert" or "resolved".', type=str, required=True) +parser.add_argument('-k', '--event_key', help='Title of the event, used as key', type=str, required=True) +parser.add_argument('-T', '--title', help='Title of the event.', type=str, required=True) +parser.add_argument('-d', '--description', help='Description of the event', type=str, default='') +parser.add_argument('-A', '--agent_name', help='pandorafms agent name', type=str, default='') +parser.add_argument('-p', '--priority', help='priority', type=str, default='') +parser.add_argument('-m', '--module_name', help='priority', type=str, default='') +parser.add_argument('-D', '--module_data', help='priority', type=str, default='') +parser.add_argument('-C', '--created_date', help='event date', type=str, default=current_date) + +args = parser.parse_args() + +# Define a function to handle the SIGINT signal +def sigint_handler(signal, frame): + print ('\nInterrupted by user') + sys.exit(0) +signal.signal(signal.SIGINT, sigint_handler) + +# Define a function to handle the SIGTERM signal +def sigterm_handler(signum, frame): + print("Received SIGTERM signal.") + sys.exit(0) +signal.signal(signal.SIGTERM, sigterm_handler) + +# Functions + +def post_url(url, data=None, headers={"Accept": "application/json"},): + try : + data = requests.post(url, data=data, headers=headers) + result_data = data.status_code + except Exception as e : + print (f"[red]Error[/red] posting data from {url} {e}", file = sys.stderr ) + sys.exit() + return result_data + +if __name__ == "__main__": + # Prepare data + url = f"https://api.ilert.com/api/v1/events/pandorafms/{args.api_key}" + + payload = { + "eventType": args.event_type, + "title": args.title, + "description": args.description, + "incidentKey": args.event_key, + "details": { + "agentName": args.agent_name, + "createdAt": str(args.created_date), + "priority": args.priority, + "moduleName": args.module_name, + "moduleData": args.module_data + } + } + + response=post_url(url, data=json.dumps(payload)) + + if response == 202: print ("Alert has been submitted!") + print (f"http_code: {response}", file=sys.stderr) + diff --git a/pandora_plugins/message_app_connectors/ilert/requirements.txt b/pandora_plugins/message_app_connectors/ilert/requirements.txt new file mode 100644 index 0000000000..b8d86d56d7 --- /dev/null +++ b/pandora_plugins/message_app_connectors/ilert/requirements.txt @@ -0,0 +1,8 @@ +altgraph==0.17.3 +certifi==2023.7.22 +charset-normalizer==3.3.0 +idna==3.4 +pyinstaller==5.13.0 +pyinstaller-hooks-contrib==2023.7 +requests==2.31.0 +urllib3==2.0.5 diff --git a/pandora_plugins/message_app_connectors/ms-teams/.gitignore b/pandora_plugins/message_app_connectors/ms-teams/.gitignore new file mode 100644 index 0000000000..9c10928fd9 --- /dev/null +++ b/pandora_plugins/message_app_connectors/ms-teams/.gitignore @@ -0,0 +1,3 @@ +build +dist +*spec \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/ms-teams/pandora-msteams-cli.py b/pandora_plugins/message_app_connectors/ms-teams/pandora-msteams-cli.py index f0d4ac89a8..e387b447dd 100755 --- a/pandora_plugins/message_app_connectors/ms-teams/pandora-msteams-cli.py +++ b/pandora_plugins/message_app_connectors/ms-teams/pandora-msteams-cli.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import argparse, pymsteams +import argparse, pymsteams, signal parser = argparse.ArgumentParser(description='MS Teams connector') parser.add_argument('-d', '--data', help='Data in coma separate keypairs. Ex: test=5,house=2', required=True) @@ -16,6 +16,18 @@ parser.add_argument('--button_desc', help='Pandora button description', default= args = parser.parse_args() +# Define a function to handle the SIGINT signal +def sigint_handler(signal, frame): + print ('\nInterrupted by user') + sys.exit(0) +signal.signal(signal.SIGINT, sigint_handler) + +# Define a function to handle the SIGTERM signal +def sigterm_handler(signum, frame): + print("Received SIGTERM signal.") + sys.exit(0) +signal.signal(signal.SIGTERM, sigterm_handler) + ### Functions: def parse_dic(cValues): """convert coma separate keypairs into a dic. EX "test=5,house=8,market=2" wil return "{'test': '5', 'casa': '8', 'mercado': '2'}" """ diff --git a/pandora_plugins/message_app_connectors/ms-teams/pandora-teams-cli.py b/pandora_plugins/message_app_connectors/ms-teams/pandora-teams-cli.py deleted file mode 100755 index 4bd997b38f..0000000000 --- a/pandora_plugins/message_app_connectors/ms-teams/pandora-teams-cli.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -import argparse, pymsteams - -parser = argparse.ArgumentParser(description='MsTeams connector') -parser.add_argument('-d', '--data', help='Data in coma separate keypairs. Ex: test=5,house=2', required=True) -parser.add_argument('-u', '--url', help='Teams webhook URL', required=True) -parser.add_argument('-t', '--alert_tittle', help='Alert tittle', default='PandoraFMS alert fired') -parser.add_argument('-D', '--alert_desc', help='Alert description', default='Alert Fired') -parser.add_argument('-m', '--message', help='Alert message', default='') -parser.add_argument('-T','--tittle_color', help='Alert tittle descripcion in HEX EX: 53e514', default="53e514") -parser.add_argument('--sub_desc', help='Alert sub description', default='Alert Fired') -parser.add_argument('--thumb', help='Custom thumbnail url', default="https://pandorafms.com/images/alerta_roja.png") -parser.add_argument('--button', help='Pandora button Url', default='https://pandorafms.com') -parser.add_argument('--button_desc', help='Pandora button description', default='Open web console') - -args = parser.parse_args() - -### Functions: -def parse_dic(cValues): - """convert coma separate keypairs into a dic. EX "test=5,house=8,market=2" wil return "{'test': '5', 'casa': '8', 'mercado': '2'}" """ - data={} - try : - for kv in cValues.split(","): - k,v = kv.strip().split("=") - data[k.strip()]=v.strip() - except Exception as e : - print(f"Warning, error parsing keypairs values: {e}") - return data - -def add_embed_itmes(data): - """iterate dictionary and set webhook fields, one for eacj keypair""" - for k, v in data.items() : - myMessageSection.addFact(f"{k}:", v) - -##Main - -# You must create the connectorcard object with the Microsoft Webhook URL -myTeamsMessage = pymsteams.connectorcard(args.url) - -# Set Summary -myTeamsMessage.summary(args.message) - -# Set Alert tittle -myTeamsMessage.title(args.alert_tittle) - -# Set link buttom -myTeamsMessage.addLinkButton(args.button_desc, args.button) - -# Set message color -myTeamsMessage.color(args.tittle_color) - -# create the section -myMessageSection = pymsteams.cardsection() - -# Section Title -myMessageSection.title(args.message) - -# Activity Elements -myMessageSection.activityTitle(args.alert_desc) -myMessageSection.activitySubtitle(args.sub_desc) -myMessageSection.activityImage(args.thumb) - -# Facts are key value pairs displayed in a list. -data = parse_dic(args.data) -add_embed_itmes(data) - -# Section Text -# myMessageSection.text("This is my section text") - -# Section Images -# myMessageSection.addImage("http://i.imgur.com/c4jt321l.png", ititle="This Is Fine") - -# Add your section to the connector card object before sending -myTeamsMessage.addSection(myMessageSection) - -# Then send the card -try: - myTeamsMessage.send() -except Exception as e : - print(f"Error sending to message: {e}") \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/slack/.gitignore b/pandora_plugins/message_app_connectors/slack/.gitignore index 5ceb3864c2..9c10928fd9 100644 --- a/pandora_plugins/message_app_connectors/slack/.gitignore +++ b/pandora_plugins/message_app_connectors/slack/.gitignore @@ -1 +1,3 @@ -venv +build +dist +*spec \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/slack/pandora-slack-cli.py b/pandora_plugins/message_app_connectors/slack/pandora-slack-cli.py index 5eb24fc865..8247bc1a5b 100644 --- a/pandora_plugins/message_app_connectors/slack/pandora-slack-cli.py +++ b/pandora_plugins/message_app_connectors/slack/pandora-slack-cli.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import requests, argparse, sys, os +import requests, argparse, sys, os, signal from slack_sdk import WebClient from slack_sdk.errors import SlackApiError from datetime import datetime @@ -26,6 +26,18 @@ parser.add_argument('--tmp_dir', help='Temporary path to store graph images', de args = parser.parse_args() filename = None +# Define a function to handle the SIGINT signal +def sigint_handler(signal, frame): + print ('\nInterrupted by user') + sys.exit(0) +signal.signal(signal.SIGINT, sigint_handler) + +# Define a function to handle the SIGTERM signal +def sigterm_handler(signum, frame): + print("Received SIGTERM signal.") + sys.exit(0) +signal.signal(signal.SIGTERM, sigterm_handler) + #Functions def parse_dic(cValues): @@ -126,7 +138,7 @@ def send_message(message, channel, client, feddback=None): assert e.response["ok"] is False assert e.response["error"] # str like 'invalid_auth', 'channel_not_found' print(f"Got an Slack auth error: {e.response['error']}") - exit() + sys.exit() def send_image(imagepath, channel, client) : """Send file as slack bot""" @@ -177,4 +189,4 @@ if args.footer: send_message(args.footer, args.channel, client) try: os.remove(filename) except: - exit() \ No newline at end of file + sys.exit() \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/telegram-bot-cli/.gitignore b/pandora_plugins/message_app_connectors/telegram-bot-cli/.gitignore new file mode 100644 index 0000000000..9c10928fd9 --- /dev/null +++ b/pandora_plugins/message_app_connectors/telegram-bot-cli/.gitignore @@ -0,0 +1,3 @@ +build +dist +*spec \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/telegram-bot-cli/pandora-telegram-cli.py b/pandora_plugins/message_app_connectors/telegram-bot-cli/pandora-telegram-cli.py index 8ee7520355..e7da24df83 100644 --- a/pandora_plugins/message_app_connectors/telegram-bot-cli/pandora-telegram-cli.py +++ b/pandora_plugins/message_app_connectors/telegram-bot-cli/pandora-telegram-cli.py @@ -1,4 +1,4 @@ -import requests, argparse, json, sys, os +import requests, argparse, json, sys, os, signal from datetime import datetime from base64 import b64decode @@ -27,7 +27,19 @@ def parse_dic(cValues): print(f"Warning, error parsing keypairs values: {e}") return data +# Define a function to handle the SIGINT signal +def sigint_handler(signal, frame): + print ('\nInterrupted by user') + sys.exit(0) +signal.signal(signal.SIGINT, sigint_handler) +# Define a function to handle the SIGTERM signal +def sigterm_handler(signum, frame): + print("Received SIGTERM signal.") + sys.exit(0) +signal.signal(signal.SIGTERM, sigterm_handler) + +#Functions def parse_api_conf(cConf): """Check apiconfiguration parameters """ if args.api_conf : diff --git a/pandora_plugins/message_app_connectors/vonage/.gitignore b/pandora_plugins/message_app_connectors/vonage/.gitignore new file mode 100644 index 0000000000..9c10928fd9 --- /dev/null +++ b/pandora_plugins/message_app_connectors/vonage/.gitignore @@ -0,0 +1,3 @@ +build +dist +*spec \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/vonage/pandora_vonage.py b/pandora_plugins/message_app_connectors/vonage/pandora_vonage.py new file mode 100644 index 0000000000..a233367042 --- /dev/null +++ b/pandora_plugins/message_app_connectors/vonage/pandora_vonage.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +__author__ = "PandoraFMS Team" +__copyright__ = "Copyright 2023, PandoraFMS" +#__credits__ = ["Rob Knight", "Peter Maxwell", "Gavin Huttley", "Matthew Wakefield"] +__maintainer__ = "Projects/QA department" +__status__ = "Test" +__version__ = "1" + +import vonage, json, sys, argparse, signal, re,datetime + +current_date=datetime.datetime.now() +info= f""" +PandoraFMS vonage integration. +Version: {__version__} +""" + +parser = argparse.ArgumentParser(description= info, formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('-a', '--api_key', help='Client key from vonage', required=True) +parser.add_argument('-s', '--secret', help='Secret key from vonage".', type=str, required=True) +parser.add_argument('-m', '--message', help='Title of the event, used as key', type=str, required=True) +parser.add_argument('-n', '--phone_number', help='Phone number to send sms with country code. Ex: "+34555444111,+34777444222" could be a coma separated list of numbers', type=str, required=True) +parser.add_argument('-f', '--from_alias', help='From number/string data', type=str, default="PandoraFMS") +parser.add_argument('-v', '--verbose', help='Debug information', action='store_true') + + +args = parser.parse_args() + +# Define a function to handle the SIGINT signal +def sigint_handler(signal, frame): + print ('\nInterrupted by user') + sys.exit(0) +signal.signal(signal.SIGINT, sigint_handler) + +# Define a function to handle the SIGTERM signal +def sigterm_handler(signum, frame): + print("Received SIGTERM signal.") + sys.exit(0) +signal.signal(signal.SIGTERM, sigterm_handler) + +# Functions + +def convet_list_comma (data:str): + if "," in data: + result = data.split(",") + else: + result = [] + result.append(data) + return result + + +if __name__ == "__main__": + # Prepare data + client = vonage.Client(key=args.api_key, secret=args.secret) + + try: + numbers=convet_list_comma(args.phone_number) + except Exception as e: + print (f"Error: {e}") + sys.exit() + + for number in numbers : + responseData = client.sms.send_message( + { + "from": args.from_alias, + "to": number, + "text": args.message, + } + ) + + if responseData["messages"][0]["status"] == "0": + print("Message sent successfully.") + else: + print(f"Message failed with error: {responseData['messages'][0]['error-text']}") + + #debug + if args.verbose == True: print (f"Debug: {responseData}") \ No newline at end of file diff --git a/pandora_plugins/message_app_connectors/vonage/requirements.txt b/pandora_plugins/message_app_connectors/vonage/requirements.txt new file mode 100644 index 0000000000..674ae0e1b7 --- /dev/null +++ b/pandora_plugins/message_app_connectors/vonage/requirements.txt @@ -0,0 +1,16 @@ +certifi==2023.7.22 +cffi==1.16.0 +charset-normalizer==3.3.0 +cryptography==41.0.4 +Deprecated==1.2.14 +idna==3.4 +pycparser==2.21 +pydantic==1.10.13 +PyJWT==2.8.0 +pytz==2023.3.post1 +requests==2.31.0 +typing_extensions==4.8.0 +urllib3==2.0.6 +vonage==3.9.1 +vonage-jwt==1.0.0 +wrapt==1.15.0