Package invocations :: Package monitoring :: Module CambInfo
[hide private]

Source Code for Module invocations.monitoring.CambInfo

  1  #! /usr/bin/env python 
  2  #------------------------------------------------------------------------------ 
  3  #$Id: CambInfo.py 9550 2012-12-05 16:25:00Z EckhardSutorius $ 
  4  """ 
  5     List CASU dirs and flag files with their date. Creates automatically 
  6     a latex and a postscript file. 
  7   
  8     @author: E. Sutorius 
  9     @org:    WFAU, IfA, University of Edinburgh 
 10  """ 
 11  #------------------------------------------------------------------------------ 
 12  from   collections import defaultdict, namedtuple 
 13  import mx.DateTime     as mxTime 
 14  import os 
 15  import shutil 
 16  import string 
 17   
 18  from   invocations.cu1.cu1Transfer     import CASUQueries 
 19  from   wsatools.CLI                    import CLI 
 20  from   wsatools.DbConnect.IngCuSession import IngCuSession 
 21  from   wsatools.Logger                 import Logger 
 22  from   wsatools.ObsCalendar            import WfcamCal 
 23  from   wsatools.SystemConstants        import SystemConstants 
 24  import wsatools.Utilities                  as utils 
 25  #------------------------------------------------------------------------------ 
 26   
