From 9a86cdcd49afd88575850fc74fae70fbd4585c2c Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 10:07:44 -0700 Subject: [PATCH 01/21] Set version to 2.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a06892f..76dab86 100755 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import setup setup(name='logicmonitor_core', - version='1.0.7.5', + version='2.0.0.0', description='LogicMonitor API python classes', long_description='LogicMonitor is a cloud-based, full stack, IT \ infrastructure monitoring solution that allows you to manage your \ From 8464e8f2670b99c8c2214d7273c1de1089b96d03 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 12:00:19 -0700 Subject: [PATCH 02/21] update params to use auth token instead of user/pass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note that the logicmonitor class is untouched. I’ll leave that update to the rest code. This is def going to break everything using the rpc api. oops. We can merge this after the rest code is done --- README.md | 94 +++++++++++++++--------------- examples/collector_add.py | 12 ++-- examples/collector_remove.py | 12 ++-- examples/collector_sdt.py | 12 ++-- examples/datasource_sdt.py | 12 ++-- examples/device_add.py | 12 ++-- examples/device_info.py | 12 ++-- examples/device_remove.py | 12 ++-- examples/device_sdt.py | 12 ++-- examples/device_update.py | 12 ++-- examples/devicegroup_add.py | 12 ++-- examples/devicegroup_info.py | 12 ++-- examples/devicegroup_remove.py | 12 ++-- examples/devicegroup_sdt.py | 12 ++-- examples/devicegroup_update.py | 12 ++-- examples/itop-sync/README.md | 26 ++++----- examples/itop-sync/itop_lm_sync.py | 12 ++-- examples/itop-sync/lm_itop_sync.py | 12 ++-- examples/list_devices.py | 12 ++-- 19 files changed, 160 insertions(+), 164 deletions(-) diff --git a/README.md b/README.md index 14486b2..dcc1990 100644 --- a/README.md +++ b/README.md @@ -63,11 +63,11 @@ management [click here](http://help.logicmonitor.com/the-new-ui/settings/collect ``` $> python ./examples/collector_add.py -h -usage: collector_add.py [-h] -c COMPANY -u USER -p PASSWORD +usage: collector_add.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID --accessid ACCESSID API Token Access Id + -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit ``` @@ -81,11 +81,11 @@ collector management ``` $> python ./examples/collector_remove.py -h -usage: collector_remove.py [-h] -c COMPANY -u USER -p PASSWORD +usage: collector_remove.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID --accessid ACCESSID API Token Access Id + -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit ``` @@ -100,11 +100,11 @@ For more information about collector management ``` $> python ./examples/collector_sdt.py -h -usage: collector_sdt.py [-h] -c COMPANY -u USER -p PASSWORD [-d DURATION] [-s STARTTIME] +usage: collector_sdt.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-d DURATION] [-s STARTTIME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID --accessid ACCESSID API Token Access Id + -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit -d DURATION, --duration DURATION SDT duration @@ -120,13 +120,13 @@ be created. For more information on managing devices ``` $> python ./examples/device_add.py -h -usage: device_add.py [-h] -c COMPANY -u USER -p PASSWORD -C COLLECTOR +usage: device_add.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -C COLLECTOR [-H HOSTNAME] [-d DISPLAYNAME] [--description DESCRIPTION] [-P PROPERTIES] [-g GROUPS [GROUPS ...]] [-a ALERTENABLE] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key -C COLLECTOR, --collector COLLECTOR Collector FQDN optional arguments: -h, --help Show this help message and exit @@ -146,12 +146,12 @@ if they were created by adding this device. For more information on managing dev ``` $> python ./examples/device_remove.py -h -usage: device_remove.py [-h] -c COMPANY -u USER -p PASSWORD [-C COLLECTOR] +usage: device_remove.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-C COLLECTOR] [-H HOSTNAME] [-d DISPLAYNAME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit -C COLLECTOR, --collector COLLECTOR Collector FQDN @@ -165,14 +165,14 @@ This idempotent script updates a device already being monitored by your LogicMon ``` $> python ./examples/device_update.py -h -usage: device_update.py [-h] -c COMPANY -u USER -p PASSWORD [-C COLLECTOR] +usage: device_update.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-C COLLECTOR] [-H HOSTNAME] [-d DISPLAYNAME] [--description DESCRIPTION] [-P PROPERTIES] [-g GROUPS [GROUPS ...]] [-a ALERTENABLE] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit -C COLLECTOR, --collector COLLECTOR Collector FQDN @@ -194,12 +194,12 @@ information on managing devices ``` $> python ./examples/device_sdt.py -h -usage: device_sdt.py [-h] -c COMPANY -u USER -p PASSWORD [-C COLLECTOR] +usage: device_sdt.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-C COLLECTOR] [-H HOSTNAME] [-d DISPLAYNAME] [-D DURATION] [-s STARTTIME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit -C COLLECTOR, --collector COLLECTOR Collector FQDN @@ -216,12 +216,12 @@ monitored by your LogicMonitor account. For more information on managing devices ``` $> python ./examples/device_info.py -h -usage: device_info.py [-h] -c COMPANY -u USER -p PASSWORD -C COLLECTOR +usage: device_info.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -C COLLECTOR [-H HOSTNAME] [-d DISPLAYNAME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit -C COLLECTOR, --collector COLLECTOR Collector FQDN @@ -239,11 +239,11 @@ information on managing datasources ``` $> python ./examples/datasource_sdt.py -h -usage: device_sdt.py [-h] -c COMPANY -u USER -p PASSWORD -i ID +usage: device_sdt.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -i ID required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit -i ID, --id ID Datasource ID @@ -254,15 +254,15 @@ This script list all devices being monitored in your LogicMonitor account. ``` $> python ./examples/list_devices.py -h -usage: device_add.py [-h] -c COMPANY -u USER -p PASSWORD +usage: device_add.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-g GROUP] required arguments: - -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -c COMPANY, --company COMPANY LogicMonitor account + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: - -h, --help Show this help message and exit + -h, --help Show this help message and exit -g GROUP, --group GROUP Limit the results to hosts in the group path specified. Example: /Servers ``` @@ -276,13 +276,13 @@ be created. For more information on managing device groups ``` $> python ./examples/devicegroup_add.py -h -usage: devicegroup_add.py [-h] -c COMPANY -u USER -p PASSWORD -f FULLPATH +usage: devicegroup_add.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH [--description DESCRIPTION] [-P PROPERTIES] [-a ALERTENABLE] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: -h, --help Show this help message and exit @@ -298,11 +298,11 @@ For more information on managing device groups ``` $> python ./examples/devicegroup_remove.py -h -usage: devicegroup_remove.py [-h] -c COMPANY -u USER -p PASSWORD -f FULLPATH +usage: devicegroup_remove.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID --accessid ACCESSID API Token Access Id + -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: -h, --help Show this help message and exit @@ -315,13 +315,13 @@ managing device groups ``` $> python ./examples/devicegroup_update.py -h -usage: devicegroup_update.py [-h] -c COMPANY -u USER -p PASSWORD -f FULLPATH +usage: devicegroup_update.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH [--description DESCRIPTION] [-P PROPERTIES] [-a ALERTENABLE] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: -h, --help Show this help message and exit @@ -339,12 +339,12 @@ For more information on managing device groups ``` $> python ./examples/devicegroup_sdt.py -h -usage: devicegroup_sdt.py [-h] -c COMPANY -u USER -p PASSWORD -f FULLPATH +usage: devicegroup_sdt.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH [-D DURATION] [-s STARTTIME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: -h, --help Show this help message and exit @@ -358,11 +358,11 @@ This script retrieves and displays information about a device group in your Logi ``` $> python ./examples/devicegroup_info.py -h -usage: devicegroup_info.py [-h] -c COMPANY -u USER -p PASSWORD -f FULLPATH +usage: devicegroup_info.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -i ACCESSID --accessid ACCESSID API Token Access Id + -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: -h, --help Show this help message and exit diff --git a/examples/collector_add.py b/examples/collector_add.py index cebf157..fbd2acb 100755 --- a/examples/collector_add.py +++ b/examples/collector_add.py @@ -12,11 +12,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-i", "--collector_id", help="ID of an existing collector to add") @@ -36,8 +36,8 @@ def main(): # Require params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey # Optional params if args.collector_id is not None: diff --git a/examples/collector_remove.py b/examples/collector_remove.py index 6cf6d78..074138a 100755 --- a/examples/collector_remove.py +++ b/examples/collector_remove.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) args = parser.parse_args() @@ -31,8 +31,8 @@ def main(): # Require params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey col = Collector(params) diff --git a/examples/collector_sdt.py b/examples/collector_sdt.py index 1a53598..47f285f 100755 --- a/examples/collector_sdt.py +++ b/examples/collector_sdt.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-d", "--duration", @@ -36,8 +36,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey # Optional params if args.duration is not None: diff --git a/examples/datasource_sdt.py b/examples/datasource_sdt.py index 4116351..e1a69b7 100644 --- a/examples/datasource_sdt.py +++ b/examples/datasource_sdt.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-i", "--id", help="Object ID") @@ -30,8 +30,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["id"] = args.id # Optional params diff --git a/examples/device_add.py b/examples/device_add.py index d04b231..3eabd73 100755 --- a/examples/device_add.py +++ b/examples/device_add.py @@ -10,11 +10,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-C", "--collector", help="Collector FQDN", @@ -50,8 +50,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/device_info.py b/examples/device_info.py index 96ff814..d3936ec 100755 --- a/examples/device_info.py +++ b/examples/device_info.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-C", "--collector", @@ -38,8 +38,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/device_remove.py b/examples/device_remove.py index 4a882c1..9a8b6fd 100755 --- a/examples/device_remove.py +++ b/examples/device_remove.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-C", "--collector", @@ -38,8 +38,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/device_sdt.py b/examples/device_sdt.py index 72bad15..d0625b9 100755 --- a/examples/device_sdt.py +++ b/examples/device_sdt.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-C", "--collector", @@ -42,8 +42,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/device_update.py b/examples/device_update.py index c6642cd..997bdc2 100755 --- a/examples/device_update.py +++ b/examples/device_update.py @@ -10,11 +10,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-C", "--collector", @@ -49,8 +49,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/devicegroup_add.py b/examples/devicegroup_add.py index 6117e69..33fbc7a 100755 --- a/examples/devicegroup_add.py +++ b/examples/devicegroup_add.py @@ -10,11 +10,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-f", "--fullpath", help="Full path of the device group", @@ -41,8 +41,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["fullpath"] = args.fullpath # Optional params diff --git a/examples/devicegroup_info.py b/examples/devicegroup_info.py index 2e5d6f8..764991d 100755 --- a/examples/devicegroup_info.py +++ b/examples/devicegroup_info.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-f", "--fullpath", help="Full path of the device group", @@ -33,8 +33,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["fullpath"] = args.fullpath hg = Hostgroup(params) diff --git a/examples/devicegroup_remove.py b/examples/devicegroup_remove.py index 97f152b..2051f97 100755 --- a/examples/devicegroup_remove.py +++ b/examples/devicegroup_remove.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-f", "--fullpath", help="Full path of the device group", @@ -34,8 +34,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["fullpath"] = args.fullpath hg = Hostgroup(params) diff --git a/examples/devicegroup_sdt.py b/examples/devicegroup_sdt.py index 6f11d9a..6bc110b 100755 --- a/examples/devicegroup_sdt.py +++ b/examples/devicegroup_sdt.py @@ -9,11 +9,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-f", "--fullpath", help="Full path of the device group", @@ -39,8 +39,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["fullpath"] = args.fullpath # Optional params diff --git a/examples/devicegroup_update.py b/examples/devicegroup_update.py index 27febce..68f6698 100755 --- a/examples/devicegroup_update.py +++ b/examples/devicegroup_update.py @@ -10,11 +10,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-f", "--fullpath", help="Full path of the device group", @@ -42,8 +42,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey params["fullpath"] = args.fullpath # Optional params diff --git a/examples/itop-sync/README.md b/examples/itop-sync/README.md index f9d39fb..e4382f5 100644 --- a/examples/itop-sync/README.md +++ b/examples/itop-sync/README.md @@ -62,19 +62,17 @@ You will also need to identify the Collector description that you want to use, i ``` $> python ./examples/lm_itop_sync.py -h usage: Synchronize LogicMonitor devices to iTop CMDB (federation) - [-h] -c CUSTOMER_PORTAL -u USERNAME -p PASSWORD -ih ITOP_HOST -iu + [-h] -c CUSTOMER_PORTAL -i ACCESSIDNAME -k ACCESSKEY -ih ITOP_HOST -iu ITOP_USERNAME -ip ITOP_PASSWORD -io ITOP_ORG_ID [-mh MYSQL_HOST] -mu MYSQL_USERNAME -mp MYSQL_PASSWORD -md MYSQL_DATABASE -st SERVER_TABLE -pt PRINTER_TABLE -ht HYPERVISOR_TABLE optional arguments: -h, --help show this help message and exit - -c CUSTOMER_PORTAL, --company CUSTOMER_PORTAL - LogicMonitor account - -u USERNAME, --user USERNAME - LogicMonitor username - -p PASSWORD, --password PASSWORD - LogicMonitor password + -c CUSTOMER_PORTAL, --company CUSTOMER_PORTAL LogicMonitor account + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key + API Token Access Key -ih ITOP_HOST iTop server hostname -iu ITOP_USERNAME iTop server username -ip ITOP_PASSWORD iTop server password @@ -93,8 +91,8 @@ The **itop_lm_sync.py** script can be executed on its own schedule, with the fol ``` $> python ./examples/itop_lm_sync.py -h -usage: Synchronize iTop CMDB CIs to LogicMonitor [-h] -c CUSTOMER_PORTAL -u - USERNAME -p PASSWORD -cn +usage: Synchronize iTop CMDB CIs to LogicMonitor [-h] -c CUSTOMER_PORTAL -i + ACCESSID -k ACCESSKEY -cn COLLECTOR_NAME -ih ITOP_HOST -iu ITOP_USERNAME -ip ITOP_PASSWORD -iq @@ -102,12 +100,10 @@ usage: Synchronize iTop CMDB CIs to LogicMonitor [-h] -c CUSTOMER_PORTAL -u optional arguments: -h, --help show this help message and exit - -c CUSTOMER_PORTAL, --company CUSTOMER_PORTAL - LogicMonitor account - -u USERNAME, --user USERNAME - LogicMonitor username - -p PASSWORD, --password PASSWORD - LogicMonitor password + -c CUSTOMER_PORTAL, --company CUSTOMER_PORTAL LogicMonitor account + -i ACCESSID, --accessid ACCESSID API Token Access Id + -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key + API Token Access Key -cn COLLECTOR_NAME LogicMonitor collector description -ih ITOP_HOST iTop server hostname -iu ITOP_USERNAME iTop server username diff --git a/examples/itop-sync/itop_lm_sync.py b/examples/itop-sync/itop_lm_sync.py index fcd5c5a..c14b287 100644 --- a/examples/itop-sync/itop_lm_sync.py +++ b/examples/itop-sync/itop_lm_sync.py @@ -53,10 +53,10 @@ def main(): parser = argparse.ArgumentParser(description) parser.add_argument("-c", "--company", metavar="CUSTOMER_PORTAL", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", metavar="USERNAME", - help="LogicMonitor username", required=True) - parser.add_argument("-p", "--password", metavar="PASSWORD", - help="LogicMonitor password", required=True) + parser.add_argument('-i', '--accessid', metavar="USERNAME", + help="API Token Access Id", required=True) + parser.add_argument('-k', '--accesskey', metavar="PASSWORD", + help="API Token Access Key", required=True) parser.add_argument("-cn", metavar="COLLECTOR_NAME", help="LogicMonitor collector description", required=True) @@ -91,8 +91,8 @@ def main(): params["duration"] = 30 params["properties"] = {} params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey group = Hostgroup(params) group.add() diff --git a/examples/itop-sync/lm_itop_sync.py b/examples/itop-sync/lm_itop_sync.py index 0e997eb..ef9a1c0 100644 --- a/examples/itop-sync/lm_itop_sync.py +++ b/examples/itop-sync/lm_itop_sync.py @@ -27,10 +27,10 @@ def main(): parser = argparse.ArgumentParser(description) parser.add_argument("-c", "--company", metavar="CUSTOMER_PORTAL", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", metavar="USERNAME", - help="LogicMonitor username", required=True) - parser.add_argument("-p", "--password", metavar="PASSWORD", - help="LogicMonitor password", required=True) + parser.add_argument('-i', '--accessid', metavar="ACCESSID", + help="API Token Access Id", required=True) + parser.add_argument('-k', '--accesskey', metavar="ACCESSID", + help="API Token Access Key", required=True) parser.add_argument("-ih", metavar="ITOP_HOST", help="iTop server hostname", required=True) parser.add_argument("-iu", metavar="ITOP_USERNAME", @@ -86,8 +86,8 @@ def main(): params = {} params["group"] = None params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey # Get JSON of all devices host_list = HostList(params) diff --git a/examples/list_devices.py b/examples/list_devices.py index 0552c58..d0665cc 100644 --- a/examples/list_devices.py +++ b/examples/list_devices.py @@ -10,11 +10,11 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument("-u", "--user", - help="LogicMonitor user name", + parser.add_argument('-i', '--accessid', + help="API Token Access Id", required=True) - parser.add_argument("-p", "--password", - help="LogicMonitor password", + parser.add_argument('-k', '--accesskey', + help="API Token Access Key", required=True) parser.add_argument("-g", "--group", @@ -27,8 +27,8 @@ def main(): # Required params params["company"] = args.company - params["user"] = args.user - params["password"] = args.password + params['access_id'] = args.accessid + params['access_key'] = args.accesskey # Optional params if args.group is not None: From c90b10bbbdea19a2a748e0af959c72327a1dd7ec Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 13:28:03 -0700 Subject: [PATCH 03/21] Add switch to control which api is used --- logicmonitor_core/Collector.py | 27 ++++++++-------- logicmonitor_core/Datasource.py | 15 ++++----- logicmonitor_core/Host.py | 51 ++++++++++++++++--------------- logicmonitor_core/HostList.py | 6 ++-- logicmonitor_core/Hostgroup.py | 43 +++++++++++++------------- logicmonitor_core/LogicMonitor.py | 43 +++++++++++++------------- 6 files changed, 95 insertions(+), 90 deletions(-) diff --git a/logicmonitor_core/Collector.py b/logicmonitor_core/Collector.py index 5471910..1df397a 100755 --- a/logicmonitor_core/Collector.py +++ b/logicmonitor_core/Collector.py @@ -20,6 +20,7 @@ def __init__(self, params): logging.debug("Instantiating Collector object") self.change = False self.params = params + self.api = self.rpc LogicMonitor.__init__(self, **params) @@ -353,11 +354,11 @@ def sdt(self): start = datetime.utcnow() # Use user UTC offset - logging.debug("Making RPC call to 'getTimeZoneSetting'") - accountresp = json.loads(self.rpc("getTimeZoneSetting", {})) + logging.debug("Making API call to 'getTimeZoneSetting'") + accountresp = json.loads(self.api("getTimeZoneSetting", {})) if accountresp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") offset = accountresp["data"]["offset"] offsetstart = start + timedelta(0, offset) @@ -380,14 +381,14 @@ def sdt(self): "endHour": offsetend.hour, "endMinute": offsetend.minute} - logging.debug("Making RPC call to 'setAgentSDT'") - resp = json.loads(self.rpc("setAgentSDT", h)) + logging.debug("Making API call to 'setAgentSDT'") + resp = json.loads(self.api("setAgentSDT", h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") self.fail(msg=resp["errmsg"]) def site_facts(self): @@ -452,11 +453,11 @@ def _create(self): h = {"autogen": True, "description": self.description} - logging.debug("Making RPC call to 'addAgent'") - create = (json.loads(self.rpc("addAgent", h))) + logging.debug("Making API call to 'addAgent'") + create = (json.loads(self.api("addAgent", h))) if create["status"] is 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") self.info = create["data"] self.id = create["data"]["id"] return create["data"] @@ -488,12 +489,12 @@ def _unregister(self): if self.check_mode: self.exit(changed=True) - logging.debug("Making RPC call to 'deleteAgent'") - delete = json.loads(self.rpc("deleteAgent", + logging.debug("Making API call to 'deleteAgent'") + delete = json.loads(self.api("deleteAgent", {"id": self.id})) if delete["status"] is 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return delete else: # The collector couldn't unregister. Start the service again diff --git a/logicmonitor_core/Datasource.py b/logicmonitor_core/Datasource.py index 84debe6..6263cb8 100644 --- a/logicmonitor_core/Datasource.py +++ b/logicmonitor_core/Datasource.py @@ -14,6 +14,7 @@ def __init__(self, params): logging.debug("Instantiating Datasource object") self.change = False self.params = params + self.api = self.rpc LogicMonitor.__init__(self, **params) @@ -45,11 +46,11 @@ def sdt(self): start = datetime.utcnow() # Use user UTC offset - logging.debug("Making RPC call to 'getTimeZoneSetting'") - accountresp = json.loads(self.rpc("getTimeZoneSetting", {})) + logging.debug("Making API call to 'getTimeZoneSetting'") + accountresp = json.loads(self.api("getTimeZoneSetting", {})) if accountresp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") offset = accountresp["data"]["offset"] offsetstart = start + timedelta(0, offset) @@ -72,12 +73,12 @@ def sdt(self): "endHour": offsetend.hour, "endMinute": offsetend.minute} - logging.debug("Making RPC call to 'setHostDataSourceSDT'") - resp = json.loads(self.rpc("setHostDataSourceSDT", h)) + logging.debug("Making API call to 'setHostDataSourceSDT'") + resp = json.loads(self.api("setHostDataSourceSDT", h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") self.fail(msg=resp["errmsg"]) diff --git a/logicmonitor_core/Host.py b/logicmonitor_core/Host.py index c978a30..0582feb 100755 --- a/logicmonitor_core/Host.py +++ b/logicmonitor_core/Host.py @@ -15,6 +15,7 @@ def __init__(self, params): self.change = False self.params = params self.collector = None + self.api = self.rpc LogicMonitor.__init__(self, **self.params) @@ -89,13 +90,13 @@ def get_properties(self): logging.debug("Running Host.get_properties...") if self.info: - logging.debug("Making RPC call to 'getHostProperties'") - properties_json = (json.loads(self.rpc("getHostProperties", + logging.debug("Making API call to 'getHostProperties'") + properties_json = (json.loads(self.api("getHostProperties", {'hostId': self.info["id"], "filterSystemProperties": True}))) if properties_json["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return properties_json["data"] else: logging.debug("Error: there was an issue retrieving the " + @@ -144,14 +145,14 @@ def add(self): self.properties, self.alertenable) - logging.debug("Making RPC call to 'addHost'") - resp = json.loads(self.rpc("addHost", h)) + logging.debug("Making API call to 'addHost'") + resp = json.loads(self.api("addHost", h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") logging.debug(resp) return resp["errmsg"] elif self.collector is None: @@ -185,13 +186,13 @@ def update(self): h["id"] = self.info["id"] h["opType"] = "replace" - logging.debug("Making RPC call to 'updateHost'") - resp = json.loads(self.rpc("updateHost", h)) + logging.debug("Making API call to 'updateHost'") + resp = json.loads(self.api("updateHost", h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") else: - logging.debug("RPC call failed") + logging.debug("API call failed") self.fail(msg="Error: unable to update the host.") else: logging.debug("Host properties match supplied properties. " + @@ -219,18 +220,18 @@ def remove(self): if self.check_mode: self.exit(changed=True) - logging.debug("Making RPC call to 'deleteHost'") - resp = json.loads(self.rpc("deleteHost", + logging.debug("Making API call to 'deleteHost'") + resp = json.loads(self.api("deleteHost", {"hostId": self.info["id"], "deleteFromSystem": True, "hostGroupId": 1})) if resp["status"] == 200: logging.debug(resp) - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp else: - logging.debug("RPC call failed") + logging.debug("API call failed") logging.debug(resp) self.fail(msg=resp["errmsg"]) @@ -308,11 +309,11 @@ def sdt(self): start = datetime.utcnow() # Use user UTC offset - logging.debug("Making RPC call to 'getTimeZoneSetting'") - accountresp = (json.loads(self.rpc("getTimeZoneSetting", {}))) + logging.debug("Making API call to 'getTimeZoneSetting'") + accountresp = (json.loads(self.api("getTimeZoneSetting", {}))) if accountresp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") offset = accountresp["data"]["offset"] offsetstart = start + timedelta(0, offset) @@ -335,14 +336,14 @@ def sdt(self): "endHour": offsetend.hour, "endMinute": offsetend.minute} - logging.debug("Making RPC call to 'setHostSDT'") - resp = (json.loads(self.rpc("setHostSDT", h))) + logging.debug("Making API call to 'setHostSDT'") + resp = (json.loads(self.api("setHostSDT", h))) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") self.fail(msg=resp["errmsg"]) else: self.fail(msg="Error: Host doesn't exit.") @@ -422,10 +423,10 @@ def _verify_property(self, propname): "propValue0": self.properties[propname]} logging.debug("Making RCP call to 'verifyProperties'") - resp = json.loads(self.rpc('verifyProperties', h)) + resp = json.loads(self.api('verifyProperties', h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"]["match"] else: self.fail( @@ -447,7 +448,7 @@ def _compare_groups(self, hostresp): if path != []: h = {'hostGroupId': path[-1]} - hgresp = json.loads(self.rpc("getHostGroup", h)) + hgresp = json.loads(self.api("getHostGroup", h)) if (hgresp["status"] == 200 and hgresp["data"]["appliesTo"] == ""): diff --git a/logicmonitor_core/HostList.py b/logicmonitor_core/HostList.py index aeb5f92..4398fab 100644 --- a/logicmonitor_core/HostList.py +++ b/logicmonitor_core/HostList.py @@ -34,13 +34,13 @@ def get_hosts(self): associated with this LogicMonitor account""" logging.debug("Running HostList.get_hosts...") - logging.debug("Making RPC call to 'getHosts'") - properties_json = (json.loads(self.rpc("getHosts", + logging.debug("Making API call to 'getHosts'") + properties_json = (json.loads(self.api("getHosts", {"hostGroupId": self.groupId or 1}))) if properties_json["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return properties_json["data"] else: logging.debug("Error: there was an issue retrieving the " + diff --git a/logicmonitor_core/Hostgroup.py b/logicmonitor_core/Hostgroup.py index 9f22f36..cc05137 100755 --- a/logicmonitor_core/Hostgroup.py +++ b/logicmonitor_core/Hostgroup.py @@ -24,6 +24,7 @@ def __init__(self, params): self.starttime = self.params["starttime"] self.duration = self.params["duration"] self.alertenable = self.params["alertenable"] + self.api = self.rpc def create(self): """Wrapper for self.update()""" @@ -38,17 +39,17 @@ def get_properties(self, final=False): if self.info: logging.debug("Group found") - logging.debug("Making RPC call to 'getHostGroupProperties'") - properties_json = json.loads(self.rpc( + logging.debug("Making API call to 'getHostGroupProperties'") + properties_json = json.loads(self.api( "getHostGroupProperties", {'hostGroupId': self.info["id"], "finalResult": final})) if properties_json["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return properties_json["data"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") self.fail(msg=properties_json["status"]) else: logging.debug("Group not found") @@ -113,14 +114,14 @@ def update(self): if self.fullpath != "/": h["id"] = self.info["id"] - logging.debug("Making RPC call to 'updateHostGroup'") - resp = json.loads(self.rpc("updateHostGroup", h)) + logging.debug("Making API call to 'updateHostGroup'") + resp = json.loads(self.api("updateHostGroup", h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") self.fail( msg="Error: Unable to update the " + "host.\n" + resp["errmsg"]) @@ -152,18 +153,18 @@ def remove(self): if self.check_mode: self.exit(changed=True) - logging.debug("Making RPC call to 'deleteHostGroup'") - resp = json.loads(self.rpc("deleteHostGroup", + logging.debug("Making API call to 'deleteHostGroup'") + resp = json.loads(self.api("deleteHostGroup", {"hgId": self.info["id"]})) if resp["status"] == 200: logging.debug(resp) - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp elif resp["errmsg"] == "No such group": logging.debug("Group doesn't exist") else: - logging.debug("RPC call failed") + logging.debug("API call failed") logging.debug(resp) self.fail(msg=resp["errmsg"]) else: @@ -229,11 +230,11 @@ def sdt(self, duration=30, starttime=None): start = datetime.utcnow() # Use user UTC offset - logging.debug("Making RPC call to 'getTimeZoneSetting'") - accountresp = json.loads(self.rpc("getTimeZoneSetting", {})) + logging.debug("Making API call to 'getTimeZoneSetting'") + accountresp = json.loads(self.api("getTimeZoneSetting", {})) if accountresp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") offset = accountresp["data"]["offset"] offsetstart = start + timedelta(0, offset) @@ -256,14 +257,14 @@ def sdt(self, duration=30, starttime=None): "endHour": offsetend.hour, "endMinute": offsetend.minute} - logging.debug("Making RPC call to setHostGroupSDT") - resp = json.loads(self.rpc("setHostGroupSDT", h)) + logging.debug("Making API call to setHostGroupSDT") + resp = json.loads(self.api("setHostGroupSDT", h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") self.fail(msg=resp["errmsg"]) def site_facts(self): @@ -338,10 +339,10 @@ def _verify_property(self, propname): "propValue0": self.properties[propname]} logging.debug("Making RCP call to 'verifyProperties'") - resp = json.loads(self.rpc('verifyProperties', h)) + resp = json.loads(self.api('verifyProperties', h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"]["match"] else: self.fail( diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index f1140f7..0a5cafd 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -21,9 +21,10 @@ def __init__(self, **params): self.fqdn = socket.getfqdn() self.lm_url = "logicmonitor.com/santaba" self.urlopen = urllib2.urlopen + self.api = self.rpc def rpc(self, action, params): - """Make a call to the LogicMonitor RPC library + """Make a call to the LogicMonitor API library and return the response""" logging.debug("Running LogicMonitor.rpc") @@ -56,7 +57,7 @@ def rpc(self, action, params): return raw except IOError as ioe: logging.debug(ioe) - self.fail(msg="Error: Unknown exception making RPC call") + self.fail(msg="Error: Unknown exception making API call") def do(self, action, params): """Make a call to the LogicMonitor @@ -91,12 +92,12 @@ def get_collectors(self): LogicMonitor collectors""" logging.debug("Running LogicMonitor.get_collectors...") - logging.debug("Making RPC call to 'getAgents'") - resp = self.rpc("getAgents", {}) + logging.debug("Making API call to 'getAgents'") + resp = self.api("getAgents", {}) resp_json = json.loads(resp) if resp_json["status"] is 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp_json["data"] else: self.fail(msg=resp) @@ -107,12 +108,12 @@ def get_host_by_hostname(self, hostname, collector): logging.debug("Running LogicMonitor.get_host_by_hostname...") logging.debug("Looking for hostname " + hostname) - logging.debug("Making RPC call to 'getHosts'") - hostlist_json = json.loads(self.rpc("getHosts", {"hostGroupId": 1})) + logging.debug("Making API call to 'getHosts'") + hostlist_json = json.loads(self.api("getHosts", {"hostGroupId": 1})) if collector: if hostlist_json["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") hosts = hostlist_json["data"]["hosts"] @@ -129,7 +130,7 @@ def get_host_by_hostname(self, hostname, collector): logging.debug("No host match found") return None else: - logging.debug("RPC call failed") + logging.debug("API call failed") logging.debug(hostlist_json) else: logging.debug("No collector specified") @@ -141,15 +142,15 @@ def get_host_by_displayname(self, displayname): logging.debug("Running LogicMonitor.get_host_by_displayname...") logging.debug("Looking for displayname " + displayname) - logging.debug("Making RPC call to 'getHost'") - host_json = (json.loads(self.rpc("getHost", + logging.debug("Making API call to 'getHost'") + host_json = (json.loads(self.api("getHost", {"displayName": displayname}))) if host_json["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return host_json["data"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") logging.debug(host_json) return None @@ -174,11 +175,11 @@ def get_group(self, fullpath): specified path""" logging.debug("Running LogicMonitor.get_group...") - logging.debug("Making RPC call to getHostGroups") - resp = json.loads(self.rpc("getHostGroups", {})) + logging.debug("Making API call to getHostGroups") + resp = json.loads(self.api("getHostGroups", {})) if resp["status"] == 200: - logging.debug("RPC called succeeded") + logging.debug("API called succeeded") groups = resp["data"] logging.debug("Looking for group matching " + fullpath) @@ -190,7 +191,7 @@ def get_group(self, fullpath): logging.debug("No group match found") return None else: - logging.debug("RPC call failed") + logging.debug("API call failed") logging.debug(resp) return None @@ -245,19 +246,19 @@ def create_group(self, fullpath): "alertEnable": True, "description": ""} - logging.debug("Making RPC call to 'addHostGroup'") + logging.debug("Making API call to 'addHostGroup'") resp = json.loads( - self.rpc("addHostGroup", h)) + self.api("addHostGroup", h)) if resp["status"] == 200: - logging.debug("RPC call succeeded") + logging.debug("API call succeeded") return resp["data"]["id"] elif resp["errmsg"] == "The record already exists": logging.debug("The hostgroup already exists") group = self.get_group(fullpath) return group["id"] else: - logging.debug("RPC call failed") + logging.debug("API call failed") self.fail( msg="Error: unable to create new hostgroup \"" + name + "\".\n" + resp["errmsg"]) From 559c6f08e44cdd78fa6ad9d8b4c99b443af1bbaa Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 13:28:15 -0700 Subject: [PATCH 04/21] Add rest wrapper --- logicmonitor_core/LogicMonitor.py | 95 ++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 3 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 0a5cafd..e23c999 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -1,9 +1,14 @@ #!/usr/bin/python +import base64 +import hashlib +import hmac import json import logging +import requests import socket import sys +import time import urllib import urllib2 @@ -16,8 +21,8 @@ def __init__(self, **params): self.check_mode = False self.company = params["company"] - self.user = params["user"] - self.password = params["password"] + self.access_id = params["access_id"] + self.access_key = params["access_key"] self.fqdn = socket.getfqdn() self.lm_url = "logicmonitor.com/santaba" self.urlopen = urllib2.urlopen @@ -77,7 +82,8 @@ def do(self, action, params): try: # log param string without credentials logging.debug("Attempting to open URL: " + - "https://" + self.company + "." + self.lm_url + + "https://" + self.company + "." + + self.lm_url + "/do/" + action + "?" + param_str) f = self.urlopen( "https://" + self.company + "." + self.lm_url + @@ -87,6 +93,89 @@ def do(self, action, params): logging.debug("Error opening URL. " + ioe) self.fail("Unknown exception opening URL") + def rest(self, method, path, data=None): + '''Make a call to the LogicMonitor server REST API''' + logging.debug("Running LogicMonitor.rest...") + + if ((method == 'DELETE' or + method == 'PATCH' or + method == 'POST') and + data is None): + # TODO better error message + self.fail("No payload specified") + try: + url = ('https://' + self.company + '.' + + self.lm_url + '/rest/' + path) + + logging.debug("Sending " + method + " to: " + url) + auth_header = self.get_auth_header( + method, path, data) + headers = {'Content-Type': 'application/json', + 'Authorization': auth_header} + + resp = None + if method == 'DELETE': + resp = requests.delete(url, headers=headers) + elif method == 'GET': + resp = requests.get(url, headers=headers) + elif method == 'PATCH': + resp = requests.patch(url, + data=data, + headers=headers) + elif method == 'POST': + resp = requests.post(url, + data=data, + headers=headers) + elif method == 'PUT': + resp = requests.put(url, + data=data, + headers=headers) + + if resp.status_code != '200': + self.fail('HTTP response ' + resp.status_code + + ' from API while making ' + method + + ' request to ' + url) + else: + self.debug('Successful API call to ' + url) + return resp + except Exception as e: + self.fail('Unknown error making API request: ' + + e.message) + + def get_auth_header(self, method, path, data): + '''Construct an REST API authentication header''' + logging.debug("Running LogicMonitor.get_auth_header...") + + if self.access_key is None or self.access_id is None: + self.fail('Must specify Access Key and ' + + 'Access ID for authenticating') + + epoch = str(int(time.time() * 1000)) + + # concatenate request details + msg = '' + if data is None: + msg = method + epoch + path + else: + msg = method + epoch + data + path + + # construct signature + signature = base64.b64encode( + hmac.new( + self.access_key, + msg=msg, + digestmod=hashlib.sha256 + ).hexdigest() + ) + + # construct header + auth = ('LMv1 ' + + self.access_id + ':' + + signature + ':' + + epoch) + + return auth + def get_collectors(self): """Returns a JSON object containing a list of LogicMonitor collectors""" From 22b63b34c709e3fa700d6a81742dae3c733705ef Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 13:48:27 -0700 Subject: [PATCH 05/21] Update access variable names --- logicmonitor_core/LogicMonitor.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index e23c999..93150ed 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -21,8 +21,8 @@ def __init__(self, **params): self.check_mode = False self.company = params["company"] - self.access_id = params["access_id"] - self.access_key = params["access_key"] + self.accessid = params['accessid'] + self.accesskey = params['accesskey'] self.fqdn = socket.getfqdn() self.lm_url = "logicmonitor.com/santaba" self.urlopen = urllib2.urlopen @@ -146,7 +146,7 @@ def get_auth_header(self, method, path, data): '''Construct an REST API authentication header''' logging.debug("Running LogicMonitor.get_auth_header...") - if self.access_key is None or self.access_id is None: + if self.accesskey is None or self.accessid is None: self.fail('Must specify Access Key and ' + 'Access ID for authenticating') @@ -162,7 +162,7 @@ def get_auth_header(self, method, path, data): # construct signature signature = base64.b64encode( hmac.new( - self.access_key, + self.accesskey, msg=msg, digestmod=hashlib.sha256 ).hexdigest() @@ -170,7 +170,7 @@ def get_auth_header(self, method, path, data): # construct header auth = ('LMv1 ' + - self.access_id + ':' + + self.accessid + ':' + signature + ':' + epoch) From 99e2a302ef08f9738a71faca337fbdf562f771fa Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 14:47:58 -0700 Subject: [PATCH 06/21] Tweaks and fixes --- logicmonitor_core/LogicMonitor.py | 33 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 93150ed..7bbaea0 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -93,7 +93,7 @@ def do(self, action, params): logging.debug("Error opening URL. " + ioe) self.fail("Unknown exception opening URL") - def rest(self, method, path, data=None): + def rest(self, path, method, data=None): '''Make a call to the LogicMonitor server REST API''' logging.debug("Running LogicMonitor.rest...") @@ -105,15 +105,15 @@ def rest(self, method, path, data=None): self.fail("No payload specified") try: url = ('https://' + self.company + '.' + - self.lm_url + '/rest/' + path) + self.lm_url + '/rest' + path) logging.debug("Sending " + method + " to: " + url) auth_header = self.get_auth_header( - method, path, data) + path, method, data) headers = {'Content-Type': 'application/json', 'Authorization': auth_header} - resp = None + resp = '' if method == 'DELETE': resp = requests.delete(url, headers=headers) elif method == 'GET': @@ -130,19 +130,23 @@ def rest(self, method, path, data=None): resp = requests.put(url, data=data, headers=headers) + else: + self.fail('Invalid method ' + + method + 'specified') - if resp.status_code != '200': - self.fail('HTTP response ' + resp.status_code + + if resp.status_code != 200: + self.fail('HTTP response ' + + str(resp.status_code) + ' from API while making ' + method + ' request to ' + url) else: - self.debug('Successful API call to ' + url) - return resp + logging.debug('Successful API call to ' + url) + return resp except Exception as e: self.fail('Unknown error making API request: ' + e.message) - def get_auth_header(self, method, path, data): + def get_auth_header(self, path, method, data): '''Construct an REST API authentication header''' logging.debug("Running LogicMonitor.get_auth_header...") @@ -160,14 +164,11 @@ def get_auth_header(self, method, path, data): msg = method + epoch + data + path # construct signature - signature = base64.b64encode( - hmac.new( - self.accesskey, - msg=msg, - digestmod=hashlib.sha256 - ).hexdigest() - ) + digest = hmac.new(self.accesskey, + msg=msg, + digestmod=hashlib.sha256).hexdigest() + signature = base64.b64encode(digest) # construct header auth = ('LMv1 ' + self.accessid + ':' + From e23dcfa93eb6bbb5e2da5d02b8690821651a4792 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 15:04:19 -0700 Subject: [PATCH 07/21] Error message updates and quote fixes --- logicmonitor_core/LogicMonitor.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 7bbaea0..06d096a 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -101,13 +101,12 @@ def rest(self, path, method, data=None): method == 'PATCH' or method == 'POST') and data is None): - # TODO better error message - self.fail("No payload specified") + self.fail('Message body required for method ' + method) try: url = ('https://' + self.company + '.' + self.lm_url + '/rest' + path) - logging.debug("Sending " + method + " to: " + url) + logging.debug('Sending ' + method + ' to: ' + url) auth_header = self.get_auth_header( path, method, data) headers = {'Content-Type': 'application/json', @@ -143,8 +142,7 @@ def rest(self, path, method, data=None): logging.debug('Successful API call to ' + url) return resp except Exception as e: - self.fail('Unknown error making API request: ' + - e.message) + self.fail('Error making API request: ' + e.message) def get_auth_header(self, path, method, data): '''Construct an REST API authentication header''' From f846510a423d708a05d76a5917b13e7872a909b0 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 16:13:00 -0700 Subject: [PATCH 08/21] Don't exit on rest failure --- logicmonitor_core/LogicMonitor.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 06d096a..4f35425 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -134,15 +134,18 @@ def rest(self, path, method, data=None): method + 'specified') if resp.status_code != 200: - self.fail('HTTP response ' + - str(resp.status_code) + - ' from API while making ' + method + - ' request to ' + url) + logging.error('HTTP response ' + + str(resp.status_code) + + ' from API while making ' + + method + + ' request to ' + url) else: logging.debug('Successful API call to ' + url) return resp except Exception as e: - self.fail('Error making API request: ' + e.message) + logging.error('Error making API request: ' + + e.message) + return None def get_auth_header(self, path, method, data): '''Construct an REST API authentication header''' From 8205681493e7fa62764adc8250a0343900c41e0d Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 16:15:52 -0700 Subject: [PATCH 09/21] Update variable name --- examples/collector_add.py | 4 ++-- examples/collector_remove.py | 4 ++-- examples/collector_sdt.py | 4 ++-- examples/datasource_sdt.py | 4 ++-- examples/device_add.py | 4 ++-- examples/device_info.py | 4 ++-- examples/device_remove.py | 4 ++-- examples/device_sdt.py | 4 ++-- examples/device_update.py | 4 ++-- examples/devicegroup_add.py | 4 ++-- examples/devicegroup_info.py | 4 ++-- examples/devicegroup_remove.py | 4 ++-- examples/devicegroup_sdt.py | 4 ++-- examples/devicegroup_update.py | 4 ++-- examples/itop-sync/itop_lm_sync.py | 4 ++-- examples/itop-sync/lm_itop_sync.py | 4 ++-- examples/list_devices.py | 4 ++-- 17 files changed, 34 insertions(+), 34 deletions(-) diff --git a/examples/collector_add.py b/examples/collector_add.py index fbd2acb..6599aae 100755 --- a/examples/collector_add.py +++ b/examples/collector_add.py @@ -36,8 +36,8 @@ def main(): # Require params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey # Optional params if args.collector_id is not None: diff --git a/examples/collector_remove.py b/examples/collector_remove.py index 074138a..602dc16 100755 --- a/examples/collector_remove.py +++ b/examples/collector_remove.py @@ -31,8 +31,8 @@ def main(): # Require params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey col = Collector(params) diff --git a/examples/collector_sdt.py b/examples/collector_sdt.py index 47f285f..cbed56a 100755 --- a/examples/collector_sdt.py +++ b/examples/collector_sdt.py @@ -36,8 +36,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey # Optional params if args.duration is not None: diff --git a/examples/datasource_sdt.py b/examples/datasource_sdt.py index e1a69b7..20b4549 100644 --- a/examples/datasource_sdt.py +++ b/examples/datasource_sdt.py @@ -30,8 +30,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["id"] = args.id # Optional params diff --git a/examples/device_add.py b/examples/device_add.py index 3eabd73..8f5eef2 100755 --- a/examples/device_add.py +++ b/examples/device_add.py @@ -50,8 +50,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/device_info.py b/examples/device_info.py index d3936ec..d339870 100755 --- a/examples/device_info.py +++ b/examples/device_info.py @@ -38,8 +38,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/device_remove.py b/examples/device_remove.py index 9a8b6fd..4ebd4a7 100755 --- a/examples/device_remove.py +++ b/examples/device_remove.py @@ -38,8 +38,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/device_sdt.py b/examples/device_sdt.py index d0625b9..eb195b4 100755 --- a/examples/device_sdt.py +++ b/examples/device_sdt.py @@ -42,8 +42,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/device_update.py b/examples/device_update.py index 997bdc2..6e05051 100755 --- a/examples/device_update.py +++ b/examples/device_update.py @@ -49,8 +49,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["collector"] = args.collector # Optional params diff --git a/examples/devicegroup_add.py b/examples/devicegroup_add.py index 33fbc7a..cd1363e 100755 --- a/examples/devicegroup_add.py +++ b/examples/devicegroup_add.py @@ -41,8 +41,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["fullpath"] = args.fullpath # Optional params diff --git a/examples/devicegroup_info.py b/examples/devicegroup_info.py index 764991d..feeac48 100755 --- a/examples/devicegroup_info.py +++ b/examples/devicegroup_info.py @@ -33,8 +33,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["fullpath"] = args.fullpath hg = Hostgroup(params) diff --git a/examples/devicegroup_remove.py b/examples/devicegroup_remove.py index 2051f97..ecccab4 100755 --- a/examples/devicegroup_remove.py +++ b/examples/devicegroup_remove.py @@ -34,8 +34,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["fullpath"] = args.fullpath hg = Hostgroup(params) diff --git a/examples/devicegroup_sdt.py b/examples/devicegroup_sdt.py index 6bc110b..a750811 100755 --- a/examples/devicegroup_sdt.py +++ b/examples/devicegroup_sdt.py @@ -39,8 +39,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["fullpath"] = args.fullpath # Optional params diff --git a/examples/devicegroup_update.py b/examples/devicegroup_update.py index 68f6698..b723297 100755 --- a/examples/devicegroup_update.py +++ b/examples/devicegroup_update.py @@ -42,8 +42,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["fullpath"] = args.fullpath # Optional params diff --git a/examples/itop-sync/itop_lm_sync.py b/examples/itop-sync/itop_lm_sync.py index c14b287..da8bc3e 100644 --- a/examples/itop-sync/itop_lm_sync.py +++ b/examples/itop-sync/itop_lm_sync.py @@ -91,8 +91,8 @@ def main(): params["duration"] = 30 params["properties"] = {} params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey group = Hostgroup(params) group.add() diff --git a/examples/itop-sync/lm_itop_sync.py b/examples/itop-sync/lm_itop_sync.py index ef9a1c0..a986b2a 100644 --- a/examples/itop-sync/lm_itop_sync.py +++ b/examples/itop-sync/lm_itop_sync.py @@ -86,8 +86,8 @@ def main(): params = {} params["group"] = None params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey # Get JSON of all devices host_list = HostList(params) diff --git a/examples/list_devices.py b/examples/list_devices.py index d0665cc..d2e0436 100644 --- a/examples/list_devices.py +++ b/examples/list_devices.py @@ -27,8 +27,8 @@ def main(): # Required params params["company"] = args.company - params['access_id'] = args.accessid - params['access_key'] = args.accesskey + params['accessid'] = args.accessid + params['accesskey'] = args.accesskey # Optional params if args.group is not None: From a7150402fd4b3b764e4ec882ba6633ad202b81e1 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 16:28:43 -0700 Subject: [PATCH 10/21] Fix param flag conflict -i is taken by collector id. move access id to -t --- README.md | 60 +++++++++++++++--------------- examples/collector_add.py | 2 +- examples/collector_remove.py | 2 +- examples/collector_sdt.py | 2 +- examples/datasource_sdt.py | 2 +- examples/device_add.py | 2 +- examples/device_info.py | 2 +- examples/device_remove.py | 2 +- examples/device_sdt.py | 2 +- examples/device_update.py | 2 +- examples/devicegroup_add.py | 2 +- examples/devicegroup_info.py | 2 +- examples/devicegroup_remove.py | 2 +- examples/devicegroup_sdt.py | 2 +- examples/devicegroup_update.py | 2 +- examples/itop-sync/README.md | 6 +-- examples/itop-sync/itop_lm_sync.py | 2 +- examples/itop-sync/lm_itop_sync.py | 2 +- examples/list_devices.py | 2 +- 19 files changed, 50 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index dcc1990..bfb8456 100644 --- a/README.md +++ b/README.md @@ -63,10 +63,10 @@ management [click here](http://help.logicmonitor.com/the-new-ui/settings/collect ``` $> python ./examples/collector_add.py -h -usage: collector_add.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY +usage: collector_add.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID --accessid ACCESSID API Token Access Id + -t ACCESSID --accessid ACCESSID API Token Access Id -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit @@ -81,10 +81,10 @@ collector management ``` $> python ./examples/collector_remove.py -h -usage: collector_remove.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY +usage: collector_remove.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID --accessid ACCESSID API Token Access Id + -t ACCESSID --accessid ACCESSID API Token Access Id -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit @@ -100,10 +100,10 @@ For more information about collector management ``` $> python ./examples/collector_sdt.py -h -usage: collector_sdt.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-d DURATION] [-s STARTTIME] +usage: collector_sdt.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY [-d DURATION] [-s STARTTIME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID --accessid ACCESSID API Token Access Id + -t ACCESSID --accessid ACCESSID API Token Access Id -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit @@ -120,12 +120,12 @@ be created. For more information on managing devices ``` $> python ./examples/device_add.py -h -usage: device_add.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -C COLLECTOR +usage: device_add.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY -C COLLECTOR [-H HOSTNAME] [-d DISPLAYNAME] [--description DESCRIPTION] [-P PROPERTIES] [-g GROUPS [GROUPS ...]] [-a ALERTENABLE] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key -C COLLECTOR, --collector COLLECTOR Collector FQDN optional arguments: @@ -146,11 +146,11 @@ if they were created by adding this device. For more information on managing dev ``` $> python ./examples/device_remove.py -h -usage: device_remove.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-C COLLECTOR] +usage: device_remove.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY [-C COLLECTOR] [-H HOSTNAME] [-d DISPLAYNAME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit @@ -165,13 +165,13 @@ This idempotent script updates a device already being monitored by your LogicMon ``` $> python ./examples/device_update.py -h -usage: device_update.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-C COLLECTOR] +usage: device_update.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY [-C COLLECTOR] [-H HOSTNAME] [-d DISPLAYNAME] [--description DESCRIPTION] [-P PROPERTIES] [-g GROUPS [GROUPS ...]] [-a ALERTENABLE] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit @@ -194,11 +194,11 @@ information on managing devices ``` $> python ./examples/device_sdt.py -h -usage: device_sdt.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY [-C COLLECTOR] +usage: device_sdt.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY [-C COLLECTOR] [-H HOSTNAME] [-d DISPLAYNAME] [-D DURATION] [-s STARTTIME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit @@ -216,11 +216,11 @@ monitored by your LogicMonitor account. For more information on managing devices ``` $> python ./examples/device_info.py -h -usage: device_info.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -C COLLECTOR +usage: device_info.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY -C COLLECTOR [-H HOSTNAME] [-d DISPLAYNAME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit @@ -239,10 +239,10 @@ information on managing datasources ``` $> python ./examples/datasource_sdt.py -h -usage: device_sdt.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -i ID +usage: device_sdt.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY -i ID required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: -h, --help Show this help message and exit @@ -254,11 +254,11 @@ This script list all devices being monitored in your LogicMonitor account. ``` $> python ./examples/list_devices.py -h -usage: device_add.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY +usage: device_add.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY [-g GROUP] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key optional arguments: @@ -276,12 +276,12 @@ be created. For more information on managing device groups ``` $> python ./examples/devicegroup_add.py -h -usage: devicegroup_add.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH +usage: devicegroup_add.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY -f FULLPATH [--description DESCRIPTION] [-P PROPERTIES] [-a ALERTENABLE] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: @@ -298,10 +298,10 @@ For more information on managing device groups ``` $> python ./examples/devicegroup_remove.py -h -usage: devicegroup_remove.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH +usage: devicegroup_remove.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY -f FULLPATH required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID --accessid ACCESSID API Token Access Id + -t ACCESSID --accessid ACCESSID API Token Access Id -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: @@ -315,12 +315,12 @@ managing device groups ``` $> python ./examples/devicegroup_update.py -h -usage: devicegroup_update.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH +usage: devicegroup_update.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY -f FULLPATH [--description DESCRIPTION] [-P PROPERTIES] [-a ALERTENABLE] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: @@ -339,11 +339,11 @@ For more information on managing device groups ``` $> python ./examples/devicegroup_sdt.py -h -usage: devicegroup_sdt.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH +usage: devicegroup_sdt.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY -f FULLPATH [-D DURATION] [-s STARTTIME] required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: @@ -358,10 +358,10 @@ This script retrieves and displays information about a device group in your Logi ``` $> python ./examples/devicegroup_info.py -h -usage: devicegroup_info.py [-h] -c COMPANY -i ACCESSID -k ACCESSKEY -f FULLPATH +usage: devicegroup_info.py [-h] -c COMPANY -t ACCESSID -k ACCESSKEY -f FULLPATH required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -i ACCESSID --accessid ACCESSID API Token Access Id + -t ACCESSID --accessid ACCESSID API Token Access Id -k ACCESSKEY --accesskey ACCESSKEY API Token Access Key -f FULLPATH, --fullpath FULLPATH Full path of the device group optional arguments: diff --git a/examples/collector_add.py b/examples/collector_add.py index 6599aae..8906f27 100755 --- a/examples/collector_add.py +++ b/examples/collector_add.py @@ -12,7 +12,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/collector_remove.py b/examples/collector_remove.py index 602dc16..13b448e 100755 --- a/examples/collector_remove.py +++ b/examples/collector_remove.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/collector_sdt.py b/examples/collector_sdt.py index cbed56a..8a6b92f 100755 --- a/examples/collector_sdt.py +++ b/examples/collector_sdt.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/datasource_sdt.py b/examples/datasource_sdt.py index 20b4549..c7d050a 100644 --- a/examples/datasource_sdt.py +++ b/examples/datasource_sdt.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/device_add.py b/examples/device_add.py index 8f5eef2..957fe84 100755 --- a/examples/device_add.py +++ b/examples/device_add.py @@ -10,7 +10,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/device_info.py b/examples/device_info.py index d339870..fe66ad5 100755 --- a/examples/device_info.py +++ b/examples/device_info.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/device_remove.py b/examples/device_remove.py index 4ebd4a7..4afdc0c 100755 --- a/examples/device_remove.py +++ b/examples/device_remove.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/device_sdt.py b/examples/device_sdt.py index eb195b4..08da970 100755 --- a/examples/device_sdt.py +++ b/examples/device_sdt.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/device_update.py b/examples/device_update.py index 6e05051..f2f1216 100755 --- a/examples/device_update.py +++ b/examples/device_update.py @@ -10,7 +10,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/devicegroup_add.py b/examples/devicegroup_add.py index cd1363e..c5650c0 100755 --- a/examples/devicegroup_add.py +++ b/examples/devicegroup_add.py @@ -10,7 +10,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/devicegroup_info.py b/examples/devicegroup_info.py index feeac48..3f21d26 100755 --- a/examples/devicegroup_info.py +++ b/examples/devicegroup_info.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/devicegroup_remove.py b/examples/devicegroup_remove.py index ecccab4..2af8df1 100755 --- a/examples/devicegroup_remove.py +++ b/examples/devicegroup_remove.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/devicegroup_sdt.py b/examples/devicegroup_sdt.py index a750811..f1a716f 100755 --- a/examples/devicegroup_sdt.py +++ b/examples/devicegroup_sdt.py @@ -9,7 +9,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/devicegroup_update.py b/examples/devicegroup_update.py index b723297..2f5abde 100755 --- a/examples/devicegroup_update.py +++ b/examples/devicegroup_update.py @@ -10,7 +10,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', diff --git a/examples/itop-sync/README.md b/examples/itop-sync/README.md index e4382f5..962ad22 100644 --- a/examples/itop-sync/README.md +++ b/examples/itop-sync/README.md @@ -62,7 +62,7 @@ You will also need to identify the Collector description that you want to use, i ``` $> python ./examples/lm_itop_sync.py -h usage: Synchronize LogicMonitor devices to iTop CMDB (federation) - [-h] -c CUSTOMER_PORTAL -i ACCESSIDNAME -k ACCESSKEY -ih ITOP_HOST -iu + [-h] -c CUSTOMER_PORTAL -t ACCESSID -k ACCESSKEY -ih ITOP_HOST -iu ITOP_USERNAME -ip ITOP_PASSWORD -io ITOP_ORG_ID [-mh MYSQL_HOST] -mu MYSQL_USERNAME -mp MYSQL_PASSWORD -md MYSQL_DATABASE -st SERVER_TABLE -pt PRINTER_TABLE -ht HYPERVISOR_TABLE @@ -70,7 +70,7 @@ usage: Synchronize LogicMonitor devices to iTop CMDB (federation) optional arguments: -h, --help show this help message and exit -c CUSTOMER_PORTAL, --company CUSTOMER_PORTAL LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key API Token Access Key -ih ITOP_HOST iTop server hostname @@ -101,7 +101,7 @@ usage: Synchronize iTop CMDB CIs to LogicMonitor [-h] -c CUSTOMER_PORTAL -i optional arguments: -h, --help show this help message and exit -c CUSTOMER_PORTAL, --company CUSTOMER_PORTAL LogicMonitor account - -i ACCESSID, --accessid ACCESSID API Token Access Id + -t ACCESSID, --accessid ACCESSID API Token Access Id -k ACCESSKEY, --accesskey ACCESSKEY API Token Access Key API Token Access Key -cn COLLECTOR_NAME LogicMonitor collector description diff --git a/examples/itop-sync/itop_lm_sync.py b/examples/itop-sync/itop_lm_sync.py index da8bc3e..901dc63 100644 --- a/examples/itop-sync/itop_lm_sync.py +++ b/examples/itop-sync/itop_lm_sync.py @@ -53,7 +53,7 @@ def main(): parser = argparse.ArgumentParser(description) parser.add_argument("-c", "--company", metavar="CUSTOMER_PORTAL", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', metavar="USERNAME", + parser.add_argument('-t', '--accessid', metavar="USERNAME", help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', metavar="PASSWORD", help="API Token Access Key", required=True) diff --git a/examples/itop-sync/lm_itop_sync.py b/examples/itop-sync/lm_itop_sync.py index a986b2a..21e9d1b 100644 --- a/examples/itop-sync/lm_itop_sync.py +++ b/examples/itop-sync/lm_itop_sync.py @@ -27,7 +27,7 @@ def main(): parser = argparse.ArgumentParser(description) parser.add_argument("-c", "--company", metavar="CUSTOMER_PORTAL", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', metavar="ACCESSID", + parser.add_argument('-t', '--accessid', metavar="ACCESSID", help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', metavar="ACCESSID", help="API Token Access Key", required=True) diff --git a/examples/list_devices.py b/examples/list_devices.py index d2e0436..64818d4 100644 --- a/examples/list_devices.py +++ b/examples/list_devices.py @@ -10,7 +10,7 @@ def main(): parser.add_argument("-c", "--company", help="LogicMonitor account", required=True) - parser.add_argument('-i', '--accessid', + parser.add_argument('-t', '--accessid', help="API Token Access Id", required=True) parser.add_argument('-k', '--accesskey', From cd883945c104bc79bc5213542dfe318286d94c45 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 16:41:02 -0700 Subject: [PATCH 11/21] Update api return --- logicmonitor_core/LogicMonitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 4f35425..50589a6 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -141,7 +141,7 @@ def rest(self, path, method, data=None): ' request to ' + url) else: logging.debug('Successful API call to ' + url) - return resp + return resp except Exception as e: logging.error('Error making API request: ' + e.message) From a40e955cca33503e08460969c3ef354ca5a5090e Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 16:42:32 -0700 Subject: [PATCH 12/21] Revert "Update api return" This reverts commit cd883945c104bc79bc5213542dfe318286d94c45. --- logicmonitor_core/LogicMonitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 50589a6..4f35425 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -141,7 +141,7 @@ def rest(self, path, method, data=None): ' request to ' + url) else: logging.debug('Successful API call to ' + url) - return resp + return resp except Exception as e: logging.error('Error making API request: ' + e.message) From 0fa93c4ded44228c930272dab08429d3b4006bf9 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 17:11:39 -0700 Subject: [PATCH 13/21] Only fail on patch message body --- logicmonitor_core/LogicMonitor.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 4f35425..69ad74d 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -97,10 +97,7 @@ def rest(self, path, method, data=None): '''Make a call to the LogicMonitor server REST API''' logging.debug("Running LogicMonitor.rest...") - if ((method == 'DELETE' or - method == 'PATCH' or - method == 'POST') and - data is None): + if method == 'PATCH' and data is None: self.fail('Message body required for method ' + method) try: url = ('https://' + self.company + '.' + From 244dfc5cd98dd19caa86cd66699c1356aa821fa4 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 17:13:51 -0700 Subject: [PATCH 14/21] Revert "Only fail on patch message body" This reverts commit 0fa93c4ded44228c930272dab08429d3b4006bf9. --- logicmonitor_core/LogicMonitor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 69ad74d..4f35425 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -97,7 +97,10 @@ def rest(self, path, method, data=None): '''Make a call to the LogicMonitor server REST API''' logging.debug("Running LogicMonitor.rest...") - if method == 'PATCH' and data is None: + if ((method == 'DELETE' or + method == 'PATCH' or + method == 'POST') and + data is None): self.fail('Message body required for method ' + method) try: url = ('https://' + self.company + '.' + From 811fd34bf24274dfd77cbf73f402980cab544b3e Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 17:14:47 -0700 Subject: [PATCH 15/21] Don't fail on message body for DELETE --- logicmonitor_core/LogicMonitor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 4f35425..7ceede9 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -97,8 +97,7 @@ def rest(self, path, method, data=None): '''Make a call to the LogicMonitor server REST API''' logging.debug("Running LogicMonitor.rest...") - if ((method == 'DELETE' or - method == 'PATCH' or + if ((method == 'PATCH' or method == 'POST') and data is None): self.fail('Message body required for method ' + method) From 02b38e8f25eb3503bad26de416c750800f82a8f1 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Thu, 6 Oct 2016 17:18:24 -0700 Subject: [PATCH 16/21] Convert data to json in rest wrapper --- logicmonitor_core/LogicMonitor.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 7ceede9..712be1f 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -100,7 +100,12 @@ def rest(self, path, method, data=None): if ((method == 'PATCH' or method == 'POST') and data is None): - self.fail('Message body required for method ' + method) + self.fail('Message body required for method ' + + method) + + # convert data to json + if data is not None: + data = json.dumps(data) try: url = ('https://' + self.company + '.' + self.lm_url + '/rest' + path) From 1ff77990228cfd7472757ebb8c0876646729d9c4 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Fri, 7 Oct 2016 12:09:29 -0700 Subject: [PATCH 17/21] Update log order --- logicmonitor_core/LogicMonitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 712be1f..356a436 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -110,12 +110,12 @@ def rest(self, path, method, data=None): url = ('https://' + self.company + '.' + self.lm_url + '/rest' + path) - logging.debug('Sending ' + method + ' to: ' + url) auth_header = self.get_auth_header( path, method, data) headers = {'Content-Type': 'application/json', 'Authorization': auth_header} + logging.debug('Sending ' + method + ' to: ' + url) resp = '' if method == 'DELETE': resp = requests.delete(url, headers=headers) From 153f0891a1d969d31275473013e8617658881753 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Fri, 7 Oct 2016 14:43:25 -0700 Subject: [PATCH 18/21] Wrap lines to 80 instead of 64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stupid editor settings… --- logicmonitor_core/LogicMonitor.py | 35 ++++++++++--------------------- 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 356a436..a1cf1ea 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -110,8 +110,7 @@ def rest(self, path, method, data=None): url = ('https://' + self.company + '.' + self.lm_url + '/rest' + path) - auth_header = self.get_auth_header( - path, method, data) + auth_header = self.get_auth_header(path, method, data) headers = {'Content-Type': 'application/json', 'Authorization': auth_header} @@ -122,26 +121,17 @@ def rest(self, path, method, data=None): elif method == 'GET': resp = requests.get(url, headers=headers) elif method == 'PATCH': - resp = requests.patch(url, - data=data, - headers=headers) + resp = requests.patch(url, data=data, headers=headers) elif method == 'POST': - resp = requests.post(url, - data=data, - headers=headers) + resp = requests.post(url, data=data, headers=headers) elif method == 'PUT': - resp = requests.put(url, - data=data, - headers=headers) + resp = requests.put(url, data=data, headers=headers) else: - self.fail('Invalid method ' + - method + 'specified') + self.fail('Invalid method ' + method + 'specified') if resp.status_code != 200: - logging.error('HTTP response ' + - str(resp.status_code) + - ' from API while making ' + - method + + logging.error('HTTP response ' + str(resp.status_code) + + ' from API while making ' + method + ' request to ' + url) else: logging.debug('Successful API call to ' + url) @@ -156,8 +146,8 @@ def get_auth_header(self, path, method, data): logging.debug("Running LogicMonitor.get_auth_header...") if self.accesskey is None or self.accessid is None: - self.fail('Must specify Access Key and ' + - 'Access ID for authenticating') + self.fail('Must specify Access Key and Access ID for ' + + 'authenticating') epoch = str(int(time.time() * 1000)) @@ -172,13 +162,10 @@ def get_auth_header(self, path, method, data): digest = hmac.new(self.accesskey, msg=msg, digestmod=hashlib.sha256).hexdigest() - signature = base64.b64encode(digest) + # construct header - auth = ('LMv1 ' + - self.accessid + ':' + - signature + ':' + - epoch) + auth = ('LMv1 ' + self.accessid + ':' + signature + ':' + epoch) return auth From c04a5b7f7bfa0dfc20d22441236b37ddc137a6ec Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Fri, 7 Oct 2016 14:52:55 -0700 Subject: [PATCH 19/21] More wrap fixes --- logicmonitor_core/LogicMonitor.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index a1cf1ea..194b23d 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -97,18 +97,14 @@ def rest(self, path, method, data=None): '''Make a call to the LogicMonitor server REST API''' logging.debug("Running LogicMonitor.rest...") - if ((method == 'PATCH' or - method == 'POST') and - data is None): - self.fail('Message body required for method ' + - method) + if method == 'PATCH' or method == 'POST' and data is None: + self.fail('Message body required for method ' + method) # convert data to json if data is not None: data = json.dumps(data) try: - url = ('https://' + self.company + '.' + - self.lm_url + '/rest' + path) + url = 'https://' + self.company + '.' + self.lm_url + '/rest' + path auth_header = self.get_auth_header(path, method, data) headers = {'Content-Type': 'application/json', @@ -137,8 +133,7 @@ def rest(self, path, method, data=None): logging.debug('Successful API call to ' + url) return resp except Exception as e: - logging.error('Error making API request: ' - + e.message) + logging.error('Error making API request: ' + e.message) return None def get_auth_header(self, path, method, data): From 8838e0437d2dbee857b7d8f9ff8a6939f42f88ea Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Fri, 7 Oct 2016 16:32:13 -0700 Subject: [PATCH 20/21] Wrap line --- logicmonitor_core/LogicMonitor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 194b23d..04ba656 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -104,7 +104,8 @@ def rest(self, path, method, data=None): if data is not None: data = json.dumps(data) try: - url = 'https://' + self.company + '.' + self.lm_url + '/rest' + path + url = 'https://' + self.company + '.' + self.lm_url + ' + /rest' + path auth_header = self.get_auth_header(path, method, data) headers = {'Content-Type': 'application/json', From 2f5e32b2f7c996bb7a5eed9fb230f11bfec16b78 Mon Sep 17 00:00:00 2001 From: Jeff Wozniak Date: Tue, 11 Oct 2016 11:50:42 -0700 Subject: [PATCH 21/21] Update lm.py args --- logicmonitor_core/LogicMonitor.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/logicmonitor_core/LogicMonitor.py b/logicmonitor_core/LogicMonitor.py index 04ba656..ffd608b 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -15,14 +15,15 @@ class LogicMonitor(object): - def __init__(self, **params): + def __init__(self, company, accessid, accesskey, **params): self.__version__ = "1.0-python" logging.debug("Instantiating LogicMonitor object") + self.company = company + self.accessid = accessid + self.accesskey = accesskey + self.check_mode = False - self.company = params["company"] - self.accessid = params['accessid'] - self.accesskey = params['accesskey'] self.fqdn = socket.getfqdn() self.lm_url = "logicmonitor.com/santaba" self.urlopen = urllib2.urlopen @@ -104,8 +105,8 @@ def rest(self, path, method, data=None): if data is not None: data = json.dumps(data) try: - url = 'https://' + self.company + '.' + self.lm_url + ' - /rest' + path + url = ('https://' + self.company + '.' + self.lm_url + + '/rest' + path) auth_header = self.get_auth_header(path, method, data) headers = {'Content-Type': 'application/json',