Keith Robertson has uploaded a new change for review. Change subject: tools: Add support for remote PGDB (BZ831040) Support dumping of remote Postgres DBs ......................................................................
tools: Add support for remote PGDB (BZ831040) Support dumping of remote Postgres DBs Signed-off-by: Keith Robertson <[email protected]> Change-Id: I2afcd480dadf90a4b6fd4ce60b43c16f16ffc3c2 --- M src/rhev/logcollector.py M src/sos/plugins/postgresql.py 2 files changed, 64 insertions(+), 28 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-log-collector refs/changes/90/7590/1 diff --git a/src/rhev/logcollector.py b/src/rhev/logcollector.py index 2364680..cfed76c 100644 --- a/src/rhev/logcollector.py +++ b/src/rhev/logcollector.py @@ -570,12 +570,12 @@ def sosreport(self): - if self.configuration.get("pg_pass"): - opt = '-k postgresql.dbname=%(pg_dbname)s -k postgresql.username=%(pg_user)s -k postgresql.password=%(pg_pass)s' - else: - opt = "" + opt = "" if self.hostname == "localhost": + if self.configuration.get("pg_pass"): + opt = '-k postgresql.dbname=%(pg_dbname)s -k postgresql.username=%(pg_user)s -k postgresql.password=%(pg_pass)s' + stdout = self.caller.call('/usr/sbin/sosreport --batch --report -o postgresql ' '--tmp-dir=%(local_scratch_dir)s ' + opt) self.parse_sosreport_stdout(stdout) @@ -589,11 +589,20 @@ "postgresql-%s.md5" % self.configuration["filename"])) else: # The PG database is on a remote host - cmd = '%(ssh_cmd)s "/usr/sbin/sosreport --batch --report -o postgresql ' + opt - stdout = self.caller.call(cmd) + opt = '-k postgresql.dbname=%(pg_dbname)s -k postgresql.dbhost=%(pg_dbhost)s -k postgresql.dbport=%(pg_dbport)s -k postgresql.username=%(pg_user)s -k postgresql.password=%(pg_pass)s ' + # REMOVE the following 3 lines when SoS starts shipping psql.py + stdout = self.caller.call('/usr/sbin/sosreport --batch --report -o postgresql ' + '--tmp-dir=%(local_scratch_dir)s ' + opt) self.parse_sosreport_stdout(stdout) - self.caller.call('%(scp_cmd)s:%(path)s %(local_scratch_dir)s') - self.caller.call('%(ssh_cmd)s "rm %(path)s*"') + os.rename("%s.md5" % (self.configuration["path"]), + os.path.join(self.configuration["local_scratch_dir"], + "postgresql-%s.md5" % self.configuration["filename"])) +# Uncomment the code below when base SoS gets the psql.py plug-in +# cmd = '%(ssh_cmd)s "/usr/sbin/sosreport --batch --report -o postgresql ' + opt +# stdout = self.caller.call(cmd) +# self.parse_sosreport_stdout(stdout) +# self.caller.call('%(scp_cmd)s:%(path)s %(local_scratch_dir)s') +# self.caller.call('%(ssh_cmd)s "rm %(path)s*"') # Prepend postgresql- to the PostgreSQL SOS report # so that it is easy to distinguished from the other N reports @@ -958,6 +967,11 @@ metavar="localhost", default="localhost") + db_group.add_option("", "--pg-dbport", dest="pg_dbport", + help="PostgreSQL server port number (default=5432)", + metavar="5432", + default="5432") + db_group.add_option("", "--pg-ssh-user", dest="pg_ssh_user", help="""the SSH user that will be used to connect to the server upon which the remote PostgreSQL database lives. (default=root)""", diff --git a/src/sos/plugins/postgresql.py b/src/sos/plugins/postgresql.py index b76b308..1088aaf 100644 --- a/src/sos/plugins/postgresql.py +++ b/src/sos/plugins/postgresql.py @@ -1,8 +1,6 @@ -import sos.plugintools -import os import fnmatch -import shlex -import subprocess +import os +import sos.plugintools import tempfile def find(file_pattern, top_dir, max_depth=None, path_pattern=None): @@ -28,48 +26,72 @@ # Class name must be the same as file name and method names must not change class postgresql(sos.plugintools.PluginBase): """PostgreSQL related information""" + __pghome = '/var/lib/pgsql' + __username = 'postgres' + __dbport = 5432 optionList = [ - ("pghome", 'PostgreSQL server home directory.', '', '/var/lib/pgsql'), - ("username", 'username for pg_dump', '', 'postgres'), - ("password", 'password for pg_dump', '', ''), - ("dbname", 'database name to dump for pg_dump', '', ''), + ("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")) - (status, output, rtime) = self.callExtProg("pg_dump %s -U %s -w -f %s -F t" % - (self.getOption("dbname"), - self.getOption("username"), - dest_file)) + 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"] = "%s" % (old_env_pgpassword) + 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.") - + self.addAlert("WARN: password must be supplied to dump a database.") + # Copy PostgreSQL log files. - for file in find("*.log", self.getOption("pghome")): + for file in find("*.log", self.__pghome): self.addCopySpec(file) # Copy PostgreSQL config files. - for file in find("*.conf", self.getOption("pghome")): + for file in find("*.conf", self.__pghome): self.addCopySpec(file) - self.addCopySpec(os.path.join(self.getOption("pghome"), "data" , "PG_VERSION")) - self.addCopySpec(os.path.join(self.getOption("pghome"), "data" , "postmaster.opts")) + 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 - shutil.rmtree(self.tmp_dir) + try: + shutil.rmtree(self.tmp_dir) + except: + self.addAlert("ERROR: Unable to remove %s." % (self.tmp_dir)) -- To view, visit http://gerrit.ovirt.org/7590 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2afcd480dadf90a4b6fd4ce60b43c16f16ffc3c2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-log-collector Gerrit-Branch: master Gerrit-Owner: Keith Robertson <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
