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

Reply via email to