blob: c2b105d83bd0cdccfa90c589d7d3732151edef33 [file] [log] [blame]
#!/usr/bin/env python
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
'''
USAGE: gpfixuserlimts -f|--file FILE -u|--user USER
where FILE is the file to be modified
where USER is the user for whom limits are being checked and set
'''
import os, sys, re, shutil
try:
from optparse import Option, OptionParser
from gppylib.gpparseopts import OptParser, OptChecker
except ImportError, e:
sys.exit('Cannot import modules. Please check that you have sourced greenplum_path.sh. Detail: ' + str(e))
options = None
tmpfile = None
bakfile = None
# True is an error
def parseargs():
global options
global tmpfile
global bakfile
parser = OptParser(option_class=OptChecker)
parser.remove_option('-h')
parser.add_option('-h', '-?', '--help', action='store_true')
parser.add_option('-f', '--file', type='string')
parser.add_option('-u', '--user', type='string')
(options, args) = parser.parse_args()
global gphome
gphome = os.environ.get('GPHOME')
if not gphome:
sys.stderr.write("GPHOME not set")
return True
if options.help:
sys.stderr.write(__doc__)
sys.exit(0)
if not options.file:
sys.stderr.write("--file must be specified")
return True
tmpfile = "%s.tmp" % options.file
bakfile = "%s.bak" % options.file
if not os.path.exists(options.file):
sys.stderr.write("file %s does not exist" % options.file)
return True
if not options.user:
sys.stderr.write("--user must be specified")
return True
if options.user == "root":
sys.stderr.write("root is not a valid user to be specified to this script")
return True
return False
if (parseargs()):
sys.exit(1)
class Item:
def __init__(self, itemid, field1, field2, minval):
self.itemid = itemid
self.field1 = field1
self.field2 = field2
self.minval = int(minval)
self.satisfied = False
def debugStr(self):
return "%s %s %s satisfied=%s" % (self.field1, self.field2, self.minval, self.satisfied)
items = {}
items[1] = Item(1, 'soft', 'nofile', 65536)
items[2] = Item(2, 'hard', 'nofile', 65536)
items[3] = Item(3, 'soft', 'nproc', 131072)
items[4] = Item(4, 'hard', 'nproc', 131072)
linenumbersToRemove = set()
########################################################
## GATHER INFO
########################################################
try:
fd = open(options.file, "r")
linenumber = 0
for line in fd:
linenumber = linenumber + 1
fields = line.strip().split()
if len(fields) != 4:
continue
wildcard = False
user = False
index = None
if fields[0] == "*":
wildcard = True
if fields[0] == options.user:
user = True
if not wildcard and not user:
continue
for k in items.keys():
if fields[1] != items[k].field1:
continue
if fields[2] != items[k].field2:
continue
index = k
break
if not index:
continue
# we have a match
try:
fields[3] = int(fields[3])
except:
fields[3] = 0
if wildcard:
if items[index].minval <= fields[3]:
# WILDCARD RULE IS GOOD
items[index].satisfied = True
else: # matches our user
if items[index].minval <= fields[3]:
# USER RULE IS GOOD
items[index].satisfied = True
else:
# USER RULE THAT IS NOT GOOD
# REMOVE THIS LINE FROM FILE
linenumbersToRemove.add(linenumber)
fd.close()
except Exception,e:
sys.stderr.write("Error parsing file %s\n" % e.__str__())
sys.exit(1)
########################################################
## WRITE NEW FILE
########################################################
try:
output = open(tmpfile, "w")
input = open(options.file, "r")
linenumber = 0
for line in input:
linenumber = linenumber + 1
if linenumber in linenumbersToRemove:
output.write("#%s" % line)
else:
output.write("%s" % line)
# new lines
for k in items.keys():
if items[k].satisfied:
continue
output.write("%s %s %s %s\n" % (options.user, items[k].field1, items[k].field2, items[k].minval))
output.close()
input.close()
except Exception,e:
sys.stderr.write("Error writing file %s\n" % e.__str__())
sys.exit(1)
########################################################
## SWAP FILES
########################################################
try:
shutil.copyfile(options.file, bakfile)
shutil.move(tmpfile, options.file)
except Exception,e:
sys.stderr.write("Error swapping files %s\n" % e.__str__())
sys.exit(1)
sys.exit(0)