Forum Discussion

Tanvir's avatar
7 years ago

API/Script

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

7 Replies

Replies have been turned off for this discussion
  • 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())

  • 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)
    	
    	
    	data = build_data
    
    	#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
    
    

     

  • 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}

     

  • 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)

     

  • 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}

  • 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'