Question

Hi

I want to create device group named as "Fileserver" in /device/servers
This is the first time I am running the script, so could you please check if my script is ok.

Also
please let me know how I run this script. I am sharing the script with you.

 

 

#!/bin/env python

import requests
import json
import hashlib
import base64
import time
import hmac

#Account Info
AccessId ='TBA'
AccessKey ='TBA'
Company = 'contoso'

#Request Info
httpVerb ='POST'
resourcePath = '/device/servers'
data = '{"name":"Fileserver"}'

#Construct URL 
url = 'https://'+ Company +'.logicmonitor.com/santaba/rest' + resourcePath 

#Get current time in milliseconds
epoch = str(int(time.time() * 1000))

#Concatenate Request details
requestVars = httpVerb + epoch + data + resourcePath

#Construct signature
signature = base64.b64encode(hmac.new(AccessKey,msg=requestVars,digestmod=hashlib.sha256).hexdigest())

#Construct headers
auth = 'LMv1 ' + AccessId + ':' + signature + ':' + epoch
headers = {'Content-Type':'application/json','Authorization':auth}

#Make request
response = requests.post(url, data=data, headers=headers)

#Print status and body of response
print 'Response Status:',response.status_code
print 'Response Body:',response.content

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 0

@Tanvir the resource path should be '/device/groups', and you should add an item to the data payload 'parentId' set to the id of the servers group. This will ensure that the new Fileserver group gets added underneath the servers group.

https://www.logicmonitor.com/support/rest-api-developers-guide/device-groups/add-a-device-group/

Share this post


Link to post
Share on other sites
  • 0

Thanks Sarah, Script has been corrected as advised.  

Now if I run the script I receive  the following error

>>> signature = base64.b64encode(hmac.new(AccessKey,msg=requestVars,digestmod=hashlib.sha256).hexdigest())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\00098685\AppData\Local\Programs\Python\Python36-32\lib\hmac.py", line 144, in new
    return HMAC(key, msg, digestmod)
  File "C:\Users\00098685\AppData\Local\Programs\Python\Python36-32\lib\hmac.py", line 42, in __init__
    raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
TypeError: key: expected bytes or bytearray, but got 'str'

Share this post


Link to post
Share on other sites
  • 0

Issue has been resolved for the error, I had to change the script for version 3.5. Original script is for Python 2.7

#Construct signature
hmac = hmac.new(AccessKey.encode(),msg=requestVars.encode(),digestmod=hashlib.sha256).hexdigest()
signature = base64.b64encode(hmac.encode())

#Construct headers
auth = 'LMv1 ' + AccessId + ':' + signature.decode() + ':' + epoch
headers = {'Content-Type':'application/json','Authorization':auth}

Share this post


Link to post
Share on other sites
  • 0

I want to create device groups which should read lines from text file and create a device group

Text file entries like as follows:

'{"name":"460-UNIVERSITY HALL - SIR GEORGE CURRIE HALL","parentId":150}'
'{"name":"452-AFTER SCHOOL CARE CENTRE (18 PARKWAY)","parentId":150}'
'{"name":"453-INDIAN OCEAN MARINE RESEARCH CENTRE (IOMRC)","parentId":150}'

 

In the code If insert

        data = '{"name":"463-UNIVERSITY HALL - B HOUSE","parentId":150}' # works

but If I insert  (where line is one line from the txt file)
        data = line    # does not work

Code details:

#!/bin/env python

import requests
import json
import hashlib
import base64
import time
import hmac

#Account Info
AccessId ='XXXXX'
AccessKey ='YYYYY'
Company = 'contoso'

