pysysconf
index
/root/pysysconf/pysysconf.py

Useful commands for system configuration.
 
PySysConf provides a number of useful high-level functions for doing
system configuration. These are modeled on the commands in cfengine.
 
Logging:
 
All PySysConf commands will log to stdout and syslog. The verbosity is
controlled by setting the variables pysysconf.verbosity (for stdout)
and pysysconf.syslog_verbosity (for syslog). These should be set to
LOG_NONE, LOG_ERROR, LOG_ACTION, or LOG_NO_ACTION, in increasing order
of verbosity.
 
Exception handling:
 
Internal functions (those starting with an underscore) may raise
exceptions, including the local class PySysConfError, but they will
not catch any exceptions caused by unexpected errors. Externally
visible functions (those without underscores) catch and log
EnvironmentError and PySysConfError exceptions, and let other
exceptions fall through.

 
Modules
       
datetime
errno
filecmp
grp
os
pwd
selinux
socket
stat
sys
syslog
types

 
Classes
       
exceptions.Exception(exceptions.BaseException)
PysysconfError
remove_test
test_age
test_false
test_regexp
test_true

 
class PysysconfError(exceptions.Exception)
    Class used for all exceptions raised directly by this module.
 
 
Method resolution order:
PysysconfError
exceptions.Exception
exceptions.BaseException
__builtin__.object

Data descriptors defined here:
__weakref__
list of weak references to the object (if defined)

Methods inherited from exceptions.Exception:
__init__(...)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Data and other attributes inherited from exceptions.Exception:
__new__ = <built-in method __new__ of type object at 0x375ad6f000>
T.__new__(S, ...) -> a new object with type S, a subtype of T

Methods inherited from exceptions.BaseException:
__delattr__(...)
x.__delattr__('name') <==> del x.name
__getattribute__(...)
x.__getattribute__('name') <==> x.name
__getitem__(...)
x.__getitem__(y) <==> x[y]
__getslice__(...)
x.__getslice__(i, j) <==> x[i:j]
 
Use of negative indices is not supported.
__reduce__(...)
__repr__(...)
x.__repr__() <==> repr(x)
__setattr__(...)
x.__setattr__('name', value) <==> x.name = value
__setstate__(...)
__str__(...)
x.__str__() <==> str(x)
__unicode__(...)

Data descriptors inherited from exceptions.BaseException:
__dict__
args
message

 
class remove_test
    Class that implements a test for whether a given file or
directory should be removed.
 
  Methods defined here:
test(self, file_name, file_stat)

 
class test_age(remove_test)
    Tests whether a file is older than a given age.
 
  Methods defined here:
__init__(self, age=None, age_type='mtime')
test(self, file_name, file_stat)

Data and other attributes defined here:
age = None
age_type = 'mtime'

 
class test_false(remove_test)
    Return False unconditionally.
 
  Methods defined here:
test(self, file_name, file_stat)

 
class test_regexp(remove_test)
    Tests whether a filename matches a given regexp.
 
  Methods defined here:
__init__(self, regexp)
test(self, file_name, file_stat)

Data and other attributes defined here:
regexp = None

 
class test_true(remove_test)
    Return True unconditionally.
 
  Methods defined here:
test(self, file_name, file_stat)

 
Functions
       
acquire_lock(lock_name)
Acquires the lock referenced by the given filename by creating the
file lock_name. The parent directory of lock_name must already exist.
 
lock_name : string
    Filename for the lock.
 
return : boolean
    Returns True if the lock was successfully acquired,
    otherwise False.
 
e.g. Lock a copy operation:
>>> acquire_lock("/var/lock/pysysconf/copylock")
check_copy(src, dst, uid=None, gid=None, perm=None, umask=None, dmask=None, se_context=None, se_user=None, se_role=None, se_type=None, se_level=None, backup=True, purge=False)
Check the copy of a file, symlink, or directory.
 
src : string
    Filename of the source file, symlink, or directory.
 
dst : string
    Filename of the destination object.
 
uid : string, integer, or None
    (optional: default = None)
    Username (if a string) or UID (if an int) that should own the
    dst object. In the case of a directory copy, uid will be
    applied recursively to all subdirectories and their files. If
    uid is None then the uid of dst is required to be the same as
    that of src.
 
