CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
cmsLHEtoEOSManager.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 __version__ = "$Revision: 1.11 $"
4 
5 import os
6 import subprocess
7 import time
8 import re
9 
10 defaultEOSRootPath = '/eos/cms/store/lhe'
11 defaultEOSLoadPath = 'root://eoscms/'
12 defaultEOSlistCommand = 'xrd eoscms dirlist '
13 defaultEOSmkdirCommand = 'xrd eoscms mkdir '
14 defaultEOSfeCommand = 'xrd eoscms existfile '
15 defaultEOScpCommand = 'xrdcp -np '
16 
17 def findXrdDir(theDirRecord):
18 
19  elements = theDirRecord.split(' ')
20  if len(elements) > 1:
21  return elements[-1].rstrip('\n').split('/')[-1]
22  else:
23  return None
24 
25 def articleExist(artId):
26 
27  itExists = False
28  theCommand = defaultEOSlistCommand+' '+defaultEOSRootPath
29  dirList = subprocess.Popen(["/bin/sh","-c",theCommand], stdout=subprocess.PIPE)
30  for line in dirList.stdout.readlines():
31  if findXrdDir(line) == str(artId):
32  itExists = True
33 
34  return itExists
35 
37 
38  artList = [0]
39 
40  theCommand = defaultEOSlistCommand+' '+defaultEOSRootPath
41  dirList = subprocess.Popen(["/bin/sh","-c",theCommand], stdout=subprocess.PIPE)
42  for line in dirList.stdout.readlines():
43  try:
44  if line.rstrip('\n') != '':
45  artList.append(int(findXrdDir(line)))
46  except:
47  break
48 
49  return max(artList)
50 
51 
52 def fileUpload(uploadPath,lheList, reallyDoIt):
53 
54  inUploadScript = ''
55 
56  for f in lheList:
57  realFileName = f.split('/')[-1]
58  # Check the file existence
59  newFileName = uploadPath+'/'+str(realFileName)
60  addFile = True
61  additionalOption = ''
62  theCommand = defaultEOSfeCommand+' '+newFileName
63  exeFullList = subprocess.Popen(["/bin/sh","-c",theCommand], stdout=subprocess.PIPE)
64  result = exeFullList.stdout.readlines()
65  if result[0].rstrip('\n') == 'The file exists.':
66  addFile = False
67  print 'File '+newFileName+' already exists: do you want to overwrite? [y/n]'
68  reply = raw_input()
69  if reply == 'y' or reply == 'Y':
70  addFile = True
71  additionalOption = ' -f '
72  print ''
73  print 'Overwriting file '+newFileName+'\n'
74  # add the file
75  if addFile:
76  print 'Adding file '+str(f)+'\n'
77  inUploadScript += defaultEOScpCommand+additionalOption+' '+str(f)+' '+defaultEOSLoadPath+uploadPath+'/'+str(realFileName)+'\n'
78 
79 # launch the upload shell script
80 
81  print '\n Launching upload script \n'+inUploadScript+'\n at '+time.asctime(time.localtime(time.time()))+' ...\n'
82  if reallyDoIt:
83  exeRealUpload = subprocess.Popen(["/bin/sh","-c",inUploadScript])
84  exeRealUpload.communicate()
85  print '\n Upload ended at '+time.asctime(time.localtime(time.time()))
86 
87 #################################################################################################
88 
89 if __name__ == '__main__':
90 
91  import optparse
92 
93  # Here we define an option parser to handle commandline options..
94  usage='cmsLHEtoEOSManager.py <options>'
95  parser = optparse.OptionParser(usage)
96  parser.add_option('-f', '--file',
97  help='LHE local file list to be uploaded, separated by ","' ,
98  default='',
99  dest='fileList')
100 
101  parser.add_option('-n', '--new',
102  help='Create a new article' ,
103  action='store_true',
104  default=False,
105  dest='newId')
106 
107  parser.add_option('-u', '--update',
108  help='Update the article <Id>' ,
109  default=0,
110  dest='artIdUp')
111 
112  parser.add_option('-l', '--list',
113  help='List the files in article <Id>' ,
114  default=0,
115  dest='artIdLi')
116 
117  parser.add_option('-d', '--dry-run',
118  help='dry run, it does nothing, but you can see what it would do',
119  action='store_true',
120  default=False,
121  dest='dryRun')
122 
123  parser.add_option('-c', '--compress',
124  help='compress the local .lhe file with xc before upload',
125  action='store_true',
126  default=False,
127  dest='compress')
128 
129  (options,args) = parser.parse_args()
130 
131  # print banner
132 
133  print ''
134  print 'cmsLHEtoEOSmanager '+__version__[1:-1]
135  print ''
136  print 'Running on ',time.asctime(time.localtime(time.time()))
137  print ''
138 
139  reallyDoIt = not options.dryRun
140 
141  # Now some fault control..If an error is found we raise an exception
142  if not options.newId and options.artIdUp==0 and options.artIdLi==0:
143  raise Exception('Please specify the action to be taken, either "-n", "-u" or "-l"!')
144 
145  if options.fileList=='' and (options.newId or options.artIdUp!=0):
146  raise Exception('Please provide the input file list!')
147 
148  if (options.newId and (options.artIdUp != 0 or options.artIdLi != 0)) or (options.artIdUp != 0 and options.artIdLi != 0):
149  raise Exception('Options "-n", "-u" and "-l" are mutually exclusive, please chose only one!')
150 
151  if options.newId:
152  print 'Action: create new article\n'
153  elif options.artIdUp != 0:
154  print 'Action: update article '+str(options.artIdUp)+'\n'
155  elif options.artIdLi != 0:
156  print 'Action: list content of article '+str(options.artIdLi)+'\n'
157 
158  if options.artIdLi==0:
159  theList = options.fileList.split(',')
160  theCompressedFilesList = []
161  for f in theList:
162  # Check the file name extension
163  if not ( f.lower().endswith(".lhe") or f.lower().endswith(".lhe.xz") ):
164  raise Exception('Input file name must have the "lhe" or "lhe.xz" final extension!')
165  # Check the local file existence
166  if not os.path.exists(f):
167  raise Exception('Input file '+f+' does not exists')
168  if reallyDoIt and options.compress:
169  print "Compressing file",f
170  theCompressionCommand = 'xz '+f
171  exeCompression = subprocess.Popen(["/bin/sh","-c",theCompressionCommand])
172  exeCompression.communicate()
173  theCompressedFilesList.append(f+'.xz')
174  if reallyDoIt and options.compress:
175  theList = theCompressedFilesList
176 
177 
178 
179  newArt = 0
180  uploadPath = ''
181 
182 # new article
183 
184  if options.newId:
185  oldArt = lastArticle()
186  newArt = oldArt+1
187  print 'Creating new article with identifier '+str(newArt)+' ...\n'
188  uploadPath = defaultEOSRootPath+'/'+str(newArt)
189  theCommand = defaultEOSmkdirCommand+' '+uploadPath
190  if reallyDoIt:
191  exeUpload = subprocess.Popen(["/bin/sh","-c",theCommand])
192  exeUpload.communicate()
193 
194 # update article
195 
196  elif options.artIdUp != 0:
197  newArt = options.artIdUp
198  if articleExist(newArt):
199  uploadPath = defaultEOSRootPath+'/'+str(newArt)
200  else:
201  raise('Article '+str(newArt)+' to be updated does not exist!')
202 
203 # list article
204 
205  elif options.artIdLi !=0:
206  listPath = defaultEOSRootPath+'/'+str(options.artIdLi)
207  theCommand = defaultEOSlistCommand+' '+listPath
208  exeList = subprocess.Popen(["/bin/sh","-c",theCommand], stdout=subprocess.PIPE)
209  for line in exeList.stdout.readlines():
210  if findXrdDir(line) != None:
211  print findXrdDir(line)
212 
213 
214  if newArt > 0:
215  fileUpload(uploadPath,theList, reallyDoIt)
216  listPath = defaultEOSRootPath+'/'+str(newArt)
217  print ''
218  print 'Listing the '+str(newArt)+' article content after upload:'
219  theCommand = defaultEOSlistCommand+' '+listPath
220  if reallyDoIt:
221  exeFullList = subprocess.Popen(["/bin/sh","-c",theCommand])
222  exeFullList.communicate()
223  else:
224  print 'Dry run, nothing was done'
225 
const T & max(const T &a, const T &b)
double split
Definition: MVATrainer.cc:139