#Open the txt file
with open('build.txt') as f:
    for line in f:
		#Request Info
		httpVerb ='POST'
		resourcePath = '/device/groups'
		#data = '{"name":"463-UNIVERSITY HALL - B HOUSE","parentId":150}' # works
		data = line    # does not work

		#Construct URL 
		url = 'https://'+ Company +'.logicmonitor.com/santaba/rest' + resourcePath 

		#Get current time in milliseconds
		epoch = str(int(time.time() * 1000))

		#Concatenate Request details
		requestVars = httpVerb + epoch + data + resourcePath

		#Construct signature
		#signature = base64.b64encode(hmac.new(AccessKey,msg=requestVars,digestmod=hashlib.sha256).hexdigest())
		hmac = hmac.new(AccessKey.encode(),msg=requestVars.encode(),digestmod=hashlib.sha256).hexdigest()
		signature = base64.b64encode(hmac.encode())

		#Construct headers
		#auth = 'LMv1 ' + AccessId + ':' + signature + ':' + epoch
		#headers = {'Content-Type':'application/json','Authorization':auth}
		auth = 'LMv1 ' + AccessId + ':' + signature.decode() + ':' + epoch
		headers = {'Content-Type':'application/json','Authorization':auth}

		#Make request
		response = requests.post(url, data=data, headers=headers)

 

Share this post


Link to post
Share on other sites
  • 0
14 hours ago, Tanvir said:

Text file entries like as follows:

'{"name":"460-UNIVERSITY HALL - SIR GEORGE CURRIE HALL","parentId":150}'
'{"name":"452-AFTER SCHOOL CARE CENTRE (18 PARKWAY)","parentId":150}'
'{"name":"453-INDIAN OCEAN MARINE RESEARCH CENTRE (IOMRC)","parentId":150}'

 

When Python iterates through your text file, it interprets each line of the file as a literal string. With each line, all characters are being assigned to the line variable, including the single quote characters. The extra single quotes are being escaped so what you are sending to LogicMonitor is just a plain ol' string data it can't interpret instead of a formatted JSON string.

For Example, with the given script snippet

data = '{"name":"463-UNIVERSITY HALL - B HOUSE","parentId":150}'
build_data = [] #create empty list
with open('c:\\test\\build.txt') as f:
    for line in f:
        build_data.append(line)

... the console output would look like this:

>>> data
{"name":"463-UNIVERSITY HALL - B HOUSE","parentId":150}
>>> build_data[0] #output first element in the list
'\'{"name":"460-UNIVERSITY HALL - SIR GEORGE CURRIE HALL","parentId":150}\'\n'

 

TL; DR

Your build.txt needs to look like this in Notepad / your favorite text editor---

{"name":"460-UNIVERSITY HALL - SIR GEORGE CURRIE HALL","parentId":150}
{"name":"452-AFTER SCHOOL CARE CENTRE (18 PARKWAY)","parentId":150}
{"name":"453-INDIAN OCEAN MARINE RESEARCH CENTRE (IOMRC)","parentId":150}

 

Share this post


Link to post
Share on other sites
  • 0

Many many thanks Joe.  

But now I am having different problem. it creates one group and shows following error.

for example it created A22-17 CAPORN STREET group but error appeared during A23-19 CAPORN STREET group creation and script terminated.

c:\temp>python cg-csv.py
{"name":"A22-17 CAPORN STREET","parentId":150}
{"name":"A23-19 CAPORN STREET","parentId":150}
Traceback (most recent call last):
  File "cg-csv.py", line 86, in <module>
    hmac = hmac.new(AccessKey.encode(),msg=requestVars.encode(),digestmod=hashlib.sha256).hexdigest()
AttributeError: 'str' object has no attribute 'new'

 

Script I am running

import csv
import requests
import json
import hashlib
import base64
import time
import hmac



