ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/multicrab.py
Revision: 1.17
Committed: Thu Nov 12 10:35:26 2009 UTC (15 years, 5 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.16: +1 -0 lines
Log Message:
fix for "None" as command argument

File Contents

# Content
1 #!/usr/bin/env python
2 import sys, os, time, string, shutil
3 from crab_util import *
4 from crab import *
5 import common
6
7 ###########################################################################
8 class MultiCrab:
9 def __init__(self, opts):
10 self.prog_name='multicrab'
11 # Configuration file
12 self.cfg_fname = None
13 # Continuation flag
14 self.flag_continue = 0
15 self.continue_dir = None
16 self.processContinueOption_(opts)
17
18 self.processIniFile_(opts)
19 # configuration
20 self.opts=opts
21
22 if not self.flag_continue:
23 self.createWorkSpace()
24
25 print self.prog_name + ' running on ' + time.ctime(time.time())
26 print ' working directory ' + self.continue_dir
27
28
29 def processContinueOption_(self,opts):
30
31 # Look for the '-continue' option.
32
33 for opt in opts.keys():
34 if ( opt in ('-continue','-c') ):
35 self.flag_continue = 1
36 val = opts[opt]
37 if val:
38 if val[0] == '/': self.continue_dir = val # abs path
39 else: self.continue_dir = os.getcwd() + '/' + val # rel path
40 pass
41 break
42 pass
43
44 # Look for actions which has sense only with '-continue'
45
46 if "-create" not in opts.keys() :
47 self.flag_continue = 1
48
49 if not self.flag_continue: return
50
51 if not self.continue_dir:
52 prefix = self.prog_name + '_'
53 self.continue_dir = findLastWorkDir(prefix)
54 pass
55
56 if not self.continue_dir:
57 raise CrabException('Cannot find last working directory.')
58
59 if not os.path.exists(self.continue_dir):
60 msg = 'Cannot continue because the working directory <'
61 msg += self.continue_dir
62 msg += '> does not exist.'
63 raise CrabException(msg)
64
65 return
66
67 def createWorkSpace(self):
68 # create WorkingDir for Multicrab
69 if 'MULTICRAB.working_dir' in self.opts.keys():
70 self.continue_dir = os.path.abspath(self.opts['MULTICRAB.working_dir'])
71 else:
72 current_time = time.strftime('%y%m%d_%H%M%S', time.localtime(time.time()))
73 self.continue_dir = os.getcwd() + '/' + self.prog_name + '_' + current_time
74
75 if self.continue_dir and not os.path.exists(self.continue_dir):
76 try:
77 os.mkdir(self.continue_dir)
78 except OSError:
79 msg = 'Cannot create '+str(self.continue_dir) +' directory.\n'
80 raise CrabException(msg)
81 pass
82 else:
83 msg = 'Directory '+str(self.continue_dir) +' already exist.\n'
84 raise CrabException(msg)
85
86 shutil.copyfile('multicrab.cfg',self.continue_dir+'/multicrab.cfg')
87
88 return
89
90 def processIniFile_(self, opts):
91 """
92 Processes a configuration INI-file.
93 """
94
95 # Extract cfg-file name from the cmd-line options.
96
97 for opt in opts.keys():
98 if ( opt == '-cfg' ):
99 if self.flag_continue:
100 raise CrabException('-continue and -cfg cannot coexist.')
101 if opts[opt] :
102 self.cfg_fname = opts[opt]
103 del opts[opt] # do not pass cfg further on
104 else : processHelpOptions()
105 pass
106 pass
107
108 # Set default cfg-fname
109
110 if self.cfg_fname == None:
111 if self.flag_continue:
112 self.cfg_fname = self.continue_dir + '/multicrab.cfg'
113 else:
114 self.cfg_fname = 'multicrab.cfg'
115 pass
116 pass
117
118 # Load cfg-file
119
120 cfg_params = {}
121 if self.cfg_fname != None:
122 if os.path.exists(self.cfg_fname):
123 cfg_params = self.loadMultiConfig(self.cfg_fname)
124 pass
125 else:
126 msg = 'cfg-file '+self.cfg_fname+' not found.'
127 raise CrabException(msg)
128 pass
129 pass
130
131 # process the [CRAB] section
132
133 lhp = len('MULTICRAB.')
134 for k in cfg_params.keys():
135 if len(k) >= lhp and k[:lhp] == 'MULTICRAB.':
136 opt = '-'+k[lhp:]
137 if len(opt) >= 3 and opt[:3] == '-__': continue
138 if opt not in opts.keys():
139 opts[opt] = cfg_params[k]
140 pass
141 pass
142 pass
143
144 self.cfg_params_dataset = {}
145 common_opts = {}
146 # first get common sections
147 for sec in cfg_params:
148 if sec in ['MULTICRAB']:
149 if 'cfg' in cfg_params[sec]:
150 common_opts['cfg']=cfg_params[sec]['cfg']
151 continue
152 if sec in ['COMMON']:
153 common_opts.update(cfg_params[sec])
154 continue
155 pass
156
157 crab_cfg='crab.cfg'
158 if common_opts.has_key('cfg') : crab_cfg=common_opts['cfg']
159
160 # then Dataset's specific
161 for sec in cfg_params:
162 if sec in ['MULTICRAB', 'COMMON']: continue
163 self.cfg_params_dataset[sec]=cfg_params[sec]
164 # add common to all dataset
165 for key in common_opts:
166 self.cfg_params_dataset[sec][key]=common_opts[key]
167 pass
168
169 # read crab.cfg file and search for storage_path
170 crab_cfg_params = loadConfig(crab_cfg,{})
171 # also USER.ui_working_dir USER.outputdir and USER.logdir need special treatment
172 if cfg_params.has_key("COMMON"):
173 self.user_remote_dir = cfg_params["COMMON"].get("user.user_remote_dir", crab_cfg_params.get("USER.user_remote_dir",None))
174 self.outputdir = cfg_params["COMMON"].get("user.outputdir", crab_cfg_params.get("USER.outputdir",None))
175 self.logdir = cfg_params["COMMON"].get("user.logdir", crab_cfg_params.get("USER.logdir",None))
176 self.ui_working_dir = cfg_params["COMMON"].get("user.ui_working_dir", crab_cfg_params.get("USER.ui_working_dir",None))
177 else:
178 self.user_remote_dir = crab_cfg_params.get("USER.user_remote_dir",None)
179 self.outputdir = crab_cfg_params.get("USER.outputdir",None)
180 self.logdir = crab_cfg_params.get("USER.logdir",None)
181 self.ui_working_dir = crab_cfg_params.get("USER.ui_working_dir",None)
182
183 return
184
185 def loadMultiConfig(self, file):
186 """
187 returns a dictionary with keys of the form
188 <section>.<option> and the corresponding values
189 """
190 config={}
191 cp = ConfigParser.ConfigParser()
192 cp.read(file)
193 for sec in cp.sections():
194 # print 'Section',sec
195 config[sec]={}
196 for opt in cp.options(sec):
197 #print 'config['+sec+'.'+opt+'] = '+string.strip(cp.get(sec,opt))
198 config[sec][opt] = string.strip(cp.get(sec,opt))
199 return config
200
201 def run(self):
202 #run crabs
203 runFileName = 'multicrab.exe'
204 runFile = open(runFileName,"w")
205 for sec in self.cfg_params_dataset:
206 options={}
207 if self.flag_continue:
208 options['-c']=sec
209 # DatasetName to be used
210 options['-USER.ui_working_dir']=sec
211 # options from multicrab.cfg
212 for opt in self.cfg_params_dataset[sec]:
213 tmp = "-"+str(opt)
214 if len(opt.split("."))==2:
215 tmp="-"+string.upper(opt.split(".")[0])+"."+opt.split(".")[1]
216
217 options[tmp]=self.cfg_params_dataset[sec][opt]
218
219 # add section to storage_path if exist in crab.cfg
220 if not self.cfg_params_dataset.has_key("USER.user_remote_dir") and self.user_remote_dir:
221 options["-USER.user_remote_dir"]=self.user_remote_dir+"/"+sec
222 # also for ui_working_dir
223 if not self.cfg_params_dataset.has_key("USER.ui_working_dir") and self.ui_working_dir:
224 options["-USER.ui_working_dir"]=self.ui_working_dir+"/"+sec
225 # also for logDir
226 if not self.cfg_params_dataset.has_key("USER.logdir") and self.logdir:
227 options["-USER.logdir"]=self.logdir+"/"+sec
228 # also for outputdir
229 if not self.cfg_params_dataset.has_key("USER.outputdir") and self.outputdir:
230 options["-USER.outputdir"]=self.outputdir+"/"+sec
231
232 # Input options (command)
233 for opt in self.opts:
234 options[opt]=self.opts[opt]
235 if self.flag_continue and options.has_key("-cfg"):
236 del options['-cfg']
237 pass
238
239 # write crab command to be executed later...
240 cmd='crab '
241 for o in options:
242 if options[o]==None: options[o]=""
243 cmd+=str(o)+" "+str(options[o])+" "
244 cmd+="\n"
245 # print cmd
246
247 runFile.write(cmd)
248
249 # SL this does not work for complex, multi include pset.py
250
251 # crab = Crab()
252 # try:
253 # crab.initialize_(options)
254 # crab.run()
255 # del crab
256 # print 'Log file is %s%s.log'%(common.work_space.logDir(),common.prog_name)
257 # print '\n############################## E N D ####################################\n'
258 # except CrabException, e:
259 # del crab
260 # print '\n' + common.prog_name + ': ' + str(e) + '\n'
261 # pass
262 # pass
263 # if (common.logger): common.logger.delete()
264 pass
265
266
267 ###########################################################################
268 if __name__ == '__main__':
269 ## Get rid of some useless warning
270 try:
271 import warnings
272 warnings.simplefilter("ignore", RuntimeWarning)
273 except ImportError:
274 pass # too bad, you'll get the warning
275
276 # Parse command-line options and create a dictionary with
277 # key-value pairs.
278 options = parseOptions(sys.argv[1:])
279
280 # Process "help" options, such as '-help', '-version'
281 if processHelpOptions(options) : sys.exit(0)
282
283 # Create, initialize, and run a Crab object
284 try:
285 multicrab = MultiCrab(options)
286 multicrab.run()
287 except CrabException, e:
288 print '\n' + common.prog_name + ': ' + str(e) + '\n'
289
290 pass