#
# Copyright (C) 2007 Red Hat, Inc.
# Authors:
# Thomas Woerner
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
import os, os.path
import tempfile
import shutil
##############################################################################
class sysctlClass:
def __init__(self, filename):
self.filename = filename
self.clear()
def clear(self):
self.p_config = { }
self.p_deleted = [ ]
def get(self, key):
_key = key.strip()
if _key in self.p_config:
return self.p_config[_key]
return None
def set(self, key, value):
_key = key.strip()
self.p_config[_key] = value.strip()
if _key in self.p_deleted:
self.p_deleted.remove[_key]
def unset(self, key):
_key = key.strip()
if _key in self.p_config:
del self.p_config[_key]
if not _key in self.p_deleted:
self.p_deleted.append(_key)
def __str__(self):
s = ""
for (key,value) in self.p_config.items():
if s:
s += '\n'
s += '%s = %s' % (key, value)
return s
# load self.filename
def read(self):
self.clear()
file = open(self.filename, "r")
for line in file.xreadlines():
if not line:
break
line = line.strip()
if len(line) < 1 or line[0] in ['#', ';']:
continue
# get key/value pairs
p = line.split("=")
if len(p) != 2:
continue
self.p_config[p[0].strip()] = p[1].strip()
file.close()
# save to self.filename if there are key/value changes
def write(self):
if len(self.p_config) < 1:
# no changes: nothing to do
return
# handled keys
done = [ ]
(temp_file, temp) = tempfile.mkstemp("sysctl.conf")
modified = False
empty = False
file = open(self.filename, "r")
for line in file.xreadlines():
if not line: break
# remove newline
line = line.strip("\n")
if len(line) < 1:
if not empty:
os.write(temp_file, "\n")
empty = True
elif line[0] == '#':
empty = False
os.write(temp_file, line)
os.write(temp_file, "\n")
else:
p = line.split("=")
if len(p) != 2:
empty = False
os.write(temp_file, line+"\n")
continue
key = p[0].strip()
value = p[1].strip()
# check for modified key/value pairs
if key not in done:
if (key in self.p_config and \
self.p_config[key] != value):
empty = False
os.write(temp_file, '%s = %s\n' \
% (key, self.p_config[key]))
modified = True
elif key in self.p_deleted:
modified = True
else:
empty = False
os.write(temp_file, line+"\n")
done.append(key)
else:
modified = True
# write remaining key/value pairs
if len(self.p_config) > 0:
for (key,value) in self.p_config.items():
if key in done:
continue
if not empty:
os.write(temp_file, "\n")
empty = True
os.write(temp_file, '%s = %s\n' % (key, value))
modified = True
file.close()
os.close(temp_file)
if not modified: # not modified: remove tempfile
os.remove(temp)
return
# make backup
if os.path.exists(self.filename):
try:
shutil.copy2(self.filename, "%s.old" % self.filename)
except Exception, msg:
os.remove(temp)
raise IOError, "Backup of '%s' failed: %s" % (self.filename,
msg)
# copy tempfile
try:
shutil.copy(temp, self.filename)
except Exception, msg:
os.remove(temp)
raise IOError, "Failed to create '%s': %s" % (self.filename, msg)
else:
os.remove(temp)
os.chmod(self.filename, 0644)
def reload(self):
return os.system("/sbin/sysctl -p '%s' >/dev/null" % self.filename)