#
# Default Bacula Director Configuration file
# For Bacula release 9.4.2 (04 February 2019) -- debian buster/sid
#

Director {  # define myself
  Name = {{ inventory_hostname_short }}-dir
  @|"sed -n '/^bconsole\\s/ {s//Password = /p; q}' /etc/bacula/passwords-dir"
  Messages = Daemon
  Working Directory = /var/lib/bacula
  Pid Directory = /run/bacula
  QueryFile = "/etc/bacula/scripts/query.sql"
  Maximum Concurrent Jobs = 1
  DirAddress = 127.0.0.1
  DirPort = 9101
  FDConnectTimeout = 5 min
  SDConnectTimeout = 5 min
}


JobDefs {
  Name = DefaultJob
  Type = Backup
  Level = Incremental
  Storage = {{ hostvars[ groups['bacula_sd'][0] ].inventory_hostname_short }}-sd
  Messages = Standard
  Accurate = yes
  #Rerun Failed Levels = yes
  Reschedule On Error = yes
  Reschedule Interval = 17 min
  Reschedule Times = 3
  Pool = Default
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%n.bsr"
}

JobDefs {
  Name = DefaultMySQLJob
  Type = Backup
  Level = Full
  Storage = {{ hostvars[ groups['bacula_sd'][0] ].inventory_hostname_short }}-sd
  Messages = Standard
  FileSet = SQL
  Schedule = WeeklyCycleAfterBackup
  Reschedule On Error = yes
  Reschedule Interval = 17 min
  Reschedule Times = 3
  # This creates an ASCII copy of the databases
  Client Run Before Job = "/usr/bin/mysqldump -r /var/lib/bacula/tmp/dump.sql --events --all-databases"
  # This deletes the copy of the catalog
  RunScript {
    Runs On Client = yes
    Runs On Success = yes
    Runs On Failure = yes
    Runs When = after
    Command = "/bin/rm -f /var/lib/bacula/tmp/dump.sql"
  }
  Pool = database
  Priority = 20
  Write Bootstrap = "/var/lib/bacula/%n.bsr"
}

JobDefs {
  Name = DefaultSlapdJob
  Type = Backup
  Level = Full
  Storage = {{ hostvars[ groups['bacula_sd'][0] ].inventory_hostname_short }}-sd
  Messages = Standard
  FileSet = LDAP
  Schedule = WeeklyCycleAfterBackup
  Reschedule On Error = yes
  Reschedule Interval = 17 min
  Reschedule Times = 3
  # This creates an ASCII copy of the databases
  Client Run Before Job = "/usr/local/sbin/slapcat-all.sh /var/lib/bacula/tmp"
  # This deletes the copy of the catalog
  RunScript {
    Runs On Client = yes
    Runs On Success = yes
    Runs On Failure = yes
    Runs When = after
    Command = "/usr/bin/find /var/lib/bacula/tmp -type f \( -name \"*.ldif\" -o -name \"slapd-*\" \) -delete"
  }
  Pool = database
  Priority = 20
  Write Bootstrap = "/var/lib/bacula/%n.bsr"
}


# Backup the director
Job {
  Name = {{ inventory_hostname_short }}-dir
  Client = {{ inventory_hostname_short }}-fd
  JobDefs = DefaultJob
  FileSet = BaculaHome
  Schedule = WeeklyCycle
}

# Backup the mailboxes
{% for h in groups.IMAP | sort %}
Job {
  Name = {{ hostvars[h].inventory_hostname_short }}-mailboxes
  Client = {{ hostvars[h].inventory_hostname_short }}-fd
  JobDefs = DefaultJob
  Accurate = no
  FileSet = Mailboxes
  Pool = mailboxes-inc
  Full Backup Pool = mailboxes-full
  Schedule = Mailboxes13WeeksCycle
  Max Start Delay = 50 min # To avoid too many overlaps
  Max Full Interval = 15 weeks
}
{% endfor %}

# Backup the Nextcloud data
{% for h in groups.nextcloud | sort %}
Job {
  Name = {{ hostvars[h].inventory_hostname_short }}-nextcloud
  Client = {{ hostvars[h].inventory_hostname_short }}-fd
  JobDefs = DefaultJob
  FileSet = NextcloudData
  Pool = nextcloud-inc
  Full Backup Pool = nextcloud-full
  Schedule = Nextcloud13WeeksCycle
  Max Start Delay = 50 min # To avoid too many overlaps
  Max Full Interval = 15 weeks
}
{% endfor %}

