Be more defensive when removing potentially obsolete pools
authorPeter Palfrader <peter@palfrader.org>
Sat, 24 Feb 2018 09:16:09 +0000 (10:16 +0100)
committerPeter Palfrader <peter@palfrader.org>
Sat, 24 Feb 2018 09:16:09 +0000 (10:16 +0100)
modules/bacula/files/volumes-delete-old

index cc0f92e..b33e6d2 100755 (executable)
 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 import argparse
+import os.path
 import psycopg2
 import psycopg2.extras
 import re
 import sys
 import subprocess
 
+DSA_BACULA_DB_CONNECT = '/etc/dsa/bacula-reader-database'
+DSA_CLIENT_LIST_FILE = '/etc/bacula/dsa-clients'
+
 parser = argparse.ArgumentParser()
 parser.add_argument("-d", "--db-connect-string", metavar="connect-string", dest="db",
   help="Database connect string")
 parser.add_argument("-D", "--db-connect-string-file", metavar="FILE", dest="dbfile",
-  default='/etc/dsa/bacula-reader-database',
-  help="File to read database connect string from (/etc/dsa/bacula-reader-database)")
+  default=DSA_BACULA_DB_CONNECT,
+  help="File to read database connect string from (%s)"%(DSA_BACULA_DB_CONNECT,))
+parser.add_argument("-c", "--client-list", metavar="FILE", dest="clientlist",
+  default=DSA_CLIENT_LIST_FILE,
+  help="File with a list of all clients (%s)"%(DSA_CLIENT_LIST_FILE,))
 parser.add_argument("-v", "--verbose", dest="verbose",
   default=False, action="store_true",
   help="Be more verbose.")
@@ -107,20 +114,33 @@ for r in cursor.fetchall():
   c = "delete volume=%s yes"%(r['volumename'],)
   cmd.append(c)
 
-# find obsolete pools
-cursor.execute("""
-  SELECT name
-  FROM pool
-  WHERE
-    name != 'Scratch' AND
-    numvols = 0 AND
-    poolid NOT IN (SELECT recyclepoolid FROM media)
-""", {})
-
-for r in cursor.fetchall():
-  c = "delete pool=%s"%(r['name'],)
-  cmd.append(c)
-  cmd.append("yes")
+# find obsolete pools, but only if we have a list of clients
+##
+if os.path.exists(args.clientlist):
+  clients = set(open(args.clientlist).read().split())
+
+  cursor.execute("""
+    SELECT name
+    FROM pool
+    WHERE
+      name != 'Scratch' AND
+      numvols = 0 AND
+      poolid NOT IN (SELECT recyclepoolid FROM media)
+  """, {})
+
+  for r in cursor.fetchall():
+    poolname = r['name']
+    match = re.match('pool[a-z]*-debian-(.*)', poolname)
+    if match is not None:
+      hostname = match.group(1)
+      if hostname not in clients:
+        c = "delete pool=%s"%(poolname,)
+        cmd.append(c)
+        cmd.append("yes")
+      elif args.verbose:
+        print("Not expiring empty pool %s because client still exists"%(poolname,))
+    elif args.verbose:
+        print("Could not extract client name from poolname %s"%(poolname,))
 
 if args.nodo:
   print("\n".join(cmd))