#!/usr/bin/python3

# sends purge volume action=all to bacula using bconsole.
# list of storages is read from stdin

# 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
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# 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 argparse
import subprocess
import sys
import psycopg2
import psycopg2.extras

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


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 s in storages:
  c = 'truncate allpools storage=%s'%(s,)
  cmd.append(c)
if args.nodo:
  print("\n".join(cmd))
  sys.exit(0)

for c in cmd:
  if args.verbose:
    print("Will run: %s"%(c,))

  p = subprocess.Popen(['/usr/sbin/bconsole'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  (out, err) = p.communicate(c.encode())
  if p.returncode != 0:
    raise Exception("bconsole failed.  stdout:\n%s\nstderr:%s\n"%(out, err))

  if args.verbose:
    print("stdout:\n")
    sys.stdout.buffer.write(out)
    print("\n")

  if err != b"":
    print("bconsole said on stderr:\n", file=sys.stderr)
    sys.stderr.buffer.write(out)
    print("", file=sys.stderr)
    sys.exit(1)

f86df1dbd99bf9e7c8d58ea672fd9f998ed92463
<mask token>

<mask token>
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.')
parser.add_argument('-n', '--nodo', dest='nodo', default=False, action=
    'store_true', help='Print to cat rather than bconsole.')
<mask token>
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)
<mask token>
cursor.execute('SELECT DISTINCT mediatype FROM media', {})
<mask token>
for s in storages:
    c = 'truncate allpools storage=%s' % (s,)
    cmd.append(c)
if args.nodo:
    print('\n'.join(cmd))
    sys.exit(0)
for c in cmd:
    if args.verbose:
        print('Will run: %s' % (c,))
    p = subprocess.Popen(['/usr/sbin/bconsole'], stdin=subprocess.PIPE,
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate(c.encode())
    if p.returncode != 0:
        raise Exception('bconsole failed.  stdout:\n%s\nstderr:%s\n' % (out,
            err))
    if args.verbose:
        print('stdout:\n')
        sys.stdout.buffer.write(out)
        print('\n')
    if err != b'':
        print('bconsole said on stderr:\n', file=sys.stderr)
        sys.stderr.buffer.write(out)
        print('', file=sys.stderr)
        sys.exit(1)

<mask token>
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.')
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)
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 s in storages:
    c = 'truncate allpools storage=%s' % (s,)
    cmd.append(c)
if args.nodo:
    print('\n'.join(cmd))
    sys.exit(0)
for c in cmd:
    if args.verbose:
        print('Will run: %s' % (c,))
    p = subprocess.Popen(['/usr/sbin/bconsole'], stdin=subprocess.PIPE,
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate(c.encode())
    if p.returncode != 0:
        raise Exception('bconsole failed.  stdout:\n%s\nstderr:%s\n' % (out,
            err))
    if args.verbose:
        print('stdout:\n')
        sys.stdout.buffer.write(out)
        print('\n')
    if err != b'':
        print('bconsole said on stderr:\n', file=sys.stderr)
        sys.stderr.buffer.write(out)
        print('', file=sys.stderr)
        sys.exit(1)

import argparse
import subprocess
import sys
import psycopg2
import psycopg2.extras
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.')
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)
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 s in storages:
    c = 'truncate allpools storage=%s' % (s,)
    cmd.append(c)
if args.nodo:
    print('\n'.join(cmd))
    sys.exit(0)
for c in cmd:
    if args.verbose:
        print('Will run: %s' % (c,))
    p = subprocess.Popen(['/usr/sbin/bconsole'], stdin=subprocess.PIPE,
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate(c.encode())
    if p.returncode != 0:
        raise Exception('bconsole failed.  stdout:\n%s\nstderr:%s\n' % (out,
            err))
    if args.verbose:
        print('stdout:\n')
        sys.stdout.buffer.write(out)
        print('\n')
    if err != b'':
        print('bconsole said on stderr:\n', file=sys.stderr)
        sys.stderr.buffer.write(out)
        print('', file=sys.stderr)
        sys.exit(1)

#!/usr/bin/python3

# sends purge volume action=all to bacula using bconsole.
# list of storages is read from stdin

# 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
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# 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 argparse
import subprocess
import sys
import psycopg2
import psycopg2.extras

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


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 s in storages:
  c = 'truncate allpools storage=%s'%(s,)
  cmd.append(c)
if args.nodo:
  print("\n".join(cmd))
  sys.exit(0)

for c in cmd:
  if args.verbose:
    print("Will run: %s"%(c,))

  p = subprocess.Popen(['/usr/sbin/bconsole'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  (out, err) = p.communicate(c.encode())
  if p.returncode != 0:
    raise Exception("bconsole failed.  stdout:\n%s\nstderr:%s\n"%(out, err))

  if args.verbose:
    print("stdout:\n")
    sys.stdout.buffer.write(out)
    print("\n")

  if err != b"":
    print("bconsole said on stderr:\n", file=sys.stderr)
    sys.stderr.buffer.write(out)
    print("", file=sys.stderr)
    sys.exit(1)