# Backup each machine
{% for fd in groups.all | sort %}
Job {
  Name = {{ hostvars[fd].inventory_hostname_short }}
  Client = {{ hostvars[fd].inventory_hostname_short }}-fd
  JobDefs = DefaultJob
  FileSet = FileSetRoot
  Pool = {{ hostvars[fd].inventory_hostname_short }}
  Priority = 15
  Schedule = WeeklyCycle
}
{% endfor %}

{% for fd in groups['MDA'] | union(groups['webmail']) | union(groups['lists']) | union(groups['bacula_dir']) | union(groups['nextcloud']) | sort %}
Job {
  Name = {{ hostvars[fd].inventory_hostname_short }}-mysql
  Client = {{ hostvars[fd].inventory_hostname_short }}-fd
  JobDefs = DefaultMySQLJob
}
{% endfor %}

{% for fd in groups['MDA'] | union(groups['MSA']) | union(groups['LDAP_provider']) | union(groups['MX']) | sort %}
Job {
  Name = {{ hostvars[fd].inventory_hostname_short }}-slapd
  Client = {{ hostvars[fd].inventory_hostname_short }}-fd
  JobDefs = DefaultSlapdJob
}
{% endfor %}


#
# Standard Restore template, to be changed by Console program
# Only one such job is needed for all Jobs/Clients/Storage ...
Job {
  Name = RestoreFiles
  Type = Restore
  Client= {{ inventory_hostname_short }}-fd
  FileSet = FileSetRoot
  Storage = {{ hostvars[ groups['bacula_sd'][0] ].inventory_hostname_short }}-sd
  Pool = Default
  Messages = Standard
  # NOTE: Files are put on the client (FD) that is being restored.
  Where = /tmp/bacula-restores
}


# When to do the backups, full backup on first sunday of the month,
#  differential (i.e. incremental since full) every other sunday,
#  and incremental backups other days
Schedule {
  Name = WeeklyCycle
  Run = Level=Full         Messages=Quiet 1st sun at 01:05
  Run = Level=Differential Messages=Quiet 2nd-5th sun at 01:05
  Run = Level=Incremental  Messages=Quiet mon-sat at 01:05
}

# Backup mailboxes: full backup every 3 months, hourly incremental backup
Schedule {
  Name = Mailboxes13WeeksCycle
  Run = Level=Full Pool=mailboxes-full w04 mon at 02:00
  Run = Level=Full Pool=mailboxes-full w17 mon at 02:00
  Run = Level=Full Pool=mailboxes-full w30 mon at 02:00
  Run = Level=Full Pool=mailboxes-full w43 mon at 02:00
  Run = Level=Differential Pool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet w05-w16 mon at 02:00
  Run = Level=Differential Pool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet w18-w29 mon at 02:00
  Run = Level=Differential Pool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet w31-w42 mon at 02:00
  Run = Level=Differential Pool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet w44-w03 mon at 02:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 00:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 01:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet tue-sun at 02:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 03:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 04:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 05:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 06:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 07:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 08:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 09:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 10:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 11:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 12:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 13:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 14:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 15:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 16:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 17:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 18:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 19:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 20:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 21:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 22:00
  Run = Level=Incremental Pool=mailboxes-inc DifferentialPool=mailboxes-diff FullPool=mailboxes-full Messages=Quiet mon-sun at 23:00
}

# Backup Nextcloud data: full backup every 3 months, hourly incremental backup
Schedule {
  Name = Nextcloud13WeeksCycle
  Run = Level=Full Pool=nextcloud-full w05 mon at 02:30
  Run = Level=Full Pool=nextcloud-full w18 mon at 02:30
  Run = Level=Full Pool=nextcloud-full w31 mon at 02:30
  Run = Level=Full Pool=nextcloud-full w44 mon at 02:30
  Run = Level=Differential Pool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet w06-w17 mon at 02:30
  Run = Level=Differential Pool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet w19-w30 mon at 02:30
  Run = Level=Differential Pool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet w32-w43 mon at 02:30
  Run = Level=Differential Pool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet w45-w04 mon at 02:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 00:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 01:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet tue-sun at 02:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 03:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 04:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 05:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 06:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 07:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 08:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 09:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 10:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 11:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 12:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 13:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 14:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 15:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 16:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 17:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 18:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 19:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 20:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 21:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 22:30
  Run = Level=Incremental Pool=nextcloud-inc DifferentialPool=nextcloud-diff FullPool=nextcloud-full Messages=Quiet mon-sun at 23:30
}

