debashree Bhadra
asked on
Python script to read and display all the oracle interim patches in a Oracle ci attribute in HP uCMDB tool
Hi Experts,
I am trying to read the all interim patches from oracle server using Opatch and then capture only the parent patch numbers fro command output and display in oracle ci attribute discovered in UCMDB(universal configuration management database)
The opatch command i am using is :
su oracle -c '/ora01/app/oracle/product /11.2.0/db home_1/OPa tch/opatch lsinventory'.
I need the python/jython code to read the patch numbers from command output.
Appreciate your help!
I am trying to read the all interim patches from oracle server using Opatch and then capture only the parent patch numbers fro command output and display in oracle ci attribute discovered in UCMDB(universal configuration management database)
The opatch command i am using is :
su oracle -c '/ora01/app/oracle/product
I need the python/jython code to read the patch numbers from command output.
Appreciate your help!
If what you are trying to do is run a shell command from python, you could try using the subprocess module. Below is a snippet taken from something I had done a while back, so may not be entirely suitable for you, but it's just an example of the syntax. More on the python docs page:
https://docs.python.org/2/library/subprocess.html
https://docs.python.org/2/library/subprocess.html
import subprocess
p = subprocess.Popen(["su", "oracle", "-c", "/ora01/app/oracle/product/11.2.0/dbhome_1/OPatch/opatch lsinventory" ],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
for line in p.stdout.readlines():
print line
ASKER
Hi Walter/Kyle,
Attached is the script TTY_HR_Main is being used for discovery.
The method name discoverOraclePatch and oraclePatch is being used which is returnig patch ID. Instead of ID i need to display all interim patch numbers with comma seperation.
Let me know if you can help me to modify the method.
I am also attachig a sample opatch uotput from one of my servers.
tty_hr_main.txt
patch.txt
Attached is the script TTY_HR_Main is being used for discovery.
The method name discoverOraclePatch and oraclePatch is being used which is returnig patch ID. Instead of ID i need to display all interim patch numbers with comma seperation.
Let me know if you can help me to modify the method.
I am also attachig a sample opatch uotput from one of my servers.
tty_hr_main.txt
patch.txt
sorry debashree, I'm not familiar with that tool. I thought you just wanted access to he command line from python.
ASKER
I experts,
I have used the following RegEx and its returning the first patch number but not the susequent ones.
pattern = re.compile(ur'Patch (.*\n?): applied on')
This gives me the patch number 19769496 . i have to display 13348650 as well. (efer the file attached before patch.txt)
I have used the following RegEx and its returning the first patch number but not the susequent ones.
pattern = re.compile(ur'Patch (.*\n?): applied on')
This gives me the patch number 19769496 . i have to display 13348650 as well. (efer the file attached before patch.txt)
ASKER
Hi Kyle.
I am looking for the correct RegEx to get the patch numbers. I know where to put this in tool.
I am getting the fist patch number from RegEx mentoned before but i have to modify this to get all the parent patch number.
Thanks
Debashree
I am looking for the correct RegEx to get the patch numbers. I know where to put this in tool.
I am getting the fist patch number from RegEx mentoned before but i have to modify this to get all the parent patch number.
Thanks
Debashree
Assuming that 'output' variable is the content of patch.txt, you could do:
will print each of the two numbers
19769496
13348650
you can replace the print statement with whatever you want there, append to list, or whatever...
import re
regex = re.compile(ur'Patch (.*\n?): applied on')
it = re.finditer(regex, output)
for match in it:
print match.group(1)
will print each of the two numbers
19769496
13348650
you can replace the print statement with whatever you want there, append to list, or whatever...
ASKER
Hi Kyle,
I have included you code like this:
pattern = re.compile(ur'Patch (.*\n?): applied on')
it= re.finditer(pattern, output)
for match in it:
match = pattern.search(output)
if match:
logger.debug('===setting patch value: ',match.group(1))
oracle_osh.setAttribute("p atch", match.group(1))
but it's not working. It display only the first patch number 19769496 . also i have to display the patch numbers with a comma seperator like 19769496, 13348650
I have included you code like this:
pattern = re.compile(ur'Patch (.*\n?): applied on')
it= re.finditer(pattern, output)
for match in it:
match = pattern.search(output)
if match:
logger.debug('===setting patch value: ',match.group(1))
oracle_osh.setAttribute("p
but it's not working. It display only the first patch number 19769496 . also i have to display the patch numbers with a comma seperator like 19769496, 13348650
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Hi Kyle,
I did this to get all the patches and its working fine.
Thanks a lot for your help!!
I did this to get all the patches and its working fine.
Thanks a lot for your help!!
cmd = "su - oracle -c '"+oraclehome+"/OPatch/opatch lsinventory -local'"
logger.debug("try command: ", cmd)
try:
output = shell.execCmd(cmd, 30000)
pattern = re.compile(ur'Patch(.*\n?): applied on')
match = pattern.findall(output)
if match:
patchs = ''
for item in match:
patchs = patchs + item.strip() + ","
logger.debug('===setting patch value: ', patchs)
oracle_osh.setAttribute("patch", patchs)
else:
logger.debug("no patch discoverd for command:", cmd)
Glad it's working for you.
You're doing string manipulation in the loop which isn't a great pattern. I'm only saying it so you are aware of it. If the number of patches is small, and your overall data size is small, this will not have too much of a negative impact. However, if you were to scale this, you would be better off storing the ids in a list like I had shown, and only creating the final string after the loop. There may be even more efficient ways of doing it too, but like I said, so long as your data is small, it's not too big a deal.
You're doing string manipulation in the loop which isn't a great pattern. I'm only saying it so you are aware of it. If the number of patches is small, and your overall data size is small, this will not have too much of a negative impact. However, if you were to scale this, you would be better off storing the ids in a list like I had shown, and only creating the final string after the loop. There may be even more efficient ways of doing it too, but like I said, so long as your data is small, it's not too big a deal.
I am suggesting to mark this as best solution since the asker gave it a thumbs up. Perhaps he did not know to mark it a solution.
Att,
Walter.