Skip to content

[pull] master from atlassian:master #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions release/integration-builder/oem/oem.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ def buildDebForOEM(String sourceDir, String name, String descrpt, Map fileMappin
def controlDir = "${project.buildDir}/debian_tmp/${sourceDir}/control"

def controlTarget = "${project.buildDir}/deb/control"
def debVersion = version.toString().replace("-", ".")

//CONTROL
copy {
Expand All @@ -98,7 +97,7 @@ def buildDebForOEM(String sourceDir, String name, String descrpt, Map fileMappin
from "${project.projectDir}/oem/native/control_deb"
filter {
it.replace('[description]', "'jsm client files'")
.replace('[version]', debVersion)
.replace('[version]', packageVersion)
.replace('[package-name]', "jsm-oem")
}
into controlDir
Expand Down
3 changes: 1 addition & 2 deletions release/integration-builder/opsview/opsview.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,12 @@ def buildDebForOpsviewV6(String sourceDir, String name, String descrpt, Map file
def controlDir = "${project.buildDir}/debian_tmp/${sourceDir}/control"

def controlTarget = "${project.buildDir}/deb/control"
def debVersion = version.toString().replace("-", ".")

copy {
from "${project.projectDir}/opsview/native/control_deb"
filter {
it.replace('[description]', "'Jsm client files'")
.replace('[version]', debVersion)
.replace('[version]', packageVersion)
.replace('[package-name]', "jsm-opsview")
}
into controlDir
Expand Down
4 changes: 2 additions & 2 deletions release/integration-builder/version.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"vcenter": "1.0.1",
"vcsa": "1.0.1",
"oem": "1.0.1",
"opsview": "1.0.1"
"oem": "1.0.2",
"opsview": "1.0.2"
}
14 changes: 13 additions & 1 deletion solarwinds-web-help-desk/conf/jec-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,19 @@
"apiToken": "<apiToken>"
},
"actionMappings": {
"acknowledgeNotification": {
"Acknowledge": {
"filepath": "<path_of_script>",
"sourceType": "<local | git>",
"env": [],
"stdout": "<path_of_output_file_of_script>"
},
"AddNote": {
"filepath": "<path_of_script>",
"sourceType": "<local | git>",
"env": [],
"stdout": "<path_of_output_file_of_script>"
},
"Close": {
"filepath": "<path_of_script>",
"sourceType": "<local | git>",
"env": [],
Expand Down
6 changes: 3 additions & 3 deletions solarwinds-web-help-desk/scripts/jec_action_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def send_close_request():
logging.debug(LOG_PREFIX + " Solarwinds response:" + str(response.content))
else:
logging.error(
LOG_PREFIX + " Could not execute at Solarwinds; response: " + response.status_code + ' ' + str(
LOG_PREFIX + " Could not execute at Solarwinds; response: " + str(response.status_code) + ' ' + str(
response.content))


Expand All @@ -66,7 +66,7 @@ def send_acknowledge_request():
logging.debug(LOG_PREFIX + " Solarwinds response:" + str(response.content))
else:
logging.error(
LOG_PREFIX + " Could not execute at Solarwinds; response: " + response.status_code + ' ' + str(
LOG_PREFIX + " Could not execute at Solarwinds; response: " + str(response.status_code) + ' ' + str(
response.content))


Expand Down Expand Up @@ -100,7 +100,7 @@ def send_add_note_request():
logging.debug(LOG_PREFIX + " Solarwinds response:" + str(response.content))
else:
logging.error(
LOG_PREFIX + " Could not execute at Solarwinds; response: " + response.status_code + ' ' + str(
LOG_PREFIX + " Could not execute at Solarwinds; response: " + str(response.status_code) + ' ' + str(
response.content))


Expand Down
143 changes: 143 additions & 0 deletions zabbix/scripts/jec_action_executor_for_zabbix7.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import argparse
import json
import logging
import sys

import requests

parser = argparse.ArgumentParser()
parser.add_argument('-payload', '--queuePayload', help='Payload from queue', required=True)
parser.add_argument('-apiKey', '--apiKey', help='The apiKey of the integration', required=True)
parser.add_argument('-jsmUrl', '--jsmUrl', help='The url', required=True)
parser.add_argument('-logLevel', '--logLevel', help='Log level', required=True)
parser.add_argument('-command_url', '--command_url', help='The Command URL', required=False)
parser.add_argument('-user', '--user', help='User', required=False)
parser.add_argument('-password', '--password', help='Password', required=False)
args, unknown = parser.parse_known_args()
args = vars(args)

logging.basicConfig(stream=sys.stdout, level=args['logLevel'])


def parse_field(key, mandatory):
variable = queue_message.get(key)
if not variable:
variable = args.get(key)
if mandatory and not variable:
logging.error(LOG_PREFIX + " Skipping action, Mandatory conf item '" + str(key) +
"' is missing. Check your configuration file.")
raise ValueError(LOG_PREFIX + " Skipping action, Mandatory conf item '" + str(key) +
"' is missing. Check your configuration file.")
return variable


def parse_timeout():
parsed_timeout = args.get('http.timeout')
if not parsed_timeout:
return 30000
return int(parsed_timeout)


def login_to_zabbix(user, password, url):
login_params = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"username": user,
"password": password
},
"id": 1
}
logging.debug(LOG_PREFIX + " Logging in to Zabbix. Url: " + str(url) + " user: " + str(user))
content_headers = {
"Content-Type": "application/json"
}
login_result = requests.post(url, data=json.dumps(login_params), headers=content_headers, timeout=timeout)
logging.debug(LOG_PREFIX + " login response: " + str(login_result.status_code) + " " + str(login_result.json()))
if login_result.json() and not login_result.json().get('error'):
return login_result.json()['result']
else:
logging.error(
LOG_PREFIX + " Cannot login to Zabbix: Response " + str(login_result.status_code) + " " + str(login_result.content))


def main():
global LOG_PREFIX
global queue_message
global timeout

queue_message_string = args['queuePayload']
queue_message = json.loads(queue_message_string)

alert_id = queue_message["alert"]["alertId"]
action = queue_message["action"]
source = queue_message["source"]

LOG_PREFIX = "[" + action + "]"

timeout = parse_timeout()

logging.info("Will execute " + str(action) + " for alertId " + str(alert_id))

username = parse_field('user', True)
password = parse_field('password', True)
url = parse_field('command_url', True)

logging.debug("Username: " + str(username))
logging.debug("Command Url: " + str(url))
logging.debug("AlertId: " + str(alert_id))
logging.debug("Source: " + str(source))
logging.debug("Action: " + str(action))

if alert_id:
alert_api_url = args['jsmUrl'] + "/jsm/ops/integration/v2/alerts/" + alert_id
headers = {
"Content-Type": "application/json",
"Accept-Language": "application/json",
"Authorization": "GenieKey " + args['apiKey']
}
alert_response = requests.get(alert_api_url, headers=headers, timeout=timeout)
if alert_response.status_code < 299 and alert_response.json()['data']:
if action == "Acknowledge":
if source and str(source['name']).lower() == "zabbix":
logging.warning("JSM alert is already acknowledged by Zabbix. Discarding!!!")
else:
post_params = {
"jsonrpc": "2.0",
"id": 1,
"method": "event.acknowledge",
"params": {
"eventids": parse_from_details("eventId", alert_response),
"message": "Acknowledged by " + alert_response.json()['data']['report'][
'acknowledgedBy'] + " via JSM",
"action": 6
}
}
auth = login_to_zabbix(username, password, url)
if auth:
logging.debug("Posting to Zabbix. Url: " + str(url) + ", params: " + str(post_params))
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer " + auth,
}
response = requests.post(url, data=json.dumps(post_params), headers=headers, timeout=timeout)
if alert_response.json() and not alert_response.json().get('error'):
logging.info("Successfully executed at Zabbix.")
logging.debug("Zabbix response: " + str(response.json()))
else:
logging.warning(
"Could not execute at Zabbix. Zabbix Response: " + response.content + " Status Code: " + response.status_code)
else:
logging.warning(LOG_PREFIX + "Cannot login to Zabbix!")
else:
logging.warning("Alert with id [" + str(alert_id) + "] does not exist in JSM. It is probably deleted.")
else:
logging.warning("Alert id does not exist ")

def parse_from_details(key,alert_response):
if key in alert_response.json()['data']["details"].keys():
return alert_response.json()['data']["details"][key]
return ""

if __name__ == '__main__':
main()