gid : string, integer, or None
    (optional: default = None)
    Groupname or GID, as for uid.
 
perm : string, integer, or None
    (optional: default = None)
    Permissions of dst. Can be a string containing an octal
    number, such as "0644", or an integer containing the
    same value, such as 0644. If None, then the permissions
    of dst will be the same as those of src, masked by
    umask (for files) or dmask (for directories).
 
umask : string, integer, or None
    (optional: default = None)
    Mask for permissions of dst for the case that dst is not a
    directory. Will be applied to perm if it is not None,
    otherwise will be applied to the permissions of src. The
    format is the same as that of perm.
 
dmask : string, integer, or None
    (optional: default = None)
    Mask for permissions of dst for the case that dst is a
    directory, as for umask.
 
se_context : string or None
    (optional: default = None)
    SELinux context given as a string "user:role:type:level". If
    se_context is not None then all of se_user, se_role, se_type,
    and se_level must be None. If se_context is None then the
    context of dst is not changed (except possibly by se_user,
    se_role, se_type, or se_level).
 
se_user : string or None
    (optional: default = None)
    SELinux context user as a string. Cannot be specified
    simultaneously with se_context. If None, then the user
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_role : string or None
    (optional: default = None)
    SELinux context role as a string. Cannot be specified
    simultaneously with se_context. If None, then the role
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_type : string or None
    (optional: default = None)
    SELinux context type as a string. Cannot be specified
    simultaneously with se_context. If None, then the type
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_level : string or None
    (optional: default = None)
    SELinux context level as a string. Cannot be specified
    simultaneously with se_context. If None, then the level
    component of the context of dst is not changed (except
    possibly by se_context).
 
backup : boolean
    (optional: default = True)
    Whether to backup dst if it will be overwritten.
 
purge : boolean
    (optional: default = False)
    Whether to delete files in dst (if it is a directory) if
    they are not present in src.
 
return : boolean
    Whether any change was made to dst.
 
e.g. Check that a single file is a copy:
>>> check_copy("main.cf.server", "/etc/sendmail/main.cf")
 
e.g. Check that a directory is an exact copy, without backup:
>>> check_copy("ppds", "/etc/cups/ppds", purge = True, backup = False)
check_dir_exists(dst, uid=None, gid=None, perm=None, se_context=None, se_user=None, se_role=None, se_type=None, se_level=None, backup=True)
Check that the directory named dst exists and has the specified
ownership and permissions. The path to dst must already exist.
 
dst : string
    Directory that must exist.
 
uid : string, integer, or None
    (optional: default = None)
    Username (if a string) or UID (if an int) that should own the
    dst object. If uid is None then the uid of dst is the default.
    
gid : string, integer, or None
    (optional: default = None)
    Groupname or GID, as for uid.
 
perm : string, integer, or None
    (optional: default = None)
    Permissions of dst. Can be a string containing an octal
    number, such as "0644", or an integer containing the
    same value, such as 0644. If None, then the permissions
    of dst will be the default.
 
se_context : string or None
    (optional: default = None)
    SELinux context given as a string "user:role:type:level". If
    se_context is not None then all of se_user, se_role, se_type,
    and se_level must be None. If se_context is None then the
    context of dst is not changed (except possibly by se_user,
    se_role, se_type, or se_level).
 
se_user : string or None
    (optional: default = None)
    SELinux context user as a string. Cannot be specified
    simultaneously with se_context. If None, then the user
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_role : string or None
    (optional: default = None)
    SELinux context role as a string. Cannot be specified
    simultaneously with se_context. If None, then the role
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_type : string or None
    (optional: default = None)
    SELinux context type as a string. Cannot be specified
    simultaneously with se_context. If None, then the type
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_level : string or None
    (optional: default = None)
    SELinux context level as a string. Cannot be specified
    simultaneously with se_context. If None, then the level
    component of the context of dst is not changed (except
    possibly by se_context).
 
backup : boolean
    (optional: default = True)
    Whether to backup dst if it will be replaced.
 
return : boolean
    Whether any change was made to dst.
 