# This schedule does the databases. It starts after the WeeklyCycle
Schedule {
  Name = WeeklyCycleAfterBackup
  Run = Level=Full Messages=Quiet sun-sat at 01:10
}


# List of files to be backed up
FileSet {
  Name = BaculaHome
  Include {
    Options {
      signature = SHA1
      compression = GZIP
      verify = pins1
      noatime = yes
    }
    File = /var/lib/bacula
  }
  Exclude {
    File = /var/lib/bacula/tmp
  }
}

FileSet {
  Name = FileSetRoot
  Include {
    # The full /etc/ and /home/, zipped
    Options {
      WildDir = "/home/backup*"
      WildDir = "/home/mail*"
      WildFile = "*~"
      WildFile = "*#"
      Exclude = yes
    }
    Options {
      signature = SHA1
      compression = GZIP
    }
    File = /etc
    File = /home
    Exclude Dir Containing = .no-backup
  }
  Include {
    # /var/lib, excluding databases that can be dumped and backed up separately
    Options {
      WildDir = /var/lib/amavis
      WildDir = "/var/lib/apt*"
      WildDir = /var/lib/aspell
      WildDir = /var/lib/bacula
      WildDir = /var/lib/clamav
      WildDir = "/var/lib/drupal*"
      WildDir = /var/lib/ldap
      WildDir = /var/lib/mailman
      WildDir = /var/lib/mlocate
      WildDir = /var/lib/munin
      WildDir = /var/lib/mysql
      WildDir = /var/lib/postgresql
      WildDir = /var/lib/postgrey
      WildDir = /var/lib/rkhunter
      WildDir = /var/lib/roundcube
      WildDir = /var/lib/tor
      WildDir = /var/lib/usbutils
      WildFile = "*~"
      WildFile = "*#"
      Exclude = yes
    }
    Options {
      signature = SHA1
      compression = GZIP
    }
    File = /var/lib
    Exclude Dir Containing = .no-backup
  }
  Include {
    # Other interesting directories
    Options {
      WildDir = /var/cache
      WildDir = "/var/backup*"
      WildDir = /var/lib # processed earlier
      WildDir = /var/spool
      WildDir = "/var/log*"
      WildDir = /var/tmp
      WildFile = "*~"
      WildFile = "*#"
      Exclude = yes
    }
    Options {
      signature = SHA1
    }
    File = /bin
    File = /boot
    File = /lib
    File = /opt
    File = /root
    File = /sbin
    File = /srv
    File = /usr
    File = /var
    Exclude Dir Containing = .no-backup
  }
  Exclude {
    File = /proc
    File = /sys
    File = /run
    File = /tmp
    File = /.journal
    File = /.fsck
    File = /.autofsck
    File = /net
    File = /mnt
    File = /exports
    File = /misc
    File = /media
    File = /lost+found
  }
}

FileSet {
  Name = SQL
  Include {
    Options {
      signature = SHA1
      compression = GZIP
      verify = s1
    }
    File = /var/lib/bacula/tmp/dump.sql
  }
}

FileSet {
  Name = LDAP
  Include {
    Options {
      signature = SHA1
      compression = GZIP
      verify = s1
      WildFile = "*.ldif"
    }
    Options {
        Wild = "*"
        Exclude = yes
    }
    File = /var/lib/bacula/tmp
  }
}