build_data = ['{"name":"A22-17 CAPORN STREET","parentId":150}',
 '{"name":"A23-19 CAPORN STREET","parentId":150}',
 '{"name":"A24-21 CAPORN STREET","parentId":150}',
 '{"name":"A25-23 CAPORN STREET","parentId":150}',
 '{"name":"A26-25A CAPORN STREET","parentId":150}',
 '{"name":"A28-30 CAPORN STREET","parentId":150}',
 '{"name":"A29-1/32-38 CAPORN STREET","parentId":150}',
 '{"name":"A30-33 CAPORN STREET","parentId":150}',
 '{"name":"A31-35 CAPORN STREET","parentId":150}',
 '{"name":"A32-37 CAPORN STREET","parentId":150}',
 '{"name":"A33-12 COOK STREET","parentId":150}',
 '{"name":"A34-13A COOK STREET (Vacant Land)","parentId":150}',
 '{"name":"A35-1/21A COOK STREET","parentId":150}',
 '{"name":"A36-23 COOK STREET","parentId":150}',
 '{"name":"A37-37 MYERS STREET","parentId":150}',
 '{"name":"A37-28 COOK STREET","parentId":150}',
 '{"name":"A38-29 COOK STREET (Vacant Land)","parentId":150}',
 '{"name":"A39-1/33 COOK STREET","parentId":150}',
 '{"name":"A40-1/36 COOK STREET","parentId":150}',
 '{"name":"A41-12 EVERETT STREET","parentId":150}',
 '{"name":"A42-1/13 EVERETT STREET","parentId":150}',
 '{"name":"A43-1/14-16 EVERETT STREET","parentId":150}',
 '{"name":"A44-15 EVERETT STREET","parentId":150}',
 '{"name":"A45-18 EVERETT STREET","parentId":150}',
 '{"name":"A46-19 EVERETT STREET","parentId":150}',
 '{"name":"A47-20 EVERETT STREET","parentId":150}',
 '{"name":"A48-21 EVERETT STREET","parentId":150}',
 '{"name":"A49-22 EVERETT STREET","parentId":150}',
 '{"name":"A50-26 EVERETT STREET","parentId":150}',
 '{"name":"A51-28 EVERETT STREET","parentId":150}',
 '{"name":"A52-30 EVERETT STREET","parentId":150}',
 '{"name":"A53-39 EVERETT STREET","parentId":150}',
 '{"name":"A54-1/116 FAIRWAY","parentId":150}',
 '{"name":"A55-1/13 MYERS STREET","parentId":150}',
 '{"name":"A56-1/15 MYERS STREET","parentId":150}',
 '{"name":"A57-1/17 MYERS STREET","parentId":150}',
 '{"name":"A58-19 MYERS STREET","parentId":150}',
 '{"name":"A59-1/21 MYERS STREET","parentId":150}',
 '{"name":"A60-1/23 MYERS STREET","parentId":150}',
 '{"name":"A61-25 MYERS STREET","parentId":150}',
 '{"name":"A62-27A MYERS STREET","parentId":150}',
 '{"name":"A63-29 MYERS STREET","parentId":150}',
 '{"name":"A64-31 MYERS STREET","parentId":150}',
 '{"name":"A65-33 MYERS STREET","parentId":150}',
 '{"name":"A66-35 MYERS STREET","parentId":150}',
 '{"name":"A69-11 PARKWAY","parentId":150}'
]

#Account Info
AccessId ='XXXXXX'
AccessKey ='YYYYYYYY'
Company = 'contoso'		
#Request Info
httpVerb ='POST'
resourcePath = '/device/groups'

l=len(build_data)

for i in range (0, l):
	print (build_data[i])
	
	
	data = build_data[i]

	#Construct URL 
	url = 'https://'+ Company +'.logicmonitor.com/santaba/rest' + resourcePath 

	#Get current time in milliseconds
	epoch = str(int(time.time() * 1000))

	#Concatenate Request details
	requestVars = httpVerb + epoch + data + resourcePath

	#Construct signature
	#signature = base64.b64encode(hmac.new(AccessKey,msg=requestVars,digestmod=hashlib.sha256).hexdigest())
	hmac = hmac.new(AccessKey.encode(),msg=requestVars.encode(),digestmod=hashlib.sha256).hexdigest()
	signature = base64.b64encode(hmac.encode())

	#Construct headers
	#auth = 'LMv1 ' + AccessId + ':' + signature + ':' + epoch
	#headers = {'Content-Type':'application/json','Authorization':auth}
	auth = 'LMv1 ' + AccessId + ':' + signature.decode() + ':' + epoch
	headers = {'Content-Type':'application/json','Authorization':auth}

	#Make request
	response = requests.post(url, data=data, headers=headers)

	#Print status and body of response
	#print 'Response Status:',response.status_code
	#print 'Response Body:',response.content

 

Share this post


Link to post
Share on other sites
  • 0

Has been resolved once I change the code for signature.

hmac1 = hmac.new(AccessKey.encode(),msg=requestVars.encode(),digestmod=hashlib.sha256).hexdigest()
signature = base64.b64encode(hmac1.encode())

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now