Merge remote-tracking branch 'origin/master' into staging
[mirror/dsa-puppet.git] / modules / bacula / files / volumes-delete-old
index e533e71..80f2c93 100755 (executable)
@@ -2,7 +2,7 @@
 
 # queries a bacula database for volumes to delete and deletes them using bconsole
 
-# Copyright 2010, 2011, 2013, 2017 Peter Palfrader
+# Copyright 2010, 2011, 2013, 2017, 2018 Peter Palfrader
 #
 # Permission is hereby granted, free of charge, to any person obtaining
 # a copy of this software and associated documentation files (the
 # 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,6 +114,34 @@ for r in cursor.fetchall():
   c = "delete volume=%s yes"%(r['volumename'],)
   cmd.append(c)
 
+# 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))
   sys.exit(0)