version 1.6, 2013/11/13 17:26:27
|
version 1.28, 2020/02/04 20:57:26
|
|
|
#!/home/jsoc/bin/linux_x86_64/activepython |
#!/usr/bin/python3 |
| |
|
# When run with the -s flag, localize.py configures the SUMS-server component of NetDRMS. |
import sys | import sys |
import getopt | import getopt |
import re | import re |
import os | import os |
import stat | import stat |
|
import filecmp |
import xml.etree.ElementTree as ET | import xml.etree.ElementTree as ET |
from subprocess import check_output, CalledProcessError | from subprocess import check_output, CalledProcessError |
| |
|
|
# Constants | # Constants |
VERS_FILE = 'jsoc_version.h' | VERS_FILE = 'jsoc_version.h' |
SDP_CFG = 'configsdp.txt' | SDP_CFG = 'configsdp.txt' |
Line 42 PERL_FXNS_A = """sub new |
|
Line 45 PERL_FXNS_A = """sub new |
|
}; | }; |
| |
bless($self, $clname); | bless($self, $clname); |
$self->{_paramsH} = $self->initialize(); |
$self->{_paramsH} = {}; |
|
$self->initialize(); |
| |
return $self; | return $self; |
} | } |
Line 70 PERL_FXNS_B = """sub get |
|
Line 74 PERL_FXNS_B = """sub get |
|
} | } |
1;""" | 1;""" |
| |
|
PY_BINPATH = '#!/usr/bin/python\n' |
|
|
|
PY_FXNS_A = """ |
|
class DRMSParams(object): |
|
def __init__(self): |
|
self.params = {} |
|
self.initialize() |
|
|
|
def __del__(self): |
|
del self.params |
|
|
|
def initialize(self): |
|
""" |
|
|
|
PY_FXNS_B = """ def get(self, name): |
|
if name in self.params: |
|
return self.params[name] |
|
else: |
|
return None |
|
""" |
|
|
|
PY_FXNS_C = """ def getBool(self, name): |
|
if name in self.params: |
|
return bool(self.params[name] == '1') |
|
else: |
|
return None |
|
""" |
|
|
|
SH_BINPATH = '#!/bin/bash\n' |
|
|
|
|
|
SUMRM_COMMENT = """# This is the configuration file for the sum_rm program. It was auto-generated by the DRMS master configure script. |
|
# It controls the behavior of the sum_rm program, and is loaded each time sum_rm runs. To change the |
|
# parameter values in this configuration file, modify config.local, then re-run configure. This configuration |
|
# file will be updated only if parameters affecting it are modified. If such changes are made to config.local, |
|
# please make sure that the sum_rm service is disabled while configure in running. |
|
""" |
|
|
|
SUMRM_DOC = """# sum_rm removes end-of-life SUMS data files to prevent disk-partitions from becomming 100% full. |
|
# sum_svc, the main SUMS service, starts this daemon when it is launched. Within an infinite loop, sum_rm sleeps |
|
# for SLEEP number of seconds (defined below). When it awakes, it loads the sum_rm configuration file. For each SU, |
|
# it then examines the 'effective_date' column within the sum_partn_alloc table of the SUMS database. It does so by |
|
# sorting all SUs by effective date (this date is actually an expiration date - the SU is good until the end of that day), |
|
# and then, starting with the SU with the oldest effective date, it deletes the SUs. It continues deleting SUs until one |
|
# of three conditions is met: |
|
# |
|
# (a) The disk has at least PART_PERCENT_FREE percent free space. |
|
# (b) All SUs have effective_date values in the future. |
|
# (c) At least 600 SUs have been deleted (this is defined in the LIMIT statement in the file SUMLIB_RmDoX.pgc). |
|
# |
|
# After sum_rm stops deleteing SUs, it then sleeps for SLEEP seconds, completing the first iteration of the |
|
# infinite loop. |
|
""" |
|
|
|
SUMRM_PARTN_PERCENT_FREE = """ |
|
# This is the percentage at which all disk partitions are to be kept free. |
|
# If not specified, this defaults to 3. For example, setting PART_PERCENT_FREE = 5 will allow all partitions to |
|
# fill to 95% full. Dividing the number of unused blocks by the total number of blocks, and rounding up, |
|
# will result in the number specified by PART_PERCENT_FREE. |
|
# |
|
# NOTE : This behavior was previously controlled by the MAX_FREE_{n} family of parameters. {n} referred to the |
|
# disk-partition number and the value of parameter MAX_FREE_{n} was the MINIMUM number of free MB in the |
|
# partition [No clue why the word MAX was used]. As of NetDRMS 7.0, MAX_FREE_{n} has no effect.""" |
|
|
|
SUMRM_SLEEP = """ |
|
# The value is the number of seconds to sleep between iterations of the main loop in sum_rm.""" |
|
|
|
SUMRM_LOG = """ |
|
# The value is the log file (opened only at sum_rm startup; the sum_rm pid is appended to this file name).""" |
|
|
|
SUMRM_MAIL = """ |
|
# The value is the email address of the recipient to be notified in case of a problem.""" |
|
|
|
SUMRM_NOOP = """ |
|
# If the value is set to anything other than 0, then sum_rm is rendered inactive. Otherwise, sum_rm is active.""" |
|
|
|
SUMRM_USER = """ |
|
# The value designates the linux user who is allowed to run sum_rm.""" |
|
|
|
SUMRM_NORUN = """ |
|
# This pair of paramters defines a window of time, during which sum_rm will become torpid - in this |
|
# window, sum_rm will not scan for SUs to delete, not will it delete any SUs. Each value is an integer, 0-23, that |
|
# represents an hour of the day. For example, if NORUN_START=8 and NORUN_STOP=10, then between 8am and 10am |
|
# local time, sum_rm will be dormant. To disable this behavior, set both parameters to the same value.""" |
| |
RULESPREFIX = """# Standard things | RULESPREFIX = """# Standard things |
sp := $(sp).x | sp := $(sp).x |
|
|
# Read arguments | # Read arguments |
# d - localization directory | # d - localization directory |
# b - base name of all parameter files (e.g., -b drmsparams --> drmsparams.h, drmsparams.mk, drmsparams.pm, etc.) | # b - base name of all parameter files (e.g., -b drmsparams --> drmsparams.h, drmsparams.mk, drmsparams.pm, etc.) |
# m - make file |
# s - configure a NetDRMS server (i.e., SUMS server). Otherwise, do client configuration only. A server |
|
# configuration will modify something that only the production user has access to. An example is the sum_rm.cfg |
|
# file. To modify that file, the user running configure must be running configure on the SUMS-server host, and |
|
# must have write permission on sum_rm.cfg. |
def GetArgs(args): | def GetArgs(args): |
rv = bool(0) | rv = bool(0) |
optD = {} | optD = {} |
| |
try: | try: |
opts, remainder = getopt.getopt(args, "hd:b:",["dir=", "base="]) |
opts, remainder = getopt.getopt(args, "hd:b:s",["dir=", "base="]) |
except getopt.GetoptError: | except getopt.GetoptError: |
print('Usage:') | print('Usage:') |
print('localize.py [-h] -d <localization directory> -b <parameter file base>') | print('localize.py [-h] -d <localization directory> -b <parameter file base>') |
Line 129 def GetArgs(args): |
|
Line 220 def GetArgs(args): |
|
optD['dir'] = matchobj.group(1) | optD['dir'] = matchobj.group(1) |
elif opt in ("-b", "--base"): | elif opt in ("-b", "--base"): |
optD['base'] = arg | optD['base'] = arg |
|
elif opt in ("-s"): |
|
optD['server'] = "" |
else: | else: |
optD[opt] = arg | optD[opt] = arg |
| |
Line 158 def createPerlConst(key, val, keyColLen, |
|
Line 251 def createPerlConst(key, val, keyColLen, |
|
status = bool(0) | status = bool(0) |
return 'use constant ' + key + ' => ' + spaces + val + ';\n' | return 'use constant ' + key + ' => ' + spaces + val + ';\n' |
| |
|
def createPyConst(key, val, keyColLen, status): |
|
if keyColLen < len(key): |
|
status = bool(1) |
|
return None |
|
else: |
|
nsp = keyColLen - len(key) |
|
spaces = str() |
|
for isp in range(nsp): |
|
spaces += ' ' |
|
status = bool(0) |
|
return key + ' = ' + spaces + val + '\n' |
|
|
|
def createShConst(key, val, status): |
|
status = bool(0) |
|
return key + '=' + val + '\n' |
|
|
|
|
def isSupportedPlat(plat): | def isSupportedPlat(plat): |
regexp = re.compile(r"\s*(^x86_64|^ia32|^ia64|^avx)", re.IGNORECASE) | regexp = re.compile(r"\s*(^x86_64|^ia32|^ia64|^avx)", re.IGNORECASE) |
matchobj = regexp.match(plat); | matchobj = regexp.match(plat); |
Line 193 def processMakeParam(mDefs, key, val, pl |
|
Line 303 def processMakeParam(mDefs, key, val, pl |
|
machDict[varMach] = {} | machDict[varMach] = {} |
machDict[varMach][varName] = varValu | machDict[varMach][varName] = varValu |
| |
def processParam(cfgfile, line, regexpQuote, regexp, keymap, defs, cDefs, mDefsGen, mDefsMake, perlConstSection, perlInitSection, platDict, machDict, section): |
def processParam(cfgfile, line, regexpQuote, regexp, keymap, defs, cDefs, mDefsGen, mDefsMake, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection, platDict, machDict, section): |
status = 0 | status = 0 |
| |
if ''.join(section) == 'defs' or not cfgfile: | if ''.join(section) == 'defs' or not cfgfile: |
Line 252 def processParam(cfgfile, line, regexpQu |
|
Line 362 def processParam(cfgfile, line, regexpQu |
|
# Save const info to a string | # Save const info to a string |
perlConstSection.extend(list(createPerlConst(key, "'" + val + "'", 40, status))) | perlConstSection.extend(list(createPerlConst(key, "'" + val + "'", 40, status))) |
| |
|
# Python file |
|
pyConstSection.extend(list(createPyConst(key, "'" + val + "'", 40, status))) |
|
|
|
# Shell source file |
|
shConstSection.extend(list(createShConst(key, "'" + val + "'", status))) |
|
|
if status: | if status: |
raise Exception('paramNameTooLong', key) | raise Exception('paramNameTooLong', key) |
| |
Line 259 def processParam(cfgfile, line, regexpQu |
|
Line 375 def processParam(cfgfile, line, regexpQu |
|
# constants (the names of which are the parameter names) | # constants (the names of which are the parameter names) |
# we can refer to those in the init section. The key variable holds the | # we can refer to those in the init section. The key variable holds the |
# name of the constant. | # name of the constant. |
perlInitSection.extend(list('\n $self->{_paramsH}->{' + key + '} = ' + "'" + val + "';")) |
perlInitSection.extend(list("\n $self->{_paramsH}->{'" + key + "'} = " + key + ';')) |
|
|
|
# The amount of indenting matters! This is Python. |
|
pyInitSection.extend(list(" self.params['" + key + "'] = " + key + '\n')) |
else: | else: |
# No quote qualifier | # No quote qualifier |
raise Exception('missingQuoteQual', key) | raise Exception('missingQuoteQual', key) |
Line 325 def processXML(xml, projRules, projTarge |
|
Line 444 def processXML(xml, projRules, projTarge |
|
| |
return rv | return rv |
| |
def determineSection(line, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg): |
def determineSection(line, regexpStyle, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg): |
|
matchobj = regexpStyle.match(line) |
|
if matchobj: |
|
return 'style' |
|
|
matchobj = regexpDefs.match(line) | matchobj = regexpDefs.match(line) |
if not matchobj is None: | if not matchobj is None: |
return 'defs' | return 'defs' |
Line 353 def determineSection(line, regexpDefs, r |
|
Line 476 def determineSection(line, regexpDefs, r |
|
# projMkRules is the list containing the make_basic.mk content. | # projMkRules is the list containing the make_basic.mk content. |
# projRules is the list containing the Rules.mk content. | # projRules is the list containing the Rules.mk content. |
# projTargert is the list containing the target.mk content. | # projTargert is the list containing the target.mk content. |
def parseConfig(fin, keymap, addenda, defs, cDefs, mDefsGen, mDefsMake, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection): |
def parseConfig(fin, keymap, addenda, defs, cDefs, mDefsGen, mDefsMake, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection): |
rv = bool(0) | rv = bool(0) |
| |
# Open required config file (config.local) | # Open required config file (config.local) |
try: | try: |
# Examine each line, looking for key=value pairs. | # Examine each line, looking for key=value pairs. |
|
regexpStyle = re.compile(r"^__STYLE__") |
regexpDefs = re.compile(r"^__DEFS__") | regexpDefs = re.compile(r"^__DEFS__") |
regexpMake = re.compile(r"^__MAKE__") | regexpMake = re.compile(r"^__MAKE__") |
regexpProjMkRules = re.compile(r"__PROJ_MK_RULES__") | regexpProjMkRules = re.compile(r"__PROJ_MK_RULES__") |
Line 370 def parseConfig(fin, keymap, addenda, de |
|
Line 494 def parseConfig(fin, keymap, addenda, de |
|
regexpCustMkBeg = re.compile(r"^_CUST_") | regexpCustMkBeg = re.compile(r"^_CUST_") |
regexpCustMkEnd = re.compile(r"^_ENDCUST_") | regexpCustMkEnd = re.compile(r"^_ENDCUST_") |
regexpDiv = re.compile(r"^__") | regexpDiv = re.compile(r"^__") |
regexp = re.compile(r"^\s*(\S+)\s+(\S+)") |
regexp = re.compile(r"^\s*(\S+)\s+(\S.*)") |
| |
|
ignoreKeymap = False |
platDict = {} | platDict = {} |
machDict = {} | machDict = {} |
| |
Line 390 def parseConfig(fin, keymap, addenda, de |
|
Line 515 def parseConfig(fin, keymap, addenda, de |
|
# Skip whitespace line | # Skip whitespace line |
continue | continue |
| |
newSection = determineSection(line, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
newSection = determineSection(line, regexpStyle, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
|
if not newSection is None: |
|
section = newSection |
|
|
|
if not section: |
|
raise Exception('invalidConfigFile', 'line ' + line.strip() + ' is not in any section') |
|
|
|
if section == 'style': |
|
# if the config.local file has new in the __STYLE__ section, then ignore the keymap and treat config.local like configsdp.txt; |
|
# do not map from NetDRMS config.local parameter names to configsdp.txt names |
|
for line in fin: |
|
matchobj = regexpDiv.match(line) |
|
if matchobj: |
|
break; |
|
if line.strip(' \n').lower() == 'new' and keymap: |
|
ignoreKeymap = True |
|
|
|
newSection = determineSection(line, regexpStyle, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
if not newSection is None: | if not newSection is None: |
section = newSection | section = newSection |
|
continue |
|
elif section == 'make': |
| |
if section == 'make': |
|
# There are some blocks of lines in the __MAKE__ section that must be copied ver batim to the output make file. | # There are some blocks of lines in the __MAKE__ section that must be copied ver batim to the output make file. |
# The blocks are defined by _CUST_/_ENDCUST_ tags. | # The blocks are defined by _CUST_/_ENDCUST_ tags. |
matchobj = regexpCustMkBeg.match(line) | matchobj = regexpCustMkBeg.match(line) |
Line 406 def parseConfig(fin, keymap, addenda, de |
|
Line 549 def parseConfig(fin, keymap, addenda, de |
|
if not matchobj is None: | if not matchobj is None: |
break; | break; |
mDefsMake.extend(list(line)) | mDefsMake.extend(list(line)) |
newSection = determineSection(line, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
newSection = determineSection(line, regexpStyle, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
if not newSection is None: | if not newSection is None: |
section = newSection | section = newSection |
continue | continue |
# Intentional fall through to next if statement | # Intentional fall through to next if statement |
if section == 'defs' or section == 'make': | if section == 'defs' or section == 'make': |
iscfg = bool(1) | iscfg = bool(1) |
ppRet = processParam(iscfg, line, regexpQuote, regexp, keymap, defs, cDefs, mDefsGen, mDefsMake, perlConstSection, perlInitSection, platDict, machDict, section) |
if ignoreKeymap: |
|
keymapActual = None |
|
else: |
|
keymapActual = keymap |
|
ppRet = processParam(iscfg, line, regexpQuote, regexp, keymapActual, defs, cDefs, mDefsGen, mDefsMake, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection, platDict, machDict, section) |
| |
if ppRet: | if ppRet: |
break; |
break |
elif section == 'projcfg': | elif section == 'projcfg': |
# Copy the line ver batim to the projCfg list (configure) | # Copy the line ver batim to the projCfg list (configure) |
for line in fin: | for line in fin: |
Line 424 def parseConfig(fin, keymap, addenda, de |
|
Line 571 def parseConfig(fin, keymap, addenda, de |
|
if not matchobj is None: | if not matchobj is None: |
break; | break; |
projCfg.extend(list(line)) | projCfg.extend(list(line)) |
newSection = determineSection(line, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
newSection = determineSection(line, regexpStyle, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
if not newSection is None: | if not newSection is None: |
section = newSection | section = newSection |
continue | continue |
Line 435 def parseConfig(fin, keymap, addenda, de |
|
Line 582 def parseConfig(fin, keymap, addenda, de |
|
if not matchobj is None: | if not matchobj is None: |
break; | break; |
projMkRules.extend(list(line)) | projMkRules.extend(list(line)) |
newSection = determineSection(line, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
newSection = determineSection(line, regexpStyle, regexpDefs, regexpMake, regexpProjMkRules, regexpProj, regexpProjCfg) |
if not newSection is None: | if not newSection is None: |
section = newSection | section = newSection |
continue | continue |
Line 443 def parseConfig(fin, keymap, addenda, de |
|
Line 590 def parseConfig(fin, keymap, addenda, de |
|
# Must parse xml and use the project-specific information to populate the Rules.mk and target.mk files. | # Must parse xml and use the project-specific information to populate the Rules.mk and target.mk files. |
# Collect all xml lines for now, then process after file-read loop. | # Collect all xml lines for now, then process after file-read loop. |
if xml is None: | if xml is None: |
xml = line |
# The first time through this section, line is the config.local div, __PROJ__. Discard that. |
|
xml = '' |
|
continue |
else: | else: |
xml += line | xml += line |
else: | else: |
# Unknown section | # Unknown section |
raise Exception('unknownSection', section) | raise Exception('unknownSection', section) |
except Exception as exc: | except Exception as exc: |
|
if len(exc.args) >= 2: |
msg = exc.args[0] | msg = exc.args[0] |
if msg == 'badKeyMapKey': |
else: |
|
# re-raise the exception |
|
raise |
|
|
|
if msg == 'invalidConfigFile': |
|
violator = exc.args[1] |
|
print(violator, file=sys.stderr) |
|
rv = bool(1) |
|
elif msg == 'badKeyMapKey': |
# If we are here, then there was a non-empty keymap, and the parameter came from | # If we are here, then there was a non-empty keymap, and the parameter came from |
# the configuration file. | # the configuration file. |
violator = exc.args[1] | violator = exc.args[1] |
print('Unknown parameter name ' + "'" + violator + "'" + ' in ' + cfgfile + '.', file=sys.stderr) |
print('Unknown parameter name ' + "'" + violator + "'" + ' in ' + fin.name + '.', file=sys.stderr) |
rv = bool(1) | rv = bool(1) |
elif msg == 'badQuoteQual': | elif msg == 'badQuoteQual': |
# The bad quote qualifier came from the configuration file, not the addenda, since | # The bad quote qualifier came from the configuration file, not the addenda, since |
# we will have fixed any bad qualifiers in the addenda (which is populated by code). | # we will have fixed any bad qualifiers in the addenda (which is populated by code). |
violator = exc.args[1] | violator = exc.args[1] |
print('Unknown quote qualifier ' + "'" + violator + "'" + ' in ' + cfgfile + '.', file=sys.stderr) |
print('Unknown quote qualifier ' + "'" + violator + "'" + ' in ' + fin.name + '.', file=sys.stderr) |
rv = bool(1) | rv = bool(1) |
elif msg == 'missingQuoteQual': | elif msg == 'missingQuoteQual': |
violator = exc.args[1] | violator = exc.args[1] |
print('Missing quote qualifier for parameter ' + "'" + violator + "'" + ' in ' + cfgfile + '.', file=sys.stderr) |
print('Missing quote qualifier for parameter ' + "'" + violator + "'" + ' in ' + fin.name + '.', file=sys.stderr) |
rv = bool(1) | rv = bool(1) |
elif msg == 'paramNameTooLong': | elif msg == 'paramNameTooLong': |
violator = exc.args[1] | violator = exc.args[1] |
Line 482 def parseConfig(fin, keymap, addenda, de |
|
Line 640 def parseConfig(fin, keymap, addenda, de |
|
if not rv: | if not rv: |
if not xml is None: | if not xml is None: |
# Process xml. | # Process xml. |
projRules.extend(list(RULESPREFIX)) |
|
projTarget.extend(list(TARGETPREFIX)) |
|
rv = processXML(xml, projRules, projTarget) | rv = processXML(xml, projRules, projTarget) |
projRules.extend(RULESSUFFIX) |
|
| |
# Process addenda - these are parameters that are not configurable and must be set in the | # Process addenda - these are parameters that are not configurable and must be set in the |
# NetDRMS build. | # NetDRMS build. |
Line 493 def parseConfig(fin, keymap, addenda, de |
|
Line 648 def parseConfig(fin, keymap, addenda, de |
|
iscfg = bool(0) | iscfg = bool(0) |
for key in addenda: | for key in addenda: |
item = key + ' ' + addenda[key] | item = key + ' ' + addenda[key] |
ppRet = processParam(iscfg, item, regexpQuote, regexp, keymap, defs, cDefs, mDefsGen, mDefsMake, perlConstSection, perlInitSection, platDict, machDict, 'defs') |
if ignoreKeymap: |
|
keymapActual = None |
|
else: |
|
keymapActual = keymap |
|
ppRet = processParam(iscfg, item, regexpQuote, regexp, keymapActual, defs, cDefs, mDefsGen, mDefsMake, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection, platDict, machDict, 'defs') |
if ppRet: | if ppRet: |
break; | break; |
| |
Line 509 def parseConfig(fin, keymap, addenda, de |
|
Line 668 def parseConfig(fin, keymap, addenda, de |
|
if not rv: | if not rv: |
for mach in machDict: | for mach in machDict: |
mDefsMake.extend(list('\nifeq ($(MACHTYPE), ' + mach + ')')) | mDefsMake.extend(list('\nifeq ($(MACHTYPE), ' + mach + ')')) |
for var in platDict[plat]: |
for var in machDict[mach]: |
mDefsMake.extend(list('\n' + var + ' = ' + platDict[plat][var])) |
mDefsMake.extend(list('\n' + var + ' = ' + machDict[mach][var])) |
mDefsMake.extend(list('\nendif\n')) | mDefsMake.extend(list('\nendif\n')) |
|
|
return rv | return rv |
| |
def getMgrUIDLine(defs, uidParam): | def getMgrUIDLine(defs, uidParam): |
Line 553 def configureComps(defs, mDefs): |
|
Line 711 def configureComps(defs, mDefs): |
|
hasgfort = bool(0) | hasgfort = bool(0) |
| |
# Try icc. | # Try icc. |
cmd = 'icc -V 2>&1' |
cmd = 'icc --version 2>&1' |
try: | try: |
ret = check_output(cmd, shell=True) | ret = check_output(cmd, shell=True) |
ret = ret.decode("utf-8") | ret = ret.decode("utf-8") |
Line 562 def configureComps(defs, mDefs): |
|
Line 720 def configureComps(defs, mDefs): |
|
rv = bool(1) | rv = bool(1) |
| |
if not rv: | if not rv: |
regexp = re.compile(r".+Version\s+(\d+)[.](\d+)", re.DOTALL) |
regexp = re.compile(r"\s*\S+\s+\S+\s+(\d+)[.](\d+)", re.DOTALL) |
matchobj = regexp.match(ret) | matchobj = regexp.match(ret) |
if matchobj is None: | if matchobj is None: |
raise Exception('unexpectedIccRet', ret) | raise Exception('unexpectedIccRet', ret) |
Line 574 def configureComps(defs, mDefs): |
|
Line 732 def configureComps(defs, mDefs): |
|
| |
# Try gcc. | # Try gcc. |
if not hasicc: | if not hasicc: |
|
rv = bool(0) |
cmd = 'gcc -v 2>&1' | cmd = 'gcc -v 2>&1' |
try: | try: |
ret = check_output(cmd, shell=True) | ret = check_output(cmd, shell=True) |
Line 582 def configureComps(defs, mDefs): |
|
Line 741 def configureComps(defs, mDefs): |
|
print('Command ' + "'" + cmd + "'" + ' ran improperly.') | print('Command ' + "'" + cmd + "'" + ' ran improperly.') |
rv = bool(1) | rv = bool(1) |
| |
if rv == bool(0): |
if not rv: |
regexp = re.compile(r".+gcc\s+version\s+(\d+)\.(\d+)", re.DOTALL) | regexp = re.compile(r".+gcc\s+version\s+(\d+)\.(\d+)", re.DOTALL) |
matchobj = regexp.match(ret) | matchobj = regexp.match(ret) |
if matchobj is None: | if matchobj is None: |
Line 594 def configureComps(defs, mDefs): |
|
Line 753 def configureComps(defs, mDefs): |
|
hasgcc = bool(1) | hasgcc = bool(1) |
| |
# Try ifort. | # Try ifort. |
cmd = 'ifort -V 2>&1' |
rv = bool(0) |
|
cmd = 'ifort --version 2>&1' |
try: | try: |
ret = check_output(cmd, shell=True) | ret = check_output(cmd, shell=True) |
ret = ret.decode("utf-8") | ret = ret.decode("utf-8") |
Line 603 def configureComps(defs, mDefs): |
|
Line 763 def configureComps(defs, mDefs): |
|
rv = bool(1) | rv = bool(1) |
| |
if not rv: | if not rv: |
regexp = re.compile(r".+Version\s+(\d+)\.(\d+)", re.DOTALL) |
regexp = re.compile(r"\s*\S+\s+\S+\s+(\d+)\.(\d+)", re.DOTALL) |
matchobj = regexp.match(ret) | matchobj = regexp.match(ret) |
if matchobj is None: | if matchobj is None: |
raise Exception('unexpectedIfortRet', ret) | raise Exception('unexpectedIfortRet', ret) |
Line 615 def configureComps(defs, mDefs): |
|
Line 775 def configureComps(defs, mDefs): |
|
| |
# Try gfortran | # Try gfortran |
if not hasifort: | if not hasifort: |
|
rv = bool(0) |
cmd = 'gfortran -v 2>&1' | cmd = 'gfortran -v 2>&1' |
try: | try: |
ret = check_output(cmd, shell=True) | ret = check_output(cmd, shell=True) |
Line 623 def configureComps(defs, mDefs): |
|
Line 784 def configureComps(defs, mDefs): |
|
print('Command ' + "'" + cmd + "'" + ' ran improperly.') | print('Command ' + "'" + cmd + "'" + ' ran improperly.') |
rv = bool(1) | rv = bool(1) |
| |
if rv == bool(0): |
if not rv: |
regexp = re.compile(r".+gcc\s+version\s+(\d+)\.(\d+)", re.DOTALL) | regexp = re.compile(r".+gcc\s+version\s+(\d+)\.(\d+)", re.DOTALL) |
matchobj = regexp.match(ret) | matchobj = regexp.match(ret) |
if matchobj is None: | if matchobj is None: |
Line 635 def configureComps(defs, mDefs): |
|
Line 796 def configureComps(defs, mDefs): |
|
hasgfort = bool(1) | hasgfort = bool(1) |
| |
# Append the compiler make variables to the make file | # Append the compiler make variables to the make file |
|
rv = bool(0) |
|
|
if not hasicc and not hasgcc: | if not hasicc and not hasgcc: |
print('Fatal error: Acceptable C compiler not found! You will be unable to build the DRMS library.', file=sys.stderr) | print('Fatal error: Acceptable C compiler not found! You will be unable to build the DRMS library.', file=sys.stderr) |
rv = bool(1) | rv = bool(1) |
elif hasicc: | elif hasicc: |
mDefs.extend(list('\nCOMPILER = icc')) | mDefs.extend(list('\nCOMPILER = icc')) |
|
# mDefs.extend(list('\nICC_VERSION = blah')) |
else: | else: |
mDefs.extend(list('\nCOMPILER = gcc')) | mDefs.extend(list('\nCOMPILER = gcc')) |
| |
Line 651 def configureComps(defs, mDefs): |
|
Line 815 def configureComps(defs, mDefs): |
|
mDefs.extend(list('\nFCOMPILER = gfortran')) | mDefs.extend(list('\nFCOMPILER = gfortran')) |
| |
# Environment overrides. These get written, regardless of the disposition of auto-configuration. | # Environment overrides. These get written, regardless of the disposition of auto-configuration. |
mDefs.extend(list('\nifneq $(JSOC_COMPILER,)\n COMPILER = $(JSOC_COMPILER)\nendif')) |
mDefs.extend(list('\nifneq ($(JSOC_COMPILER),)\n COMPILER = $(JSOC_COMPILER)\nendif')) |
mDefs.extend(list('\nifneq $(JSOC_FCOMPILER,)\n FCOMPILER = $(JSOC_FCOMPILER)\nendif')) |
mDefs.extend(list('\nifneq ($(JSOC_FCOMPILER),)\n FCOMPILER = $(JSOC_FCOMPILER)\nendif')) |
| |
return rv | return rv |
| |
def writeParamsFiles(base, cfile, mfile, pfile, cDefs, mDefsGen, mDefsMake, mDefsComps, perlConstSection, perlInitSection): |
def writeParamsFiles(base, cfile, mfile, pfile, pyfile, shfile, cDefs, mDefsGen, mDefsMake, mDefsComps, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection): |
rv = bool(0) | rv = bool(0) |
| |
# Merge mDefsGen, mDefsMake, and mDefsComps into a single string with compiler configuration first, general parameters next, then | # Merge mDefsGen, mDefsMake, and mDefsComps into a single string with compiler configuration first, general parameters next, then |
Line 664 def writeParamsFiles(base, cfile, mfile, |
|
Line 828 def writeParamsFiles(base, cfile, mfile, |
|
mDefs = '\n# Compiler Selection\n' + ''.join(mDefsComps) + '\n\n# General Parameters\n' + ''.join(mDefsGen) + '\n\n# Parameters to Configure make\n' + ''.join(mDefsMake) | mDefs = '\n# Compiler Selection\n' + ''.join(mDefsComps) + '\n\n# General Parameters\n' + ''.join(mDefsGen) + '\n\n# Parameters to Configure make\n' + ''.join(mDefsMake) |
| |
try: | try: |
with open(cfile, 'w') as cout, open(mfile, 'w') as mout, open(pfile, 'w') as pout: |
with open(cfile, 'w') as cout, open(mfile, 'w') as mout, open(pfile, 'w') as pout, open(pyfile, 'w') as pyout, open(shfile, 'w') as shout: |
# C file of macros | # C file of macros |
print(C_PREFIX, file=cout) | print(C_PREFIX, file=cout) |
print('/* This file contains a set of preprocessor macros - one for each configuration parameter. */\n', file=cout) | print('/* This file contains a set of preprocessor macros - one for each configuration parameter. */\n', file=cout) |
Line 693 def writeParamsFiles(base, cfile, mfile, |
|
Line 857 def writeParamsFiles(base, cfile, mfile, |
|
print(''.join(perlInitSection), file=pout) | print(''.join(perlInitSection), file=pout) |
print('}\n', file=pout) | print('}\n', file=pout) |
print(PERL_FXNS_B, file=pout) | print(PERL_FXNS_B, file=pout) |
|
|
|
# Python module |
|
print(PY_BINPATH, file=pyout) |
|
print(PREFIX, file=pyout) |
|
print('# This file contains a set of constants - one for each configuration parameter.\n', file=pyout) |
|
print(''.join(pyConstSection), file=pyout) |
|
print(PY_FXNS_A, file=pyout, end='') |
|
print(''.join(pyInitSection), file=pyout) |
|
print(PY_FXNS_B, file=pyout) |
|
print(PY_FXNS_C, file=pyout) |
|
|
|
# Shell (bash) source file |
|
print(SH_BINPATH, file=shout) |
|
print(PREFIX, file=shout) |
|
print('# This file contains a set of variable assignments - one for each configuration parameter.\n', file=shout) |
|
print(''.join(shConstSection), file=shout) |
|
|
except IOError as exc: | except IOError as exc: |
type, value, traceback = sys.exc_info() | type, value, traceback = sys.exc_info() |
print(exc.strerror, file=sys.stderr) | print(exc.strerror, file=sys.stderr) |
Line 734 def writeProjFiles(pCfile, pMfile, pRfil |
|
Line 915 def writeProjFiles(pCfile, pMfile, pRfil |
|
rv = bool(1) | rv = bool(1) |
| |
if not rv: | if not rv: |
|
if os.path.exists(pCfile): |
try: | try: |
os.chmod(pCfile, stat.S_IRWXU | stat.S_IRGRP | stat.S_IROTH) | os.chmod(pCfile, stat.S_IRWXU | stat.S_IRGRP | stat.S_IROTH) |
except OSError as exc: | except OSError as exc: |
|
type, value, traceback = sys.exc_info() |
|
print('Unable to chmod file ' + "'" + value.filename + "'.", file=sys.stderr) |
print(exc.strerror, file=sys.stderr) | print(exc.strerror, file=sys.stderr) |
rv = bool(1) | rv = bool(1) |
| |
return rv | return rv |
| |
def configureNet(cfgfile, cfile, mfile, pfile, pCfile, pMfile, pRfile, pTfile, base, keymap): |
def generateSumRmCfg(defs): |
|
rv = bool(0) |
|
# ACK! Remember that Rick renamed these parameters. The ones in config.local are the aliases - do not use those. |
|
# Use the ones that those map to (defined in config.local.map). |
|
cFileTmp = defs['SUMLOG_BASEDIR'] + '/' + '.sum_rm.cfg.tmp' |
|
cFile = defs['SUMLOG_BASEDIR'] + '/' + 'sum_rm.cfg' |
|
|
|
# Write a temporary file sum_rm configuration file. |
|
try: |
|
with open(cFileTmp, 'w') as fout: |
|
# Print comment at the top of the configuration file. |
|
print(SUMRM_COMMENT, file=fout) |
|
print(SUMRM_DOC, file=fout) |
|
print(SUMRM_PARTN_PERCENT_FREE, file=fout) |
|
if 'SUMRM_PART_PERCENT_FREE' in defs: |
|
print('PART_PERCENT_FREE=' + defs['SUMRM_PART_PERCENT_FREE'], file=fout) |
|
else: |
|
print('PART_PERCENT_FREE=3', file=fout) |
|
|
|
print(SUMRM_SLEEP, file=fout) |
|
if 'SUMRM_SLEEP' in defs: |
|
print('SLEEP=' + defs['SUMRM_SLEEP'], file=fout) |
|
else: |
|
print('SLEEP=300', file=fout) |
|
|
|
print(SUMRM_LOG, file=fout) |
|
if 'SUMRM_LOG' in defs: |
|
print('LOG=' + defs['SUMRM_LOG'], file=fout) |
|
else: |
|
print('LOG=/tmp/sum_rm.log', file=fout) |
|
|
|
print(SUMRM_MAIL, file=fout) |
|
# No default for mail - don't send nothing to nobody unless the operator has asked for notifications. |
|
if 'SUMRM_MAIL' in defs: |
|
print('MAIL=' + defs['SUMRM_MAIL'], file=fout) |
|
else: |
|
print('# MAIL=president@whitehouse.gov', file=fout) |
|
|
|
print(SUMRM_NOOP, file=fout) |
|
if 'SUMRM_NOOP' in defs: |
|
print('NOOP=' + defs['SUMRM_NOOP'], file=fout) |
|
else: |
|
print('NOOP=0', file=fout) |
|
|
|
print(SUMRM_USER, file=fout) |
|
if 'SUMRM_USER' in defs: |
|
print('USER=' + defs['SUMRM_USER'], file=fout) |
|
else: |
|
print('USER=production', file=fout) |
|
|
|
print(SUMRM_NORUN, file=fout) |
|
# Default norun window is to have no such window. This can be accomplished by simply not providing either argument. |
|
if 'SUMRM_NORUN_START' in defs or 'SUMRM_NORUN_STOP' in defs: |
|
if 'SUMRM_NORUN_START' in defs: |
|
print('NORUN_START=' + defs['SUMRM_NORUN_START'], file=fout) |
|
else: |
|
print('NORUN_START=0', file=fout) |
|
if 'SUMRM_NORUN_STOP' in defs: |
|
print('NORUN_STOP=' + defs['SUMRM_NORUN_STOP'], file=fout) |
|
else: |
|
print('NORUN_STOP=0', file=fout) |
|
else: |
|
print('# NORUN_START=0', file=fout) |
|
print('# NORUN_STOP=0', file=fout) |
|
|
|
except OSError: |
|
print('Unable to open sum_rm temporary configuration file ' + cFileTmp + 'for writing.', file=sys.stderr) |
|
rv = bool(1) |
|
|
|
# If the content of the temporary file differs from the content of the existing configuration file, then overwrite |
|
# the original file. Otherwise, delete the temporary file |
|
if not rv: |
|
try: |
|
if filecmp.cmp(cFile, cFileTmp): |
|
# Files identical - delete temporary file |
|
try: |
|
os.remove(cFileTmp) |
|
|
|
except OSError as exc: |
|
print('Unable to remove temporary file ' + exc.filename + '.', file=sys.stderr) |
|
print(exc.strerr, file=sys.stderr) |
|
else: |
|
# Replace original with temporary file |
|
try: |
|
os.rename(cFileTmp, cFile) |
|
|
|
except OSError as exc: |
|
print('Unable to update sum_rm configuration file ' + cFile + '.', file=sys.stderr) |
|
print(exc.strerr, file=sys.stderr) |
|
rv = bool(1) |
|
except OSError as exc: |
|
# One of the files doesn't exist. |
|
if exc.filename == cFile: |
|
# We are ok - there might be no configuration file yet. |
|
# Replace original with temporary file |
|
try: |
|
os.rename(cFileTmp, cFile) |
|
|
|
except OSError as exc: |
|
print('Unable to update sum_rm configuration file ' + cFile + '.', file=sys.stderr) |
|
print(exc.strerr, file=sys.stderr) |
|
rv = bool(1) |
|
else: |
|
# There is a problem with the temp file - bail. |
|
print('Unable to update sum_rm configuration file ' + cFile + '.', file=sys.stderr) |
|
print(exc.strerr, file=sys.stderr) |
|
rv = bool(1) |
|
|
|
return rv |
|
|
|
def configureNet(cfgfile, cfile, mfile, pfile, pyfile, shfile, pCfile, pMfile, pRfile, pTfile, base, keymap, createSumRmCfg): |
rv = bool(0) | rv = bool(0) |
| |
defs = {} | defs = {} |
Line 756 def configureNet(cfgfile, cfile, mfile, |
|
Line 1050 def configureNet(cfgfile, cfile, mfile, |
|
projTarget = list() | projTarget = list() |
perlConstSection = list() | perlConstSection = list() |
perlInitSection = list() | perlInitSection = list() |
|
pyConstSection = list() |
|
pyInitSection = list() |
|
shConstSection = list() |
addenda = {} | addenda = {} |
| |
# There are three parameters that were not included in the original config.local parameter set, for some reason. | # There are three parameters that were not included in the original config.local parameter set, for some reason. |
Line 773 def configureNet(cfgfile, cfile, mfile, |
|
Line 1070 def configureNet(cfgfile, cfile, mfile, |
|
try: | try: |
with open(cfgfile, 'r') as fin: | with open(cfgfile, 'r') as fin: |
# Process configuration parameters | # Process configuration parameters |
rv = parseConfig(fin, keymap, addenda, defs, cDefs, mDefsGen, mDefsMake, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection) |
|
|
# Always create a Rules.mk and target.mk, even if no proj XML is provided. All builds should have the proj/example and |
|
# proj/cookbook directories. The required make information is in RULESPREFIX, TARGETPREFIX, and RULESSUFFIX. RULESSUFFIX |
|
# must be added after the xml has been parsed. |
|
projRules.extend(list(RULESPREFIX)) |
|
projTarget.extend(list(TARGETPREFIX)) |
|
|
|
rv = parseConfig(fin, keymap, addenda, defs, cDefs, mDefsGen, mDefsMake, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection) |
if not rv: | if not rv: |
|
projRules.extend(RULESSUFFIX) |
|
|
# Must add a parameter for the SUMS_MANAGER UID (for some reason). This must be done after the | # Must add a parameter for the SUMS_MANAGER UID (for some reason). This must be done after the |
# config file is processed since an input to getMgrUIDLine() is one of the config file's | # config file is processed since an input to getMgrUIDLine() is one of the config file's |
# parameter values. | # parameter values. |
uidParam = {} | uidParam = {} |
rv = getMgrUIDLine(defs, uidParam) | rv = getMgrUIDLine(defs, uidParam) |
if rv == bool(0): | if rv == bool(0): |
rv = parseConfig(None, keymap, uidParam, defs, cDefs, mDefsGen, None, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection) |
rv = parseConfig(None, keymap, uidParam, defs, cDefs, mDefsGen, None, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection) |
|
|
# Configure the compiler-selection make variables. | # Configure the compiler-selection make variables. |
if not rv: | if not rv: |
rv = configureComps(defs, mDefsComps) | rv = configureComps(defs, mDefsComps) |
| |
# Write out the parameter files. | # Write out the parameter files. |
if not rv: | if not rv: |
rv = writeParamsFiles(base, cfile, mfile, pfile, cDefs, mDefsGen, mDefsMake, mDefsComps, perlConstSection, perlInitSection) |
rv = writeParamsFiles(base, cfile, mfile, pfile, pyfile, shfile, cDefs, mDefsGen, mDefsMake, mDefsComps, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection) |
| |
# Write out the project-specific make files (make_basic.mk, Rules.mk, and target.mk). | # Write out the project-specific make files (make_basic.mk, Rules.mk, and target.mk). |
if not rv: | if not rv: |
rv = writeProjFiles(pCfile, pMfile, pRfile, pTfile, projCfg, projMkRules, projRules, projTarget) | rv = writeProjFiles(pCfile, pMfile, pRfile, pTfile, projCfg, projMkRules, projRules, projTarget) |
| |
|
# Write out the sum_rm.cfg file. |
|
if not rv and createSumRmCfg: |
|
rv = generateSumRmCfg(defs) |
except IOError as exc: | except IOError as exc: |
print(exc.strerror, file=sys.stderr) | print(exc.strerror, file=sys.stderr) |
print('Unable to read configuration file ' + cfgfile + '.', file=sys.stderr) | print('Unable to read configuration file ' + cfgfile + '.', file=sys.stderr) |
except Exception as exc: | except Exception as exc: |
|
if len(exc.args) >= 2: |
type, msg = exc.args | type, msg = exc.args |
|
else: |
|
# re-raise the exception |
|
raise |
|
|
if type == 'unexpectedIccRet': | if type == 'unexpectedIccRet': |
print('icc -V returned this unexpected message:\n' + msg, file=sys.stderr) | print('icc -V returned this unexpected message:\n' + msg, file=sys.stderr) |
rv = bool(1) | rv = bool(1) |
Line 818 def configureNet(cfgfile, cfile, mfile, |
|
Line 1131 def configureNet(cfgfile, cfile, mfile, |
|
| |
return rv | return rv |
| |
def configureSdp(cfgfile, cfile, mfile, pfile, pCfile, pMfile, pRfile, pTfile, base): |
def configureSdp(cfgfile, cfile, mfile, pfile, pyfile, shfile, pCfile, pMfile, pRfile, pTfile, base): |
rv = bool(0) | rv = bool(0) |
| |
defs = {} | defs = {} |
Line 832 def configureSdp(cfgfile, cfile, mfile, |
|
Line 1145 def configureSdp(cfgfile, cfile, mfile, |
|
mDefsComps = list() | mDefsComps = list() |
perlConstSection = list() | perlConstSection = list() |
perlInitSection = list() | perlInitSection = list() |
|
pyConstSection = list() |
|
pyInitSection = list() |
|
shConstSection = list() |
|
|
addenda = {} | addenda = {} |
| |
# There are three parameters that were not included in the original config.local parameter set, for some reason. | # There are three parameters that were not included in the original config.local parameter set, for some reason. |
Line 845 def configureSdp(cfgfile, cfile, mfile, |
|
Line 1162 def configureSdp(cfgfile, cfile, mfile, |
|
| |
try: | try: |
with open(cfgfile, 'r') as fin: | with open(cfgfile, 'r') as fin: |
rv = parseConfig(fin, None, addenda, defs, cDefs, mDefsGen, mDefsMake, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection) |
|
|
# Always create a Rules.mk and target.mk, even if no proj XML is provided. All builds should have the proj/example and |
|
# proj/cookbook directories. The required make information is in RULESPREFIX, TARGETPREFIX, and RULESSUFFIX. RULESSUFFIX |
|
# must be added after the xml has been parsed. |
|
projRules.extend(list(RULESPREFIX)) |
|
projTarget.extend(list(TARGETPREFIX)) |
|
|
|
rv = parseConfig(fin, None, addenda, defs, cDefs, mDefsGen, mDefsMake, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection) |
| |
if not rv: | if not rv: |
|
projRules.extend(RULESSUFFIX) |
|
|
# Must add a parameter for the SUMS_MANAGER UID (for some reason) | # Must add a parameter for the SUMS_MANAGER UID (for some reason) |
uidParam = {} | uidParam = {} |
rv = getMgrUIDLine(defs, uidParam) | rv = getMgrUIDLine(defs, uidParam) |
if not rv: | if not rv: |
rv = parseConfig(None, None, uidParam, defs, cDefs, mDefsGen, None, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection) |
rv = parseConfig(None, None, uidParam, defs, cDefs, mDefsGen, None, projCfg, projMkRules, projRules, projTarget, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection) |
| |
# Configure the compiler-selection make variables. | # Configure the compiler-selection make variables. |
if not rv: | if not rv: |
Line 860 def configureSdp(cfgfile, cfile, mfile, |
|
Line 1186 def configureSdp(cfgfile, cfile, mfile, |
|
| |
# Write out the parameter files. | # Write out the parameter files. |
if not rv: | if not rv: |
rv = writeParamsFiles(base, cfile, mfile, pfile, cDefs, mDefsGen, mDefsMake, mDefsComps, perlConstSection, perlInitSection) |
rv = writeParamsFiles(base, cfile, mfile, pfile, pyfile, shfile, cDefs, mDefsGen, mDefsMake, mDefsComps, perlConstSection, perlInitSection, pyConstSection, pyInitSection, shConstSection) |
| |
# Write out the project-specific make files (make_basic.mk, Rules.mk, and target.mk). | # Write out the project-specific make files (make_basic.mk, Rules.mk, and target.mk). |
if not rv: | if not rv: |
rv = writeProjFiles(pCfile, pMfile, pRfile, pTfile, projCfg, projMkRules, projRules, projTarget) | rv = writeProjFiles(pCfile, pMfile, pRfile, pTfile, projCfg, projMkRules, projRules, projTarget) |
|
|
|
# At Stanford, skip the creation of the sum_rm configuration file. config.local will still |
|
# have the SUMRM parameters, but they will not be used. |
except IOError as exc: | except IOError as exc: |
print(exc.strerror, file=sys.stderr) | print(exc.strerror, file=sys.stderr) |
print('Unable to read configuration file ' + cfgfile + '.', file=sys.stderr) | print('Unable to read configuration file ' + cfgfile + '.', file=sys.stderr) |
except Exception as exc: | except Exception as exc: |
|
if len(exc.args) >= 2: |
type = exc.args[0] | type = exc.args[0] |
|
else: |
|
# re-raise the exception |
|
raise |
|
|
if type == 'unexpectedIccRet': | if type == 'unexpectedIccRet': |
msg = exc.args[1] | msg = exc.args[1] |
print('icc -V returned this unexpected message:\n' + msg, file=sys.stderr) | print('icc -V returned this unexpected message:\n' + msg, file=sys.stderr) |
Line 918 if rv == RET_SUCCESS: |
|
Line 1252 if rv == RET_SUCCESS: |
|
cfile = optD['dir'] + '/' + optD['base'] + '.h' | cfile = optD['dir'] + '/' + optD['base'] + '.h' |
mfile = optD['dir'] + '/' + optD['base'] + '.mk' | mfile = optD['dir'] + '/' + optD['base'] + '.mk' |
pfile = optD['dir'] + '/' + optD['base'] + '.pm' | pfile = optD['dir'] + '/' + optD['base'] + '.pm' |
|
pyfile = optD['dir'] + '/' + optD['base'] + '.py' |
|
shfile = optD['dir'] + '/' + optD['base'] + '.sh' |
pCfile = optD['dir'] + '/configure' | pCfile = optD['dir'] + '/configure' |
pMfile = optD['dir'] + '/make_basic.mk' | pMfile = optD['dir'] + '/make_basic.mk' |
pRfile = optD['dir'] + '/Rules.mk' | pRfile = optD['dir'] + '/Rules.mk' |
Line 948 if rv == RET_SUCCESS: |
|
Line 1284 if rv == RET_SUCCESS: |
|
| |
# We also need to set the UID of the SUMS manager. We have the name of the | # We also need to set the UID of the SUMS manager. We have the name of the |
# SUMS manager (it is in the configuration file) | # SUMS manager (it is in the configuration file) |
configureNet(NET_CFG, cfile, mfile, pfile, pCfile, pMfile, pRfile, pTfile, optD['base'], keymap) |
configureNet(NET_CFG, cfile, mfile, pfile, pyfile, shfile, pCfile, pMfile, pRfile, pTfile, optD['base'], keymap, 'server' in optD) |
else: | else: |
configureSdp(SDP_CFG, cfile, mfile, pfile, pCfile, pMfile, pRfile, pTfile, optD['base']) |
# A Stanford user can override the parameters in configsdp.txt by copying that file to config.local, |
|
# and then editing config.local. So, if config.local exists, use that. |
|
if os.path.isfile(cdir + '/' + NET_CFG): |
|
configureSdp(NET_CFG, cfile, mfile, pfile, pyfile, shfile, pCfile, pMfile, pRfile, pTfile, optD['base']) |
|
else: |
|
configureSdp(SDP_CFG, cfile, mfile, pfile, pyfile, shfile, pCfile, pMfile, pRfile, pTfile, optD['base']) |