1
2
3
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
28 """List CASU dirs and flag files with their date. Creates automatically
29 a latex and a postscript file.
30 """
31
32 CasuData = namedtuple('CasuData', "sr, otc, vers, direc, sizes")
33
34
35
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
80
81
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
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
126
127 for direc in self.scpCasuDirs:
128 Logger.addMessage("%s:" % direc)
129
130
131 Logger.addMessage(" creating size list")
132 self.casuData.sizes.update(CASUQueries.getDirSizes(
133 direc, self.UKLight, returnList=False))
134
135
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
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
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
158
159
160
161
162
163
164
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
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
250
251 if __name__ == "__main__":
252
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
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310