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.8 $"
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  (options,args) = parser.parse_args()
124 
125  # print banner
126 
127  print ''
128  print 'cmsLHEtoEOSmanager '+__version__[1:-1]
129  print ''
130  print 'Running on ',time.asctime(time.localtime(time.time()))
131  print ''
132 
133  reallyDoIt = not options.dryRun
134 
135  # Now some fault control..If an error is found we raise an exception
136  if not options.newId and options.artIdUp==0 and options.artIdLi==0:
137  raise Exception('Please specify the action to be taken, either "-n", "-u" or "-l"!')
138 
139  if options.fileList=='' and (options.newId or options.artIdUp!=0):
140  raise Exception('Please provide the input file list!')
141 
142  if (options.newId and (options.artIdUp != 0 or options.artIdLi != 0)) or (options.artIdUp != 0 and options.artIdLi != 0):
143  raise Exception('Options "-n", "-u" and "-l" are mutually exclusive, please chose only one!')
144 
145  if options.newId:
146  print 'Action: create new article\n'
147  elif options.artIdUp != 0:
148  print 'Action: update article '+str(options.artIdUp)+'\n'
149  elif options.artIdLi != 0:
150  print 'Action: list content of article '+str(options.artIdLi)+'\n'
151 
152  if options.artIdLi==0:
153  theList = options.fileList.split(',')
154  for f in theList:
155  # Check the file name extension
156  if not f.lower().endswith(".lhe"):
157  raise Exception('Input file name must have the "lhe" final extension!')
158  # Check the local file existence
159  if not os.path.exists(f):
160  raise Exception('Input file '+f+' does not exists')
161 
162 
163  newArt = 0
164  uploadPath = ''
165 
166 # new article
167 
168  if options.newId:
169  oldArt = lastArticle()
170  newArt = oldArt+1
171  print 'Creating new article with identifier '+str(newArt)+' ...\n'
172  uploadPath = defaultEOSRootPath+'/'+str(newArt)
173  theCommand = defaultEOSmkdirCommand+' '+uploadPath
174  if reallyDoIt:
175  exeUpload = subprocess.Popen(["/bin/sh","-c",theCommand])
176  exeUpload.communicate()
177 
178 # update article
179 
180  elif options.artIdUp != 0:
181  newArt = options.artIdUp
182  if articleExist(newArt):
183  uploadPath = defaultEOSRootPath+'/'+str(newArt)
184  else:
185  raise('Article '+str(newArt)+' to be updated does not exist!')
186 
187 # list article
188 
189  elif options.artIdLi !=0:
190  listPath = defaultEOSRootPath+'/'+str(options.artIdLi)
191  theCommand = defaultEOSlistCommand+' '+listPath
192  exeList = subprocess.Popen(["/bin/sh","-c",theCommand], stdout=subprocess.PIPE)
193  for line in exeList.stdout.readlines():
194  if findXrdDir(line) != None:
195  print findXrdDir(line)
196 
197 
198  if newArt > 0:
199  fileUpload(uploadPath,theList, reallyDoIt)
200  listPath = defaultEOSRootPath+'/'+str(newArt)
201  print ''
202  print 'Listing the '+str(newArt)+' article content after upload:'
203  theCommand = defaultEOSlistCommand+' '+listPath
204  if reallyDoIt:
205  exeFullList = subprocess.Popen(["/bin/sh","-c",theCommand])
206  exeFullList.communicate()
207  else:
208  print 'Dry run, nothing was done'
209 
const T & max(const T &a, const T &b)
double split
Definition: MVATrainer.cc:139