diff --git a/README.md b/README.md index 14486b2..bfb8456 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 -t ACCESSID -k ACCESSKEY required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -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,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 -t ACCESSID -k ACCESSKEY required arguments: -c COMPANY, --company COMPANY LogicMonitor account - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -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,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 -t 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 + -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 -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 -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 - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -t 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 -t 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 + -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 -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 -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 - -u USER, --user USER LogicMonitor user name - -p PASSWORD, --password PASSWORD LogicMonitor password + -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 -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 -t 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 + -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 -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 -t 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 + -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 -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 -t 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 + -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 -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 -t 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 + -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 + -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 -t 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 + -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: -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 -t 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 + -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: -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 -t 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 + -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: -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 -t 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 + -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: -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 -t 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 + -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: -h, --help Show this help message and exit diff --git a/examples/collector_add.py b/examples/collector_add.py index cebf157..8906f27 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('-t', '--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['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 6cf6d78..13b448e 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('-t', '--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['accessid'] = args.accessid + params['accesskey'] = args.accesskey col = Collector(params) diff --git a/examples/collector_sdt.py b/examples/collector_sdt.py index 1a53598..8a6b92f 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('-t', '--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['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 4116351..c7d050a 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('-t', '--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['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 d04b231..957fe84 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('-t', '--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['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 96ff814..fe66ad5 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('-t', '--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['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 4a882c1..4afdc0c 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('-t', '--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['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 72bad15..08da970 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('-t', '--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['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 c6642cd..f2f1216 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('-t', '--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['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 6117e69..c5650c0 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('-t', '--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['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 2e5d6f8..3f21d26 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('-t', '--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['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 97f152b..2af8df1 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('-t', '--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['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 6f11d9a..f1a716f 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('-t', '--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['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 27febce..2f5abde 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('-t', '--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['accessid'] = args.accessid + params['accesskey'] = args.accesskey params["fullpath"] = args.fullpath # Optional params diff --git a/examples/itop-sync/README.md b/examples/itop-sync/README.md index f9d39fb..962ad22 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 -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 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 + -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 -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 + -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 -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..901dc63 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('-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) 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['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 0e997eb..21e9d1b 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('-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) 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['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 0552c58..64818d4 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('-t', '--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['accessid'] = args.accessid + params['accesskey'] = args.accesskey # Optional params if args.group is not None: 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..ac7ab27 100755 --- a/logicmonitor_core/Host.py +++ b/logicmonitor_core/Host.py @@ -9,127 +9,128 @@ class Host(LogicMonitor): def __init__(self, params): - """Initializor for the LogicMonitor host object""" + '''Initializor for the LogicMonitor host object''' logging.basicConfig(level=logging.DEBUG) - logging.debug("Instantiating Host object") + logging.debug('Instantiating Host object') self.change = False self.params = params self.collector = None + self.api = self.rest - LogicMonitor.__init__(self, **self.params) + LogicMonitor.__init__(self, **params) - if self.params["hostname"]: - logging.debug("Hostname is " + self.params["hostname"]) + if self.params['hostname']: + logging.debug('Hostname is ' + self.params['hostname']) self.hostname = self.params['hostname'] else: - logging.debug("No hostname specified. Using " + self.fqdn) + logging.debug('No hostname specified. Using ' + self.fqdn) self.hostname = self.fqdn - if self.params["displayname"]: - logging.debug("Display name is " + self.params["displayname"]) + if self.params['displayname']: + logging.debug('Display name is ' + self.params['displayname']) self.displayname = self.params['displayname'] else: - logging.debug("No display name specified. Using " + self.fqdn) + logging.debug('No display name specified. Using ' + self.fqdn) self.displayname = self.fqdn # Attempt to host information via display name of host name - logging.debug("Attempting to find host by displayname " + + logging.debug('Attempting to find host by displayname ' + self.displayname) info = self.get_host_by_displayname(self.displayname) if info is not None: - logging.debug("Host found by displayname") + logging.debug('Host found by displayname') # Used the host information to grab the collector description # if not provided - if (not hasattr(self.params, "collector") and - "agentDescription" in info): - logging.debug("Setting collector from host response. " + - "Collector " + info["agentDescription"]) - self.params["collector"] = info["agentDescription"] + if (not hasattr(self.params, 'collector') and + 'agentDescription' in info): + logging.debug('Setting collector from host response. ' + + 'Collector ' + info['agentDescription']) + self.params['collector'] = info['agentDescription'] else: - logging.debug("Host not found by displayname") + logging.debug('Host not found by displayname') # At this point, a valid collector description is required for success # Check that the description exists or fail - if self.params["collector"]: - logging.debug("Collector specified is " + - self.params["collector"]) + if self.params['collector']: + logging.debug('Collector specified is ' + + self.params['collector']) self.collector = (self.get_collector_by_description( - self.params["collector"])) + self.params['collector'])) else: - self.fail(msg="No collector specified.") + self.fail(msg='No collector specified.') # If the host wasn't found via displayname, attempt by hostname if info is None: - logging.debug("Attempting to find host by hostname " + + logging.debug('Attempting to find host by hostname ' + self.hostname) info = self.get_host_by_hostname(self.hostname, self.collector) self.info = info - self.properties = self.params["properties"] - self.description = self.params["description"] - self.starttime = self.params["starttime"] - self.duration = self.params["duration"] - self.alertenable = self.params["alertenable"] - if self.params["groups"] is not None: - self.groups = self._strip_groups(self.params["groups"]) + self.properties = self.params['properties'] + self.description = self.params['description'] + self.starttime = self.params['starttime'] + self.duration = self.params['duration'] + self.alertenable = self.params['alertenable'] + if self.params['groups'] is not None: + self.groups = self._strip_groups(self.params['groups']) else: self.groups = None def create(self): - """Idemopotent function to create if missing, - update if changed, or skip""" - logging.debug("Running Host.create...") + '''Idemopotent function to create if missing, + update if changed, or skip''' + logging.debug('Running Host.create...') self.update() def get_properties(self): - """Returns a hash of the properties - associated with this LogicMonitor host""" - logging.debug("Running Host.get_properties...") + '''Returns a hash of the properties + associated with this LogicMonitor host''' + logging.debug('Running Host.get_properties...') if self.info: - logging.debug("Making RPC call to 'getHostProperties'") - properties_json = (json.loads(self.rpc("getHostProperties", - {'hostId': self.info["id"], - "filterSystemProperties": True}))) - - if properties_json["status"] == 200: - logging.debug("RPC call succeeded") - return properties_json["data"] + 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('API call succeeded') + return properties_json['data'] else: - logging.debug("Error: there was an issue retrieving the " + - "host properties") - logging.debug(properties_json["errmsg"]) + logging.debug('Error: there was an issue retrieving the ' + + 'host properties') + logging.debug(properties_json['errmsg']) - self.fail(msg=properties_json["status"]) + self.fail(msg=properties_json['status']) else: - logging.debug("Unable to find LogicMonitor host which " + - "matches " + self.displayname + - " (" + self.hostname + ")") + logging.debug('Unable to find LogicMonitor host which ' + + 'matches ' + self.displayname + + ' (' + self.hostname + ')') return None def set_properties(self, propertyhash): - """update the host to have the properties - contained in the property hash""" - logging.debug("Running Host.set_properties...") - logging.debug("System changed") + '''update the host to have the properties + contained in the property hash''' + logging.debug('Running Host.set_properties...') + logging.debug('System changed') self.change = True if self.check_mode: self.exit(changed=True) - logging.debug("Assigning property hash to host object") + logging.debug('Assigning property hash to host object') self.properties = propertyhash def add(self): - """Add this device to monitoring - in your LogicMonitor account""" - logging.debug("Running Host.add...") + '''Add this device to monitoring + in your LogicMonitor account''' + logging.debug('Running Host.add...') if self.collector and not self.info: - logging.debug("Host not registered. Registering.") - logging.debug("System changed") + logging.debug('Host not registered. Registering.') + logging.debug('System changed') self.change = True if self.check_mode: @@ -144,31 +145,31 @@ 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") - return resp["data"] + if resp['status'] == 200: + 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"] + return resp['errmsg'] elif self.collector is None: - self.fail(msg="Specified collector doesn't exist") + self.fail(msg='Specified collector does not exist') else: - logging.debug("Host already registered") + logging.debug('Host already registered') def update(self): - """This method takes changes made to this host + '''This method takes changes made to this host and applies them to the corresponding host - in your LogicMonitor account.""" - logging.debug("Running Host.update...") + in your LogicMonitor account.''' + logging.debug('Running Host.update...') if self.info: - logging.debug("Host already registed") + logging.debug('Host already registed') if self.is_changed(): - logging.debug("System changed") + logging.debug('System changed') self.change = True if self.check_mode: @@ -182,24 +183,24 @@ def update(self): self.groups, self.properties, self.alertenable)) - h["id"] = self.info["id"] - h["opType"] = "replace" + 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") + if resp['status'] == 200: + logging.debug('API call succeeded') else: - logging.debug("RPC call failed") - self.fail(msg="Error: unable to update the host.") + logging.debug('API call failed') + self.fail(msg='Error: unable to update the host.') else: - logging.debug("Host properties match supplied properties. " + - "No changes to make.") + logging.debug('Host properties match supplied properties. ' + + 'No changes to make.') return self.info else: - logging.debug("Host not registed. Registering") - logging.debug("System changed") + logging.debug('Host not registed. Registering') + logging.debug('System changed') self.change = True if self.check_mode: @@ -208,39 +209,39 @@ def update(self): return self.add() def remove(self): - """Remove this host from your LogicMonitor account""" - logging.debug("Running Host.remove...") + '''Remove this host from your LogicMonitor account''' + logging.debug('Running Host.remove...') if self.info: - logging.debug("Host registered") - logging.debug("System changed") + logging.debug('Host registered') + logging.debug('System changed') self.change = True if self.check_mode: self.exit(changed=True) - logging.debug("Making RPC call to 'deleteHost'") - resp = json.loads(self.rpc("deleteHost", - {"hostId": self.info["id"], - "deleteFromSystem": True, - "hostGroupId": 1})) + 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: + 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"]) + self.fail(msg=resp['errmsg']) else: - logging.debug("Host not registered") + logging.debug('Host not registered') def is_changed(self): - """Return true if the host doesn't - match the LogicMonitor account""" - logging.debug("Running Host.is_changed") + '''Return true if the host doesn't + match the LogicMonitor account''' + logging.debug('Running Host.is_changed') ignore = ['system.categories', 'snmp.version'] @@ -250,46 +251,46 @@ def is_changed(self): hostresp = self.get_host_by_hostname(self.hostname, self.collector) if hostresp: - logging.debug("Comparing simple host properties") - if hostresp["alertEnable"] != self.alertenable: + logging.debug('Comparing simple host properties') + if hostresp['alertEnable'] != self.alertenable: return True - if hostresp["description"] != self.description: + if hostresp['description'] != self.description: return True - if hostresp["displayedAs"] != self.displayname: + if hostresp['displayedAs'] != self.displayname: return True if (self.collector and - hasattr(self.collector, "id") and - hostresp["agentId"] != self.collector["id"]): + hasattr(self.collector, 'id') and + hostresp['agentId'] != self.collector['id']): return True - logging.debug("Comparing groups.") + logging.debug('Comparing groups.') if self._compare_groups(hostresp) is True: return True propresp = self.get_properties() if propresp: - logging.debug("Comparing properties.") + logging.debug('Comparing properties.') if self._compare_props(propresp, ignore) is True: return True else: self.fail( - msg="Error: Unknown error retrieving host properties") + msg='Error: Unknown error retrieving host properties') return False else: - self.fail(msg="Error: Unknown error retrieving host information") + self.fail(msg='Error: Unknown error retrieving host information') def sdt(self): - """Create a scheduled down time - (maintenance window) for this host""" - logging.debug("Running Host.sdt...") + '''Create a scheduled down time + (maintenance window) for this host''' + logging.debug('Running Host.sdt...') if self.info: - logging.debug("System changed") + logging.debug('System changed') self.change = True if self.check_mode: @@ -300,64 +301,64 @@ def sdt(self): offset = starttime if starttime: - logging.debug("Start time specified") + logging.debug('Start time specified') start = datetime.strptime(starttime, '%Y-%m-%d %H:%M') offsetstart = start else: - logging.debug("No start time specified. Using default.") + logging.debug('No start time specified. Using default.') 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") + if accountresp['status'] == 200: + logging.debug('API call succeeded') - offset = accountresp["data"]["offset"] + offset = accountresp['data']['offset'] offsetstart = start + timedelta(0, offset) else: self.fail( - msg="Error: Unable to retrieve timezone offset") + msg='Error: Unable to retrieve timezone offset') offsetend = offsetstart + timedelta(0, int(duration)*60) - h = {"hostId": self.info["id"], - "type": 1, - "year": offsetstart.year, - "month": offsetstart.month - 1, - "day": offsetstart.day, - "hour": offsetstart.hour, - "minute": offsetstart.minute, - "endYear": offsetend.year, - "endMonth": offsetend.month - 1, - "endDay": offsetend.day, - "endHour": offsetend.hour, - "endMinute": offsetend.minute} - - logging.debug("Making RPC call to 'setHostSDT'") - resp = (json.loads(self.rpc("setHostSDT", h))) - - if resp["status"] == 200: - logging.debug("RPC call succeeded") - return resp["data"] + h = {'hostId': self.info['id'], + 'type': 1, + 'year': offsetstart.year, + 'month': offsetstart.month - 1, + 'day': offsetstart.day, + 'hour': offsetstart.hour, + 'minute': offsetstart.minute, + 'endYear': offsetend.year, + 'endMonth': offsetend.month - 1, + 'endDay': offsetend.day, + 'endHour': offsetend.hour, + 'endMinute': offsetend.minute} + + logging.debug('Making API call to setHostSDT') + resp = (json.loads(self.api('setHostSDT', h))) + + if resp['status'] == 200: + logging.debug('API call succeeded') + return resp['data'] else: - logging.debug("RPC call failed") - self.fail(msg=resp["errmsg"]) + logging.debug('API call failed') + self.fail(msg=resp['errmsg']) else: - self.fail(msg="Error: Host doesn't exit.") + self.fail(msg='Error: Host does not exit.') def site_facts(self): - """Output current properties information for the Host""" - logging.debug("Running Host.site_facts...") + '''Output current properties information for the Host''' + logging.debug('Running Host.site_facts...') if self.info: - logging.debug("Host exists") + logging.debug('Host exists') props = self.get_properties() self.output_info(props) else: - self.fail(msg="Error: Host doesn't exit.") + self.fail(msg='Error: Host does not exit.') def _build_host_hash(self, hostname, @@ -367,139 +368,139 @@ def _build_host_hash(self, groups, properties, alertenable): - """Return a property formated hash for the - creation of a host using the rpc function""" - logging.debug("Running Host._build_host_hash...") + '''Return a property formated hash for the + creation of a host using the rpc function''' + logging.debug('Running Host._build_host_hash...') h = {} - h["hostName"] = hostname - h["displayedAs"] = displayname - h["alertEnable"] = alertenable + h['hostName'] = hostname + h['displayedAs'] = displayname + h['alertEnable'] = alertenable if collector: - logging.debug("Collector property exists") - h["agentId"] = collector["id"] + logging.debug('Collector property exists') + h['agentId'] = collector['id'] else: self.fail( - msg="Error: No collector found. Unable to build host hash.") + msg='Error: No collector found. Unable to build host hash.') if description: - h["description"] = description + h['description'] = description if groups is not None and groups is not []: - logging.debug("Group property exists") - groupids = "" + logging.debug('Group property exists') + groupids = '' for group in groups: - groupids = groupids + str(self.create_group(group)) + "," + groupids = groupids + str(self.create_group(group)) + ',' - h["hostGroupIds"] = groupids.rstrip(',') + h['hostGroupIds'] = groupids.rstrip(',') if properties is not None and properties is not {}: - logging.debug("Properties hash exists") + logging.debug('Properties hash exists') propnum = 0 for key, value in properties.iteritems(): - h["propName" + str(propnum)] = key - h["propValue" + str(propnum)] = value + h['propName' + str(propnum)] = key + h['propValue' + str(propnum)] = value propnum = propnum + 1 return h def _verify_property(self, propname): - """Check with LogicMonitor server to - verify property is unchanged""" - logging.debug("Running Host._verify_property...") + '''Check with LogicMonitor server to + verify property is unchanged''' + logging.debug('Running Host._verify_property...') if self.info: - logging.debug("Host is registered") + logging.debug('Host is registered') if propname not in self.properties: - logging.debug("Property " + propname + " does not exist") + logging.debug('Property ' + propname + ' does not exist') return False else: - logging.debug("Property " + propname + " exists") - h = {"hostId": self.info["id"], - "propName0": propname, - "propValue0": self.properties[propname]} + logging.debug('Property ' + propname + ' exists') + h = {'hostId': self.info['id'], + 'propName0': propname, + 'propValue0': self.properties[propname]} - logging.debug("Making RCP call to 'verifyProperties'") - resp = json.loads(self.rpc('verifyProperties', h)) + logging.debug('Making RCP call to verifyProperties') + resp = json.loads(self.api('verifyProperties', h)) - if resp["status"] == 200: - logging.debug("RPC call succeeded") - return resp["data"]["match"] + if resp['status'] == 200: + logging.debug('API call succeeded') + return resp['data']['match'] else: self.fail( - msg="Error: unable to get verification " + - "from server.\n%s" % resp["errmsg"]) + msg='Error: unable to get verification ' + + 'from server.\n%s' % resp['errmsg']) else: self.fail( - msg="Error: Host doesn't exist. Unable to verify properties") + msg='Error: Host does not exist. Unable to verify properties') def _compare_groups(self, hostresp): - """Function to compare the host's current - groups against provided groups""" - logging.debug("Running Host._compare_groups") + '''Function to compare the host's current + groups against provided groups''' + logging.debug('Running Host._compare_groups') g = [] - fullpathinids = hostresp["fullPathInIds"] - logging.debug("Building list of groups") + fullpathinids = hostresp['fullPathInIds'] + logging.debug('Building list of groups') for path in fullpathinids: 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"] == ""): + if (hgresp['status'] == 200 and + hgresp['data']['appliesTo'] == ''): g.append(path[-1]) if self.groups is not None: - logging.debug("Comparing group lists") + logging.debug('Comparing group lists') for group in self.groups: groupjson = self.get_group(group) if groupjson is None: - logging.debug("Group mismatch. No result.") + logging.debug('Group mismatch. No result.') return True elif groupjson['id'] not in g: - logging.debug("Group mismatch. ID doesn't exist.") + logging.debug('Group mismatch. ID does not exist.') return True else: g.remove(groupjson['id']) if g != []: - logging.debug("Group mismatch. New ID exists.") + logging.debug('Group mismatch. New ID exists.') return True - logging.debug("Groups match") + logging.debug('Groups match') def _compare_props(self, propresp, ignore): - """Function to compare the host's current - properties against provided properties""" - logging.debug("Running Host._compare_props...") + '''Function to compare the host's current + properties against provided properties''' + logging.debug('Running Host._compare_props...') p = {} - logging.debug("Creating list of properties") + logging.debug('Creating list of properties') for prop in propresp: - if prop["name"] not in ignore: - if ("*******" in prop["value"] and - self._verify_property(prop["name"])): - p[prop["name"]] = self.properties[prop["name"]] + if prop['name'] not in ignore: + if ('*******' in prop['value'] and + self._verify_property(prop['name'])): + p[prop['name']] = self.properties[prop['name']] else: - p[prop["name"]] = prop["value"] + p[prop['name']] = prop['value'] - logging.debug("Comparing properties") + logging.debug('Comparing properties') # Iterate provided properties and compare to received properties for prop in self.properties: if (prop not in p or p[prop] != self.properties[prop]): - logging.debug("Properties mismatch") + logging.debug('Properties mismatch') return True - logging.debug("Properties match") + logging.debug('Properties match') def _strip_groups(self, groups): - """Function to strip whitespace from group list. + '''Function to strip whitespace from group list. This function provides the user some flexibility when - formatting group arguments """ - logging.debug("Running Host._strip_groups...") + formatting group arguments ''' + logging.debug('Running Host._strip_groups...') return map(lambda x: x.strip(), groups) 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..ffd608b 100755 --- a/logicmonitor_core/LogicMonitor.py +++ b/logicmonitor_core/LogicMonitor.py @@ -1,29 +1,36 @@ #!/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 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.user = params["user"] - self.password = params["password"] 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 +63,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 @@ -76,7 +83,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 + @@ -86,17 +94,89 @@ def do(self, action, params): logging.debug("Error opening URL. " + ioe) self.fail("Unknown exception opening URL") + 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) + + # convert data to json + if data is not None: + data = json.dumps(data) + try: + url = ('https://' + self.company + '.' + self.lm_url + + '/rest' + path) + + 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) + 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) + else: + self.fail('Invalid method ' + method + 'specified') + + if resp.status_code != 200: + 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: + logging.error('Error making API request: ' + e.message) + return None + + def get_auth_header(self, path, method, data): + '''Construct an REST API authentication header''' + 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') + + 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 + digest = hmac.new(self.accesskey, + msg=msg, + digestmod=hashlib.sha256).hexdigest() + signature = base64.b64encode(digest) + + # construct header + auth = ('LMv1 ' + self.accessid + ':' + signature + ':' + epoch) + + return auth + def get_collectors(self): """Returns a JSON object containing a list of 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 +187,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 +209,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 +221,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 +254,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 +270,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 +325,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"]) 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 \