Shane Scott [http://community.zenoss.org/people/hackman238] created the discussion
"Re: Stale deviceSearch record:"
To view the discussion, visit: http://community.zenoss.org/message/65957#65957
--------------------------------------------------------------
dpetzel:
Lets try my catalog cleaning script (indicator class required for progress bar):
indicator.py {
#!/usr/bin/env python
import sys,os
class PB:
   def __init__(self, mV = 0, MV = 100, w=77,**kwargs):
       self.c = kwargs.get('c', '#')
       self.b = ''
       self.mV = mV
       self.MV = MV
       self.s = MV - mV
       self.w = w
       self.a = 0
       self.uPa(0)
   def iNa(self, add_a = 1):
       nN = self.a + add_a
       if nN < self.mV: nN = self.mV
       if nN > self.MV: nN = self.MV
       self.a = nN
       self.bDb()
   def uPa(self, nN = None):
       if not nN: nN = self.a
       if nN < self.mV: nN = self.mV
       if nN > self.MV: nN = self.MV
       self.a = nN
       self.bDb()
   def bDb(self):
       d = float(self.a - self.mV)
       pD = int(round((d / float(self.s)) * 100.0))
       aF = self.w - 2
       nH = int(round((pD * aF) / 100))
       self.b = self.c * nH + ' ' * (aF-nH)
       pSrg = str(pD) + "%"
       self.b = '[ ' + self.b + ' ] ' + pSrg
   def __str__(self):
       return str(self.b)
}
clean_up_components.py {
#!/usr/bin/env python
from optparse import OptionParser
import types
import sys
import time
import os
import datetime
import smtplib
try:
  from indicator import PB
except:
  print 'Cannot find indicator.py'
  sys.exit(1)
try:
  import Globals
  from Products.ZenUtils.ZenScriptBase import ZenScriptBase
  from transaction import commit
  from Products.ZenUtils import Time
except:
   print 'Cannot find Zenoss python includes! Cannot continue.'
   sys.exit(1)
aBt='''......................................:oCCCCCCCoc:....................................................................................................
...................................coCCCCCCCc:........................................................................................................
...............................coCCCCCCo:.................................:c:.........................................................................
....coooc:..................:oCCCCCCc:.............o...c:..:c............cCCCo:...........................:coooo......................................
...:OCCCCO..................oCCCCoc................8:.:8C..CC............:oCCCCc..........................OOCCCCo.....................................
...co...:c...Oc...cO....OC. .c8o...O:..OOOOOc......Oo.oO8.:8:.Oc..O.....cO.:CCCOO....OC..::Oo....Oc.......Oo...::...OOOOO:.:OOOOOo.COOOOOCCOOOOO:.....
...:88888O...Oo:::oO...o:CC...OOO..O:..O...........o8:8:OCCC..Oc..O.....cO...CCO8...oCOOCCoOCc..OOc.......C88888o..:o...o:.cc...oO....O.....cO........
....:cccc8:..OOOOOOO..:O.:8...O.CO:O:..8OOC.........8oC.oOOc..Oc..O.....cO...:oCO...OCC8OCcO:8:CoOc........:ccccC..:o......cc...cO....O.....cO........
...c:...:8:..Oc...cO..COOOOc..O..o88:..O............COc..OO...Oc..O.....cO.....cO..C8OO8OC:O:oOC.Oc.......o:...:C..:o...C:.cc...cO....O.....cO........
...oOOOOO8:..Oc...cO.:8CCCCO..O...c8:..Ooooo:.......c8...Co...Oc..Ooooo.cOoooc.cO.:8CCCC8o.O:.o..Oc.......8OOOOOC..:OoCoOc.cCCooCO....O.....cO........
...................:CCCCCCo........................................................CCCCCC.............................................................
..................oCCCCCo:........................................................oCCCCCc. ...........................................................
.................cCCCCCCc.........................................................oCCCCCc.............................................................
Shane William Scott'''
lU = '04062011'
dFeIn = 1
dFeInN = -1
dFvLd = True
dFIvLd = False
dFsvLd = str(dFvLd)
dFsIvLd = str(dFIvLd)
dFzT = 0
rSrg = ''
pSr = OptionParser()
pSr.add_option('-p', '--pass', dest='pSsS',
                 help='Number of passes to complete on iterOp', metavar='Int', default='1')
pSr.add_option('-d', '--debug', dest='dOp',
                 help='Debug flag')
pSr.add_option('-v', '--verbose', dest='vBs',
                 help='Verbose logging')
pSr.add_option('-t', '--to', dest='mLtO',
                 help='Destination mailbox', metavar='String')
pSr.add_option('-a', '--about', dest='aBtF',
                         help='About dialog', action='store_true')
(opTs, args) = pSr.parse_args()
def mLfunC(tOu, bStrg, mailto:fmU='***@rackspace.net fmU='***@rackspace.net', sJt='RANCID Report'):
   mSg = 'From: ' + str(fmU) + '\n' + 'To: ' + str(tOu) + '\n' + 'Subject: ' + str(sJt) + '\n' + str(bStrg) + '\n'
   try:
       smtpObj = smtplib.SMTP('localhost')
       smtpObj.sendmail(fmU, tOu, mSg)
       lG('Successfully sent email', vBs)
   except:
       lG('Unable to send email - ERROR', vBs)
       sys.exit(1)
def lG(text, vBs, vBsBl=dFIvLd, dFIvLd=dFIvLd, rSrg=rSrg):
   if vBsBl != vBs and vBs == dFIvLd:
      pass
   else:
      print str(text) + datetime.datetime.now().strftime(' at %A (%a) %d/%m/%Y %I:%M:%S %p') + '\n'
      rSrg = rSrg + str(text) + '\n'
   return rSrg
if opTs.aBtF:
  print aBt
  print 'Last Update: ' + str(lU)
  sys.exit(0)
if not opTs.pSsS:
  pSsS = dFeIn
else:
  pSsS = opTs.pSsS
if not opTs.dOp:
  dOp = dFvLd
else:
  dOp= opTs.dOp
if not opTs.vBs:
  vBs = dFIvLd
else:
  vBs = opTs.vBs
if not opTs.mLtO:
  mlBl = dFsIvLd
else:
  mlBl = dFvLd
  mLtO = opTs.mLtO
hNSgr = os.uname()[1]
hNSgr = hNSgr.split('.')
hNSgr = hNSgr[dFeIn]
rSrg = rSrg + lG('Ver ' + str(lU), vBs)
rSrg = rSrg + lG('Starting process', vBs)
rSrg = rSrg + lG('Number of passes set to ' + str(pSsS), vBs)
if dOp == dFsIvLd:
  rSrg = rSrg + lG('WARNING! - Real operation mode!', vBs)
else:
  rSrg = rSrg + lG('Debug Mode', vBs)
try:
   dmd = ZenScriptBase(connect=dFvLd, noopts=dFvLd).dmd
except:
   print 'DMD Connection Failed'
   sys.exit(1)
rSrg = rSrg + lG('Connected to DMD OK', vBs)
pSsN = dFzT
for pSs_iter in range (int(dFzT), int(pSsS)):
   pSsN = pSsN + dFeIn
   rSrg = rSrg + lG('Started Cleaning Device Catalog Pass ' + str(pSsN), vBs)
   print '\r'
   eRr = dFvLd
   while eRr:
       eRr = dFIvLd
       oBj = dmd.Devices.deviceSearch()
       pSsNb = dFzT
       progB = PB(pSsNb, len(oBj), 77, c='#')
       for d in oBj:
           pSsNb = pSsNb + dFeIn
           rSrg = rSrg + lG('\r Working on device: ' + str(d.id) + '\r', vBs, dFvLd)
           try:
               bah = d.getObject()
           except Exception:
               dOpPth = d.getPath()
               if dOp == dFsIvLd:
                  rSrg = rSrg + lG(' RW ' + str(dOpPth), vBs)
                  dmd.Devices.deviceSearch.uncatalog_object(d.getPath())
                  time.sleep(4)
                  commit()
                  eRr = dFsvLd
               else:
                  rSrg = rSrg + lG(' RO ' + str(dOpPth), vBs)
           progB.iNa()
           print progB, str(pSsNb) + '\\' + str(len(oBj)) + '\r',
           sys.stdout.flush()
   if dOp == dFsIvLd:
      commit()
   print '\r'
   rSrg = rSrg + lG('Started Cleaning Component Catalog Pass ' + str(pSsN), vBs)
   print '\r'
   eRr = dFvLd
   while eRr:
       eRr = dFIvLd
       oBj = dmd.Devices.componentSearch()
       pSsNb = dFzT
       progC = PB(pSsNb, len(oBj), 77, c='#')
       for d in oBj:
           pSsNb = pSsNb + dFeIn
           rSrg = rSrg + lG('\r Working on ' +str(d.id) + '\r', vBs, dFvLd)
           try:
               bah = d.getObject()
           except Exception:
               dOpPth = d.getPath()
               if dOp == dFsIvLd:
                  rSrg = rSrg + lG(' RW ' + str(dOpPth), vBs)
                  dmd.Devices.componentSearch.uncatalog_object(d.getPath())
                  time.sleep(4)
                  commit()
                  eRr = dFvLd
               else:
                  rSrg = rSrg + lG(' RO ' + str(dOpPth), vBs)
           progC.iNa()
           print progC, str(pSsNb) + '\\' + str(len(oBj)) + '\r',
           sys.stdout.flush()
   if dOp == dFsIvLd:
      commit()
rSrg = rSrg + lG('\nFinished Cleaning Components Catalogs', vBs)
if mlBl == dFvLd:
  sJSrg = 'Component Cleanup Report for ' + str(hNSgr)
  mLfunC(mLtO, rSrg, mailto:'***@rackspace.com '***@rackspace.com', sJSrg)
}
Run as zenoss user, clean_up_components.py -p 1 -d True
(Single pass, don't commit. Use -t to mail a report)
Best,
--Shane
--------------------------------------------------------------
Reply to this message by replying to this email -or- go to the discussion on Zenoss Community
[http://community.zenoss.org/message/65957#65957]
Start a new discussion in zenoss-users by email
[discussions-community-forums-zenoss--***@community.zenoss.org] -or- at Zenoss Community
[http://community.zenoss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2003]