FileSet {
  Name = Mailboxes
  Include {
    # NOTE: debug FileSet with:
    # `sudo -u bacula bconsole <<<"estimate job=mistral-mailboxes level=Full listing" | grep -F -e.{log,cache}`
    # we use RegexFile here since bacula's doesn't set FNM_PATHNAME so the `*' and `?' metacharacters match `/'
    Options {
      Exclude = yes

      # cached mailbox data: $mail_location/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
      RegexFile = "^/home/mail/virtual/[^/]+/[^/]+/mail/mailboxes/([^/]+/)+dbox-Mails/dovecot\\.index\\.cache$"
      # transaction log file: $mail_location/mailboxes/INBOX/dbox-Mails/dovecot.index.log
      RegexFile = "^/home/mail/virtual/[^/]+/[^/]+/mail/mailboxes/([^/]+/)+dbox-Mails/dovecot\\.index\\.log(\\.[0-9])?$"
      RegexFile = "^/home/mail/virtual/[^/]+/[^/]+/mail/storage/dovecot\\.map\\.index\\.log(\\.[0-9])?$"
      # mailbox list index files: $mail_location/dovecot.list.index.log
      RegexFile = "^/home/mail/virtual/[^/]+/[^/]+/mail/dovecot\\.list\\.index\\.log(\\.[0-9])?$"
      # mailbox changelog: $mail_location/dovecot.mailbox.log
      RegexFile = "^/home/mail/virtual/[^/]+/[^/]+/mail/dovecot\\.mailbox\\.log(\\.[0-9])?$"
      # sieve logfile: ~/dovecot.sieve
      RegexFile = "^/home/mail/virtual/[^/]+/[^/]+/dovecot\\.sieve\\.log(\\.[0-9])?$"

      # exclude queued files for SiS deduplication
      Wild = "/home/mail/attachments/queue/*"
    }
    Options {
      signature = SHA1
      verify = pins1
    }
    File = /home/mail/virtual
    File = /home/mail/attachments
    File = /home/mail/spamspool
  }
  Exclude {
      File = "/home/mail/lost+found"
  }
}

FileSet {
  Name = NextcloudData
  Include {
    Options {
      Exclude = yes
      RegexFile = "^/mnt/nextcloud-data/nextcloud\\.log(\\.[0-9])?$"
      RegexFile = "^/mnt/nextcloud-data/updater\\.log(\\.[0-9])?$"
      RegexDir = "^/mnt/nextcloud-data/[a-z0-9\\-]+/files_trashbin$"
      RegexDir = "^/mnt/nextcloud-data/[a-z0-9\\-]+/files_versions$"
      RegexDir = "^/mnt/nextcloud-data/[a-z0-9\\-]+/cache$"
      RegexDir = "^/mnt/nextcloud-data/[a-z0-9\\-]+/uploads$"
      RegexDir = "^/mnt/nextcloud-data/__groupfolders/trash$"
      RegexDir = "^/mnt/nextcloud-data/__groupfolders/versions$"
      RegexDir = "^/mnt/nextcloud-data/updater-[[:alnum:]]+$"
      RegexDir = "^/mnt/nextcloud-data/appdata_[[:alnum:]]+/preview$"
      RegexDir = "^/mnt/nextcloud-data/appdata_[[:alnum:]]+/[^/]+/cache$"
    }
    Options {
      signature = SHA1
      verify = pins1
    }
    File = /mnt/nextcloud-data
  }
  Exclude {
      File = "/mnt/nextcloud-data/lost+found"
  }
}


# Client (File Services) to backup
{% for fd in groups.all | sort %}
Client {
  Name = {{ hostvars[fd].inventory_hostname_short }}-fd
  Address = {{ ipsec[ hostvars[fd].inventory_hostname_short ] }}
  FDPort  = 9102
  Catalog = MyCatalog
  @|"sed -n '/^{{ hostvars[fd].inventory_hostname_short }}-fd\\s/ {s//Password = /p; q}' /etc/bacula/passwords-dir"
  File Retention = 4 months
  Job Retention = 5 months
  AutoPrune = yes
  #Maximum Bandwidth = 1mb/s
}
{% endfor %}


# Definition of file storage device
{% for sd in groups['bacula_sd'] | sort %}
Storage {
  Name = {{ hostvars[sd].inventory_hostname_short }}-sd
  Address = {{ ipsec[ hostvars[sd].inventory_hostname_short ] }}
  SDPort  = 9103
  @|"sed -n '/^{{ hostvars[sd].inventory_hostname_short }}-sd\\s/ {s//Password = /p; q}' /etc/bacula/passwords-dir"
  Device = FileStorage
  Media Type = File
}

{% endfor %}

# Default pool definition
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 3 months
  Maximum Volume Bytes = 5GB
  Label Format = "Default-${NumVols:p/4/0/r}"
}

# Scratch pool definition
Pool {
  Name = Scratch
  Pool Type = Backup
  Maximum Volume Bytes = 5GB
  Label Format = "Scratch-${NumVols:p/4/0/r}"
}

# System pools definition
{% for h in groups.all | sort %}
Pool {
  Name = {{ hostvars[h].inventory_hostname_short }}
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 3 months
  Maximum Volume Bytes = 5GB
  Label Format = "{{ hostvars[h].inventory_hostname_short }}-${NumVols:p/4/0/r}"
}
{% endfor %}

