Make volume-purge-action learn about mediatypes from the DB
authorPeter Palfrader <peter@palfrader.org>
Tue, 4 Jul 2017 09:10:35 +0000 (11:10 +0200)
committerPeter Palfrader <peter@palfrader.org>
Tue, 4 Jul 2017 09:10:35 +0000 (11:10 +0200)
modules/bacula/files/volume-purge-action
modules/bacula/manifests/director.pp

index 03c0822..29fe6c6 100755 (executable)
@@ -1,9 +1,9 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # sends purge volume action=all to bacula using bconsole.
 # list of storages is read from stdin
 
-# Copyright 2013 Peter Palfrader
+# Copyright 2013,2017 Peter Palfrader
 #
 # Permission is hereby granted, free of charge, to any person obtaining
 # a copy of this software and associated documentation files (the
 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-import optparse
+import argparse
 import subprocess
 import sys
+import psycopg2
+import psycopg2.extras
 
-
-parser = optparse.OptionParser()
-parser.set_usage("%prog [options]")
-parser.add_option("-v", "--verbose", dest="verbose",
+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)')
+parser.add_argument("-v", "--verbose", dest="verbose",
   default=False, action="store_true",
   help="Be more verbose.")
-(options, args) = parser.parse_args()
+parser.add_argument("-n", "--nodo", dest="nodo",
+  default=False, action="store_true",
+  help="Print to cat rather than bconsole.")
+args = parser.parse_args()
+
+if args.db is not None:
+  pass
+elif args.dbfile is not None:
+  args.db = open(args.dbfile).read().rstrip()
+else:
+  print >>sys.stderr, 'Need one of -d or -D.'
+  sys.exit(1)
+
 
-if len(args) >= 1:
-    parser.print_help()
-    sys.exit(1)
+conn = psycopg2.connect(args.db)
+cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+cursor.execute("""SELECT DISTINCT mediatype FROM media""", {})
+storages = set(r['mediatype'] for r in cursor.fetchall())
 
 cmd = []
-for storage in sys.stdin:
-    s = storage.rstrip()
-    c = 'purge volume action=all allpools storage=%s'%(s,)
+for s in storages:
+    c = 'truncate allpools storage=%s'%(s,)
     cmd.append(c)
-if options.verbose:
+if args.nodo:
+  print("\n".join(cmd))
+  sys.exit(0)
+if args.verbose:
     for c in cmd:
-      print "Will run: %s"%(c,)
+      print("Will run: %s"%(c,))
 
 p = subprocess.Popen(['bconsole'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-(out, err) = p.communicate("\n".join(cmd))
+(out, err) = p.communicate("\n".join(cmd).encode())
 if p.returncode != 0:
     raise Exception("bconsole failed.  stdout:\n%s\nstderr:%s\n"%(out, err))
 
-if options.verbose:
-    print "stdout:\n%s"%(out,)
+if args.verbose:
+    print("stdout:\n%s"%(out,))
 
 if err != "":
-  print >> sys.stderr, "bconsole said on stderr:\n%s\n"%(err,)
+  print("bconsole said on stderr:\n%s\n"%(err,), file=sys.stderr)
   sys.exit(1)
index 4fd0f6d..3770b91 100644 (file)
@@ -63,6 +63,7 @@ class bacula::director inherits bacula {
                require => Package['bacula-console']
        }
 
+       package { 'python3-psycopg2': ensure => installed }
        file { '/etc/bacula/scripts/volume-purge-action':
                mode    => '0555',
                source  => 'puppet:///modules/bacula/volume-purge-action',
@@ -78,6 +79,6 @@ class bacula::director inherits bacula {
                source  => 'puppet:///files/empty/',
        }
        file { "/etc/cron.d/puppet-bacula-stuff":
-               content => "@daily root (cat /etc/bacula/storages-list.d/*.storage; echo '$bacula::bacula_filestor_name-catalog') | /etc/bacula/scripts/volume-purge-action\n";
+               content => "@daily root chronic /etc/bacula/scripts/volume-purge-action -v\n";
        }
 }