e.g. Check that the directory /var/pysysconf exists:
>>> check_dir_exists("/var/pysysconf")
check_file_exists(dst, uid=None, gid=None, perm=None, se_context=None, se_user=None, se_role=None, se_type=None, se_level=None, backup=True)
Check that the file named dst exists and has the specified
ownership and permissions. The path to dst must already exist.
 
dst : string
    Filename that must exist.
 
uid : string, integer, or None
    (optional: default = None)
    Username (if a string) or UID (if an int) that should own the
    dst object. If uid is None then the uid of dst is the default.
    
gid : string, integer, or None
    (optional: default = None)
    Groupname or GID, as for uid.
 
perm : string, integer, or None
    (optional: default = None)
    Permissions of dst. Can be a string containing an octal
    number, such as "0644", or an integer containing the
    same value, such as 0644. If None, then the permissions
    of dst will be the default.
 
se_context : string or None
    (optional: default = None)
    SELinux context given as a string "user:role:type:level". If
    se_context is not None then all of se_user, se_role, se_type,
    and se_level must be None. If se_context is None then the
    context of dst is not changed (except possibly by se_user,
    se_role, se_type, or se_level).
 
se_user : string or None
    (optional: default = None)
    SELinux context user as a string. Cannot be specified
    simultaneously with se_context. If None, then the user
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_role : string or None
    (optional: default = None)
    SELinux context role as a string. Cannot be specified
    simultaneously with se_context. If None, then the role
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_type : string or None
    (optional: default = None)
    SELinux context type as a string. Cannot be specified
    simultaneously with se_context. If None, then the type
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_level : string or None
    (optional: default = None)
    SELinux context level as a string. Cannot be specified
    simultaneously with se_context. If None, then the level
    component of the context of dst is not changed (except
    possibly by se_context).
 
backup : boolean
    (optional: default = True)
    Whether to backup dst if it will be replaced.
 
return : boolean
    Whether any change was made to dst.
 
e.g. Check that /etc/nologin exists and is owned by root:
>>> check_file_exists("/etc/nologin", uid = "root")
check_link(src, dst, uid=None, gid=None, se_context=None, se_user=None, se_role=None, se_type=None, se_level=None, backup=True)
Check that dst is a symlink to src.
 
src : string
    Filename of the source file, symlink, or directory.
 
dst : string
    Filename of the symlink.
 
uid : string, integer, or None
    (optional: default = None)
    Username (if a string) or UID (if an int) that should own the
    dst object. If uid is None then the uid of dst is the default.
    
gid : string, integer, or None
    (optional: default = None)
    Groupname or GID, as for uid.
 
se_context : string or None
    (optional: default = None)
    SELinux context given as a string "user:role:type:level". If
    se_context is not None then all of se_user, se_role, se_type,
    and se_level must be None. If se_context is None then the
    context of dst is not changed (except possibly by se_user,
    se_role, se_type, or se_level).
 
se_user : string or None
    (optional: default = None)
    SELinux context user as a string. Cannot be specified
    simultaneously with se_context. If None, then the user
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_role : string or None
    (optional: default = None)
    SELinux context role as a string. Cannot be specified
    simultaneously with se_context. If None, then the role
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_type : string or None
    (optional: default = None)
    SELinux context type as a string. Cannot be specified
    simultaneously with se_context. If None, then the type
    component of the context of dst is not changed (except
    possibly by se_context).
 
se_level : string or None
    (optional: default = None)
    SELinux context level as a string. Cannot be specified
    simultaneously with se_context. If None, then the level
    component of the context of dst is not changed (except
    possibly by se_context).
 
backup : boolean
    (optional: default = True)
    Whether to backup dst if it will be overwritten.
 
return : boolean
    Whether any change was made to dst.
 
e.g. Check that the link /var/spool/mail points to /net/maildir:
>>> check_link("/net/maildir", "/var/spool/mail")
check_not_exists(dst, test=None, follow_links=False, backup=False)
Delete dst, or files in dst that satisfy test.
 
dst : string
    Directory name to remove files in.
 
test : remove_test object, or None
    If None, remove dst. Otherwise, use this object to test
    whether to remove a given file or directory.
 