# Mailbox pool definition (full backup)
Pool {
  Name = mailboxes-full
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 26 weeks # >13 weeks cycle
  Maximum Volume Jobs = 1
  Label Format = "mailboxes-full-"
  Maximum Volumes = 3 # >2 volumes used at the end of retention period
}

# Mailbox pool definition (diff backup)
Pool {
  Name = mailboxes-diff
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 15 weeks # >13 weeks cycle
  Maximum Volume Jobs = 1
  Label Format = "mailboxes-diff-"
  Maximum Volumes = 20 # >15 volumes used at the end of retention period
}

# Mailbox pool definition (inc backup)
Pool {
  Name = mailboxes-inc
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 8 days # >1 week cycle
  Maximum Volume Jobs = 24 # group by day
  Label Format = "mailboxes-inc-"
  Maximum Volumes = 10 # >8 volumes used at the end of retention period
}

# Nextcloud pool definition (full backup)
Pool {
  Name = nextcloud-full
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 26 weeks # >13 weeks cycle
  Maximum Volume Jobs = 1
  Label Format = "nextcloud-full-"
  Maximum Volumes = 3 # >2 volumes used at the end of retention period
}

# Nextcloud pool definition (diff backup)
Pool {
  Name = nextcloud-diff
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 15 weeks # >13 weeks cycle
  Maximum Volume Jobs = 1
  Label Format = "nextcloud-diff-"
  Maximum Volumes = 20 # >15 volumes used at the end of retention period
}

# Nextcloud pool definition (inc backup)
Pool {
  Name = nextcloud-inc
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 8 days # >1 week cycle
  Maximum Volume Jobs = 24 # group by day
  Label Format = "nextcloud-inc-"
  Maximum Volumes = 10 # >8 volumes used at the end of retention period
}

# Database pool definition
Pool {
  Name = database
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 3 months
  Maximum Volume Bytes = 5GB
  Label Format = "database-${NumVols:p/4/0/r}"
}


# Generic catalog service
Catalog {
  Name = MyCatalog
  Password = ""
  DB Name = bacula
  User = bacula
}


# Reasonable message delivery -- send most everything to email address and to the console
Messages {
  Name = Standard
  MailCommand = "/usr/sbin/bsmtp -h localhost:16132 -f \"\(Bacula\) \<bacula@fripost.org\>\" -s \"Bacula: %t %e of %n %l\" %r"
  Mail = admin@fripost.org = all, !skipped
  OperatorCommand = "/usr/sbin/bsmtp -h localhost:16132 -f \"\(Bacula\) \<bacula@fripost.org\>\" -s \"Bacula: Intervention needed for %j\" %r"
  Operator = admin@fripost.org = mount
  Console = all, !skipped, !saved
  Append = "/var/log/bacula/bacula.log" = all, !skipped
  Catalog = all
}

# Report upon error only
Messages {
  Name = Quiet
  MailCommand = "/usr/sbin/bsmtp -h localhost:16132 -f \"\(Bacula\) \<bacula@fripost.org\>\" -s \"Bacula: %t %e of %n %l\" %r"
  Mail On Success = admin@fripost.org = all, !info, !fatal, !skipped, !notsaved, !restored
  MailCommand = "/usr/sbin/bsmtp -h localhost:16132 -f \"\(Bacula\) \<bacula@fripost.org\>\" -s \"Bacula: %t %e of %n %l\" %r"
  Mail On Error = admin@fripost.org = all, !skipped
  OperatorCommand = "/usr/sbin/bsmtp -h localhost:16132 -f \"\(Bacula\) \<bacula@fripost.org\>\" -s \"Bacula: Intervention needed for %j\" %r"
  Operator = admin@fripost.org = mount
  Console = all, !info, !restored, !skipped, !saved
  Append = "/var/lib/bacula/log" = all, !skipped
  Catalog = all
}

# Message delivery for daemon messages (no job).
Messages {
  Name = Daemon
  MailCommand = "/usr/sbin/bsmtp -h localhost:16132 -f \"\(Bacula\) \<bacula@fripost.org\>\" -s \"Bacula daemon message\" %r"
  Mail = admin@fripost.org = all, !skipped
  Console = all, !skipped, !saved
  Append = "/var/log/bacula/bacula.log" = all, !skipped
}