27 -class CambInfo(IngCuSession):
28 """List CASU dirs and flag files with their date. Creates automatically 29 a latex and a postscript file. 30 """ 31 # Define class parameters 32 CasuData = namedtuple('CasuData', "sr, otc, vers, direc, sizes") 33 34 #-------------------------------------------------------------------------- 35
36 - def _onRun(self):
37 """ 38 """ 39 timestamp = utils.makeTimeStamp().replace(' ','_') 40 self.casuData = CambInfo.CasuData(sr=[], otc=[], vers=[], 41 direc=[], sizes={}) 42 self.getCasuInfo() 43 44 dataDict = defaultdict(dict) 45 defaultData = {'sr':['',''], 'otc':['',''], 46 'vers':['',''], 'direc':['','']} 47 for entry in self.casuData.sr: 48 if self.beginDate <= int(entry[1]) <= self.endDate: 49 dataDict[entry[1]] = defaultData.copy() 50 dataDict[entry[1]]['sr'] = [entry[0], entry[2]] 51 52 for entry in self.casuData.otc: 53 if self.beginDate <= int(entry[1]) <= self.endDate: 54 if not dataDict.has_key(entry[1]): 55 dataDict[entry[1]] = defaultData.copy() 56 dataDict[entry[1]]['otc'] = [entry[0], entry[2]] 57 58 for entry in self.casuData.vers: 59 if self.beginDate <= int(entry[1]) <= self.endDate: 60 if not dataDict.has_key(entry[1]): 61 dataDict[entry[1]] = defaultData.copy() 62 dataDict[entry[1]]['vers'] = [entry[0], entry[2]] 63 64 for entry in self.casuData.direc: 65 if self.beginDate <= int(entry[1]) <= self.endDate: 66 if not dataDict.has_key(entry[1]): 67 dataDict[entry[1]] = defaultData.copy() 68 dataDict[entry[1]]['direc'] = [entry[0], entry[2]] 69 70 for entry in dataDict: 71 try: 72 dataDict[entry]["size"] = self.casuData.sizes[entry] 73 except KeyError: 74 Logger.addMessage("%s: %s" % (entry, repr(dataDict[entry]))) 75 self.make_latex(dataDict, timestamp, self.outDir)
76 77 #-------------------------------------------------------------------------- 78
79 - def createTimeTuple(self, aList, isDirectory=False):
80 # mondict = {'Jan':1, 'Feb':2, 'Mar':3, 'Apr':4, 'May':5, 'Jun':6, 81 # 'Jul':7, 'Aug':8, 'Sep':9, 'Oct':10, 'Nov':11, 'Dec':12} 82 tmpTupl = [] 83 for entry in aList: 84 lsFlags = "-L -o" if isDirectory else "-oR" 85 for line in CASUQueries.getDirListing(entry, self.UKLight, lsFlags): 86 if line.startswith(("total", "lrw")): 87 continue 88 else: 89 (_access, _nol, _uid, _size, yyyymmdd, time, _timezone, 90 name) = line.rstrip().split() 91 yyyy, mon, dd = yyyymmdd.split('-') 92 if ':' in time: 93 hh = time[:2] 94 mm = time[3:5] 95 ss = time[6:8] 96 # mondict[mon] -> int(mon) 97 if self.withSeconds: 98 filetime = mxTime.DateTime( 99 int(yyyy), int(mon), int(dd), 100 int(hh), int(mm), int(ss)).strftime("%d-%m-%y %H:%M:%S") 101 else: 102 filetime = mxTime.DateTime( 103 int(yyyy), int(mon), int(dd), 104 int(hh), int(mm)).strftime("%d-%m-%y %H:%M") 105 106 if not isDirectory: 107 _d1, d2, _d3, _d4, d5, fn = entry[1:].split('/', 5) 108 if d5.isdigit(): 109 if fn.startswith("VERSION"): 110 tmpTupl.append((fn[fn.find('_')+1:], d5, filetime)) 111 else: 112 tmpTupl.append((d2, d5, filetime)) 113 else: 114 Logger.addMessage("non-standard subdir: %s" % d5) 115 116 elif name.replace('/','').isdigit(): 117 d2 = entry[1:].split('/')[1] 118 tmpTupl.append((d2, name.replace('/',''), filetime)) 119 120 121 return tmpTupl
122 123 #-------------------------------------------------------------------------- 124
125 - def getCasuInfo(self):
126 # loop over all CASU main dirs 127 for direc in self.scpCasuDirs: 128 Logger.addMessage("%s:" % direc) 129 130 # get directories' sizes 131 Logger.addMessage(" creating size list") 132 self.casuData.sizes.update(CASUQueries.getDirSizes( 133 direc, self.UKLight, returnList=False)) 134 135 # list of dir versions 136 Logger.addMessage(" creating version list") 137 versDirs = CASUQueries.getDirVersions(direc, self.UKLight, 138 returnList=True) 139 self.casuData.vers.extend(self.createTimeTuple(versDirs)) 140 141 # list of successfully_read dirs 142 Logger.addMessage(" creating sr list") 143 srDirs = CASUQueries.getSRDirs(direc, self.UKLight, returnList=True) 144 self.casuData.sr.extend(self.createTimeTuple(srDirs)) 145 146 # list of ok_to_copy dirs 147 Logger.addMessage(" creating otc list") 148 otcDirs = CASUQueries.getOTCDirs( 149 self.beginDate, self.endDate, srDirs, None, direc, 150 UKLight=self.UKLight, returnList=True) 151 self.casuData.otc.extend(self.createTimeTuple(otcDirs)) 152 Logger.addMessage(" creating disk list") 153 self.casuData.direc.extend(self.read_direc(direc))
154 155 #-------------------------------------------------------------------------- 156
157 - def read_direc(self, direc):
158 # list of dirs 159 #cmd = ' '.join([CASUQueries.sshCmd(self.UKLight), 160 # "\"find", direc, "-name OK_TO_COPY -print\""]) 161 #direcDirs = \ 162 # [os.path.dirname(os.path.dirname(x.rstrip())) for x in os.popen(cmd)] 163 # if there are no OK_TO_COPY files try VERSION 164 #if not direcDirs: 165 cmd = ' '.join([CASUQueries.sshCmd(self.UKLight), 166 "\"find", direc, "-name 'VERSION_*' -print\""]) 167 direcDirs = [os.path.dirname(os.path.dirname(x.rstrip())) 168 for x in os.popen(cmd) 169 if not ("old" in x or "text" in x)] 170 return self.createTimeTuple(sorted(set(direcDirs)), isDirectory=True)
171 172 #-------------------------------------------------------------------------- 173
174 - def make_latex(self, aDict, t, outdir):
175 lines = ["\\documentclass[10pt,a4paper]{article}\n", 176 "\\usepackage{multicol}\n", 177 "\\usepackage{multirow}\n", 178 "\\usepackage{longtable}\n", 179 "\\usepackage{array}\n", 180 "\\parindent=0.0in\n", 181 "\\topmargin=-2cm\n", 182 "\\oddsidemargin=-1.75cm\n", 183 "\\textheight=26cm\n", 184 "\\begin{document}\n", 185 "\\setlongtables\n"] 186 187 if self.withSeconds: 188 lines.append("\\begin{longtable}{p{4.5cm}||p{3.6cm}|" 189 "p{2.85cm}|p{2.85cm}|p{1.5cm}|>{\hfill}p{1cm}|}\n") 190 else: 191 lines.append("\\begin{longtable}{p{4cm}||p{3.25cm}|p{2.75cm}|" 192 "p{2.75cm}|p{1.5cm}|>{\hfill}p{1cm}|}\n") 193 194 lines += ["\\multicolumn{5}{c}{\\large %s Directories and their Flag " 195 "Files at CASU %s}\\\\\n\\hline\n" % ( 196 self.sysc.loadDatabase ,t.replace('_','\\_')), 197 "Date & Version & Ready to Copy & Successfully Read & Disk " 198 "& Size\\\\\n\\hline\n", 199 "\\endfirsthead\n", 200 "\\multicolumn{5}{c}{\\large %s Directories and their Flag " 201 "Files at CASU %s (contd)}\\\\\n\\hline\n" % ( 202 self.sysc.loadDatabase, t.replace('_','\\_')), 203 "Date & Version & Ready to Copy & Successfully Read & Disk " 204 "\\\\\n\\hline\n", 205 "\\endhead\n\\hline\n", 206 "\\endfoot\n\\hline\n", 207 "\\endlastfoot\n\\hline\n"] 208 209 dateold = "00000000" 210 datCnt = 0 211 fullSize = 0 212 for date in sorted(aDict): 213 if date.isdigit(): 214 if date[:6] != dateold[:6]: 215 lines.append("\\hline\n") 216 line = ''.join(["\mbox{", date, " [", aDict[date]['direc'][1], 217 "]}", 218 "&", "[", aDict[date]['vers'][0], "] ", 219 aDict[date]['vers'][1], 220 "&", aDict[date]['otc'][1], 221 "&", aDict[date]['sr'][1], 222 "&", aDict[date]['direc'][0].replace('_','\\_'), 223 "&", aDict[date]['size']]) 224 lines.append(line+"\\\\\n") 225 datCnt += 1 226 identity = string.maketrans('', '') 227 fullSize += int(float(aDict[date]['size'].translate( 228 identity, 'gGkKtTmM'))) 229 dateold = date 230 lines += ["\\end{longtable}\n", 231 "%d days, %d G\n" % (datCnt, fullSize), 232 "\\end{document}\n"] 233 dataArchive = self.sysc.loadDatabase 234 texFile = os.path.join("cambInfo_%s_%s.tex" % (dataArchive, t)) 235 open(texFile, 'w').writelines(lines) 236 os.system("latex "+texFile) 237 os.system("dvips "+texFile.replace(".tex",".dvi")+" -o") 238 os.system("gv "+texFile.replace(".tex",".ps")) 239 if not os.path.exists(os.path.join(outdir, texFile)): 240 shutil.copy2(texFile, outdir) 241 if not os.path.exists( 242 os.path.join(outdir, texFile.replace(".tex",".ps"))): 243 shutil.copy2(texFile.replace(".tex",".ps"), outdir) 244 os.system("rm "+texFile.replace(".tex",".*")) 245 Logger.addMessage("Data written to %s" % os.path.join( 246 outdir, texFile.replace(".tex",".ps")))
247 248 #------------------------------------------------------------------------------ 249 # Entry point for script. 250 # Allow module to be imported as well as executed from the command line 251 if __name__ == "__main__": 252 # Define command-line interface settings for CambInfo 253 CLI.progArgs.remove("comment") 254 CLI.progArgs.remove("database") 255 CLI.progArgs += [ 256 CLI.Argument("archive", "WSA")] 257 258 CLI.progOpts.remove("curator") 259 CLI.progOpts.remove("user") 260 CLI.progOpts += [ 261 CLI.Option('b', "begin", 262 "first date to process", 263 "DATE", WfcamCal().getFirstLight("%Y%m%d")), 264 CLI.Option('e', "end", 265 "last date to process", 266 "DATE", WfcamCal().getToday("%Y%m%d")), 267 CLI.Option('c', "casudirs", "main CASU data directories", 268 "PATH", ''), 269 CLI.Option('j', "janet", 270 "use JANET instead of UKLight"), 271 CLI.Option('o', "outdir", "log file directory", 272 "PATH", SystemConstants("WSA").cambInfoPath()), 273 CLI.Option('s', "seconds", 274 "prints times to second accuracy")] 275 276 cli = CLI(CambInfo, "$Revision: 9550 $") 277 CambInfo.sysc = SystemConstants(cli.getArg("archive")) 278 CASUQueries.sysc = CambInfo.sysc 279 CambInfo.outDir = cli.getOpt("outdir") 280 utils.ensureDirExist(CambInfo.outDir) 281 cambInfo = CambInfo(database=cli.getArg("archive")) 282 cambInfo.UKLight = not cli.getOpt("janet") 283 cambInfo.withSeconds = cli.getOpt("seconds") 284 cambInfo.scpCasuDirs = (cli.getOpt("casudirs").split(',') 285 if cli.getOpt("casudirs") 286 else CASUQueries.getCasuStagingDirs( 287 cambInfo.UKLight)) 288 cambInfo.obsCal = CambInfo.sysc.obsCal 289 cambInfo.beginDate = int(max(cli.getOpt("begin"), 290 cambInfo.obsCal.getFirstLight("%Y%m%d"))) 291 cambInfo.endDate = int(cli.getOpt("end")) 292 cambInfo.run() 293 294 #------------------------------------------------------------------------------ 295 # Change log: 296 # 297 # 5-Jan-2005, ETWS: Original version. 298 # 11-Jan-2005, ETWS: Included input parameter casudisks. 299 # 19-Jan-2005, ETWS: Included timestamps for date directories. 300 # 10-Apr-2006, ETWS: Updated for debian sarge changes. 301 # 05-May-2006, JB: Updated with new CASU disk. 302 # 18-May-2006, ETWS: Fixed to exclude strange dir names. 303 # 26-May-2006, ETWS: Included optional output directory; 304 # fixed argument mismatch 305 # 29-May-2006, ETWS: fixed hardcoded output path 306 # 16-Apr-2007, ETWS: fixed hardcoded CASU disk names 307 # 18-May-2007, ETWS: Included UKLight/Janet switch. 308 # 27-Aug-2007, ETWS: Included CASU disk size in output. 309 # 6-Sep-2007, ETWS: Fixed bug. 310