follow_links : boolean
    (optional: default = False)
    Whether to follow links to files and directories. This can be
    dangerous if a user has write access to any of the directories
    being processed.
 
backup : boolean
    (optional: default = False)
    Whether to rename objects to <filename>.<isodate> rather than
    deleting them.
 
return : boolean
    Whether any change was made to dst.
 
e.g. Ensure /etc/nologin does not exist:
>>> check_not_exists("/etc/nologin")
 
e.g. Ensure the entire directory /etc/cups does not exist:
>>> check_not_exists("/etc/cups")
 
e.g. Ensure the contents of /var/mail do not exist, but the /var/mail
     dirctory itself may exist:
>>> check_not_exists("/var/mail", test = test_true())
 
e.g. Ensure all backup files older than one week do not exist:
>>> test_one_week = test_age(age = datetime.timedelta(days = 7))
>>> check_not_exists("/backups", test = test_one_week)
check_rpm_installed(rpm_name)
Ensure that the given rpm is installed, using yum for installation.
 
rpm_name : string
    Name of rpm to install.
 
return : boolean
    Whether the rpm had to be installed.
 
e.g. make sure the latest version of matlab is installed:
>>> check_rpm_installed("matlab")
check_selinux_bool(bool_name, bool_value)
Ensure that the given SELinux boolean has the given value.
 
bool_name : string
    Name of the boolean to check.
 
bool_value: boolean
    Value that the boolean must have.
 
return : boolean
    Whether any change was made to the boolean status.
 
e.g. make sure the webserver can access user home directories:
>>> check_sebool("httpd_enable_homedirs", True)
check_service_disabled(service_name)
Ensure that the given service is currently not running and
will not start on boot.
 
service_name : string
    Name of service to disable.
 
return : boolean
    Whether any change was made to the service.
 
e.g. Make sure apache is not running:
>>> check_service_disabled("httpd")
check_service_enabled(service_name, needs_restart=False, needs_reload=False)
Ensure that the given service is currently running and
will start on boot.
 
service_name : string
    Name of service to enable.
 
needs_restart : boolean
    (optional: default = False)
    Whether the service should be restarted if it is already
    running.
 
needs_reload : boolean
    (optional: default = False)
    Whether the service should be reloaded if it is already
    running. Is superceded by needs_restart.
 
return : boolean
    Whether any change was made to the service.
 
e.g. Make sure slapd is running:
>>> check_service_enabled("ldap")
check_service_status(service_name, should_be_running, needs_restart=False, needs_reload=False)
Do either check_service_enabled, if should_be_running is
True, or check_service_disabled, if should_be_running is False.
 
service_name : string
    Name of service to disable.
 
should_be_running : boolean
    Whether the service should be enabled or not.
 
needs_restart : boolean
    (optional: default = False)
    Whether the service should be restarted if it is already
    running.
 
needs_reload : boolean
    (optional: default = False)
    Whether the service should be reloaded if it is already
    running. Is superceded by needs_restart.
 
return : boolean
    Whether any change was made to the service.
 
e.g. Make sure apache is running only on webservers:
>>> check_service_status("httpd", server_web)
log(level, message)
Logs the message string to stdout and syslog, if the level is below
that of the given verbosities.
 
level : integer
    Level to log at. If the current logging level is less than or equal
    to level, then the message is logged, otherwise it is discarded.
 
message : string
    Message to log.
 
e.g. log an error:
>>> log(LOG_ERROR, "An error occured!")
release_lock(lock_name)
Releases a lock acquired by acquire_lock() by deleting the file
lock_name. An exception is thrown if the lock was not already acquired.
 
lock_name : string
    Filename for the lock.
 
e.g. Unlock a copy operation:
>>> release_lock("/var/lock/pysysconf/copylock")
shell_command(command)
Run an external command in a shell.
 
command : string
    Commandline to run. Will be passed to a subshell.
 
return : integer
    Returns the exit status of the command.
 
e.g. Restart apache:
>>> shell_command("/sbin/service httpd restart")

 
Data
        LOG_ACTION = 2
LOG_ERROR = 1
LOG_NONE = 0
LOG_NO_ACTION = 3
syslog_facility = 8
syslog_priority = 6
syslog_verbosity = 2
verbosity = 1