#!PYTHONEXE """configureExperiments is a script to allow experiments to be imported from other Madrigal installations or moved between experiments[0-9]* directories. Verifies both siteId and cgiUrl. Checks that all three geophysical files are in experiments directory Replaces the tcl version of the same name No arguments. For each non-hidden local experiment, will make the following changes if needed: 1. expTab.txt -> expId: set to new siteId x 10,000,000 2. expTab.txt -> url: set to new url 3. expTab.txt -> siteId: set to new siteId 4. fileTab.txt -> fileId: set to new siteId x 10,000,000 $Id: configureExperiments.py 7045 2019-10-07 19:56:46Z brideout $ """ import os, os.path, sys import madrigal.metadata print('configureExperiments is converting any experiment from a different' + \ ' Madrigal site into a local experiment. Will also convert experiments moved into different experiments[0-9]* directories.') madDB = madrigal.metadata.MadrigalDB() siteId = madDB.getSiteID() thisId = siteId*10000000 cgiUrl = madDB.getTopLevelUrl() cgiUrlTest = os.path.join(cgiUrl, 'madtoc') # be sure experiments/stage exists and is world-writable madroot = madDB.getMadroot() stageDir = os.path.join(madroot, 'experiments/stage') if not os.access(stageDir, os.R_OK): os.makedirs(stageDir) try: os.chmod(stageDir, 0o777) except: pass hasGeo = False hasDst = False hasImf = False expConvertedNum = 0 # get a list of every Madrigal experiment directory madExpDirs = madDB.getExpList() for thisDir in madExpDirs: # create experiment object try: madExpObj = madrigal.metadata.MadrigalExperiment(madDB, os.path.join(thisDir, 'expTab.txt')) except: print('WARNING - error with experiment %s expTab.txt file' % (thisDir)) continue # if siteId is and cgiUrl is correct, continue # create list of valid urls validUrlList = [] startIndex = thisDir.find('/experiments') if thisDir.find('/experiments/') != -1: # it is valid to skip experiment part of url validUrlList.append(cgiUrlTest + thisDir[startIndex+len('/experiments'):]) if thisDir.find('1950/gpi/01jan50') != -1: hasGeo = True if thisDir.find('1957/dst/01jan57') != -1: hasDst = True if thisDir.find('1963/imf/27nov63') != -1: hasImf = True else: if thisDir.find('1950/gpi/01jan50') != -1: raise IOError('The experiment 1950/gpi/01jan50 must be located in the experiments directory only!') if thisDir.find('1957/dst/01jan57') != -1: raise IOError('The experiment 1957/dst/01jan57 must be located in the experiments directory only!') if thisDir.find('1963/imf/27nov63') != -1: raise IOError('The experiment 1963/imf/27nov63 must be located in the experiments directory only!') validUrlList.append(cgiUrlTest + thisDir[startIndex:]) if madExpObj.getExpSiteIdByPosition(0) == siteId and \ madExpObj.getExpUrlByPosition(0) in validUrlList: continue print('Modifying exp %s to be local' % (thisDir)) expConvertedNum += 1 # get baseDir baseDir = thisDir[len(madroot):] if baseDir[0] == '/': baseDir = baseDir[1:] # modify expTab.txt madExpObj.setExpIdByPosition(0, thisId) thisUrl = madExpObj.getExpUrlByPosition(0) newUrl = os.path.join(cgiUrl, 'madtoc', baseDir) madExpObj.setExpUrlByPosition(0, newUrl) madExpObj.setExpSiteIdByPosition(0, siteId) madExpObj.writeMetadata() if os.access(os.path.join(thisDir,'fileTab.txt'), os.R_OK): try: madFileObj = madrigal.metadata.MadrigalMetaFile(madDB, os.path.join(thisDir, 'fileTab.txt')) if madFileObj.getFileCount() == 0: raise IOError('') except: print('WARNING - error with experiment %s fileTab.txt' % (thisDir)) continue # modify fileTab.txt madFileObj.setExpIdByPosition(0, thisId) madFileObj.writeMetadata() if not hasGeo: raise IOError('The experiment 1950/gpi/01jan50 not found in the experiments directory!') if not hasDst: raise IOError('The experiment 1957/dst/01jan57 not found in the experiments directory!') if not hasImf: raise IOError('The experiment 1963/imf/27nov63 not found in the experiments directory!') if expConvertedNum == 0: print('No non-local experiments found') else: cmd = 'chmod -Rf %s' % (os.path.join(madroot, 'experiments*')) print('configureExperiments done')