# 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.")
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))