diff -up sos-2.2/sos/plugins/psql.py.empty sos-2.2/sos/plugins/psql.py --- sos-2.2/sos/plugins/psql.py.empty 2012-08-27 10:23:02.344361194 -0400 +++ sos-2.2/sos/plugins/psql.py 2012-08-27 10:04:26.821019378 -0400 @@ -0,0 +1,97 @@ +import fnmatch +import os +import sos.plugintools +import tempfile + +def find(file_pattern, top_dir, max_depth=None, path_pattern=None): + """generate function to find files recursively. Usage: + + for filename in find("*.properties", /var/log/foobar): + print filename + """ + if max_depth: + base_depth = os.path.dirname(top_dir).count(os.path.sep) + max_depth += base_depth + + for path, dirlist, filelist in os.walk(top_dir): + if max_depth and path.count(os.path.sep) >= max_depth: + del dirlist[:] + + if path_pattern and not fnmatch.fnmatch(path, path_pattern): + continue + + for name in fnmatch.filter(filelist, file_pattern): + yield os.path.join(path,name) + +# Class name must be the same as file name and method names must not change +class psql(sos.plugintools.PluginBase): + """PostgreSQL related information""" + __pghome = '/var/lib/pgsql' + __username = 'postgres' + __dbport = 5432 + + optionList = [ + ("pghome", 'PostgreSQL server home directory (default=/var/lib/pgsql)', '', False), + ("username", 'username for pg_dump (default=postgres)', '', False), + ("password", 'password for pg_dump (default=None)', '', False), + ("dbname", 'database name to dump for pg_dump (default=None)', '', False), + ("dbhost", 'hostname/IP of the server upon which the DB is running (default=localhost)', '', False), + ("dbport", 'database server port number (default=5432)', '', False) + ] + + def pg_dump(self): + dest_file = os.path.join(self.tmp_dir, "sos_pgdump.tar") + old_env_pgpassword = os.environ.get("PGPASSWORD") + os.environ["PGPASSWORD"] = "%s" % (self.getOption("password")) + if self.getOption("dbhost"): + (status, output, rtime) = self.callExtProg("pg_dump -U %s -h %s -p %s -w -f %s -F t %s" % + (self.__username, + self.getOption("dbhost"), + self.__dbport, + dest_file, + self.getOption("dbname"))) + else: + (status, output, rtime) = self.callExtProg("pg_dump -C -U %s -w -f %s -F t %s " % + (self.__username, + dest_file, + self.getOption("dbname"))) + + if old_env_pgpassword is not None: + os.environ["PGPASSWORD"] = str(old_env_pgpassword) + if (status == 0): + self.addCopySpec(dest_file) + else: + self.addAlert("ERROR: Unable to execute pg_dump. Error(%s)" % (output)) + + def setup(self): + if self.getOption("pghome"): + self.__pghome = self.getOption("pghome") + + if self.getOption("dbname"): + if self.getOption("password"): + if self.getOption("username"): + self.__username = self.getOption("username") + if self.getOption("dbport"): + self.__dbport = self.getOption("dbport") + self.tmp_dir = tempfile.mkdtemp() + self.pg_dump() + else: + self.addAlert("WARN: password must be supplied to dump a database.") + + # Copy PostgreSQL log files. + for file in find("*.log", self.__pghome): + self.addCopySpec(file) + # Copy PostgreSQL config files. + for file in find("*.conf", self.__pghome): + self.addCopySpec(file) + + self.addCopySpec(os.path.join(self.__pghome, "data" , "PG_VERSION")) + self.addCopySpec(os.path.join(self.__pghome, "data" , "postmaster.opts")) + + + def postproc(self): + import shutil + try: + shutil.rmtree(self.tmp_dir) + except: + self.addAlert("ERROR: Unable to remove %s." % (self.tmp_dir))