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

Source Code for Module invocations.monitoring.CheckCamb

 1  #! /usr/bin/env python 
 2  #------------------------------------------------------------------------------ 
 3  #$Id: CheckCamb.py 10229 2014-02-28 11:07:42Z EckhardSutorius $ 
 4  """ 
 5     Check if directories at CASU are ready for transfer. 
 6   
 7     @author: E. Sutorius 
 8     @org:    WFAU, IfA, University of Edinburgh 
 9  """ 
10  #------------------------------------------------------------------------------ 
11  from   collections import defaultdict 
12  import os 
13  import smtplib 
14  from email.mime.text import MIMEText 
15   
16  from   invocations.cu1.cu1Transfer     import CASUQueries 
17  from   wsatools.CLI                    import CLI 
18  from   wsatools.ObsCalendar            import WfcamCal 
19  from   wsatools.SystemConstants        import SystemConstants 
20  #------------------------------------------------------------------------------ 
21  # Entry point for script. 
22  # Allow module to be imported as well as executed from the command line 
23  if __name__ == "__main__": 
24      # Define command-line interface settings for CambInfo 
25      CLI.progArgs.remove("comment") 
26      CLI.progOpts.remove("curator") 
27      CLI.progOpts.remove("user") 
28      CLI.progOpts += [ 
29          CLI.Option('b', "begin", 
30                     "first date to process", 
31                     "DATE", WfcamCal().getFirstLight("%Y%m%d")), 
32          CLI.Option('e', "end", 
33                     "last date to process", 
34                     "DATE", WfcamCal().getToday("%Y%m%d")), 
35          CLI.Option('c', "casudirs", "main CASU data directories", 
36                     "PATH", ''), 
37          CLI.Option('j', "janet", 
38                     "use JANET instead of UKLight"), 
39          CLI.Option('v', "verbose", "print message to screen")] 
40      cli = CLI("CheckCamb", "$Revision: 10229 $", __doc__) 
41      sysc = SystemConstants(cli.getArg("database")) 
42      CASUQueries.sysc = sysc 
43      UKLight = not cli.getOpt("janet") 
44   
45      if cli.getOpt("casudirs"): 
46          scpCasuDirs = cli.getOpt("casudirs").split(',') 
47      else: 
48          scpCasuDirs = CASUQueries.getCasuStagingDirs(UKLight=UKLight) 
49   
50      beginDate = int(max(cli.getOpt("begin"), 
51                          sysc.obsCal.getFirstLight("%Y%m%d"))) 
52      endDate = int(cli.getOpt("end")) 
53   
54      transferList = [] 
55      for direc in scpCasuDirs: 
56          srDirs = [os.path.dirname(x) for x in CASUQueries.getSRDirs( 
57              direc, UKLight, returnList=True) if os.path.basename( 
58                        os.path.dirname(x)).isdigit()] 
59          otcDirs = [os.path.dirname(x) for x in CASUQueries.getOTCDirs( 
60              beginDate, endDate, srDirs, None, direc, UKLight=UKLight, 
61              returnList=True) if os.path.basename(os.path.dirname(x)).isdigit()] 
62          transferList.extend(sorted(set(otcDirs).difference(srDirs))) 
63   
64      noVers = [] 
65      if transferList: 
66          transferDict = defaultdict(lambda : defaultdict(list)) 
67          versDict = defaultdict() 
68          for direc in sorted(set(transferList)): 
69              versDict.update(CASUQueries.getDirVersions(direc, UKLight=UKLight)) 
70          for x in transferList: 
71              try: 
72                  vdate, vers = versDict[x].partition('_v')[::2] 
73              except KeyError: 
74                  noVers.append(x) 
75              path, tdate = os.path.split(x) 
76              transferDict[vers][path].append(tdate) 
77   
78          text = "%s: \n====" % sysc.loadDatabase 
79          for dirVers in transferDict: 
80              text += "\nYou need to transfer\n" 
81              for path in transferDict[dirVers]: 
82                  text += " vers. %s from %s for:\n%s\n\n" % ( 
83                      dirVers, path, ', '.join(transferDict[dirVers][path])) 
84          for line in noVers: 
85              text += "No version info for: %s" % ','.join(noVers) 
86          if cli.getOpt("verbose"): 
87              print(text) 
88          msg = MIMEText(text, 'plain') 
89          msg['Subject'] = "CASU Transfers" 
90          msg['From'] = "etws@roe.ac.uk" 
91          msg['To'] = "etws@roe.ac.uk" 
92          s = smtplib.SMTP('localhost') 
93          s.sendmail("etws@roe.ac.uk", ["etws@roe.ac.uk"], msg.as_string()) 
94          s.quit() 
95      else: 
96          if cli.getOpt("verbose"): 
97              print("Nothing to transfer for %s" % sysc.loadDatabase) 
98