#!/usr/bin/ruby

# Was noch fehlt

def writehtml(text = [])
  html = ['<!DOCTYPE html>', '<html lang="de">', '<head>', '<meta charset="UTF-8">']
  html += ['<title>Backup</title>', '<meta name="description" content="Backup">']
  html += ['<style>', '.ok {color: green;}', '.notok {color: red;}']
  html += ['details {background-color: rgb(204, 204, 204);', 'border: 1px solid black;']
  html += ['border-radius: 0.5em 0.5em 0.5em 0.5em;', 'margin: 2px;', 'padding: 1em;}']
  html += ['summary {list-style: none;}', '</style>']
  html += ['</head>','<body>']
    #<!-- <link href="design.css" rel="stylesheet"> -->
  html += text
  html +=['</body>','</html>']
  File.write('/var/www/backup/index.html', html.join("\n"))
end

def exitstat ()
  col = 'notok'
  if $?.exitstatus == 0
    col = 'ok'
  end
  return col
end

def details (sum = "", text = "")
  time = Time.new
  #timestr = "#{time.hour.rjust(2, '0')}:#{time.min.rjust(2, '0')}:#{time.sec.rjust(2, '0')}"
  timestr = time.strftime('%Y-%m-%d')
  text = text.strip
  text = text.gsub(",", "<br>")
  text = text.gsub("\n", "<br>")
  ok = exitstat()
  if text == ""
    text = "keine Details vorhanden"
  end
  ret = ["<details>"]
  ret += ['<summary class="%s"> %s %s</summary>' % [ok, timestr, sum]]
  ret += ["#{text}", "</details>"]
  return ret
end

def cmd(cmdstr = "")
  ret_str = "<br><b>#{cmdstr}</b><br><br>"
  ret_str += `#{cmdstr}`
  return ret_str
end


container = `incus ls -c n -f csv`
container = container.split("\n")
#container = ["memo"]
time = Time.new
backup_log = ['<h1>Backup %s-%s-%s</h1>' % [time.year, time.month, time.day]]
backup_log += ['<h2>Backup Vorarbeiten</h2>']

# Passwörter sichern
cmdlog = cmd("incus exec nextcloud -q --user 33 -- php /var/www/nextcloud/occ passwords:backup:create passwords_backu 2>&1")
backup_log += details("create Passwords", cmdlog)
writehtml(backup_log)

cmdlog = cmd("incus exec nextcloud -q --user 33 -- php /var/www/nextcloud/occ passwords:backup:export passwords_backup 2>&1")
backup_log += details("export Passwords", cmdlog)
writehtml(backup_log)

cmdlog = cmd('incus stop --all')
backup_log += details("Stop All Container", cmdlog)
writehtml(backup_log)


ENV['RESTIC_REPOSITORY'] ='s3:s3.eu-central-2.wasabisys.com/backup42'
ENV['AWS_ACCESS_KEY_ID'] = 'QTBWHEL7FRTCUJHL4E8N'
ENV['AWS_SECRET_ACCESS_KEY'] = 'uasNkjIZKTt1MTN4qfQvllvjKlSby6rRJpFzLdpD'
ENV['RESTIC_PASSWORD'] = 'lkjapfj45woem#ee(%WKNIUGf'
cmdlog = cmd("restic -r s3:s3.eu-central-2.wasabisys.com/backup42 unlock 2>&1")
backup_log += details("restic Clear", cmdlog)
writehtml(backup_log)

backup_log += ['<h2>Backup Incus Container</h2>']
backup_log += ['<h3>Erstelle ContainerAbbild</h3>']

# container -> tar
container.each do |con|
  cmdlog = cmd("incus export --compression none --instance-only #{con} #{con}.tar 2>&1")
  backup_log += details("export #{con} Container", cmdlog)
  writehtml(backup_log)
end

#cmdlog = cmd("restic backup --host incus ./*.tar 2>&1")
backup_log += details("Backup Container", cmdlog)
writehtml(backup_log)

`rm ./*.tar`
`incus start db`
sleep 5

backup_log += ['<h2>Backup Datenbank</h2>']

# nextcloud
cmd("mkdir /var/DBBackup")
cmdlog = cmd("incus exec db --user 101 -- pg_dump --create --no-owner -Fc nextcloud > /var/DBBackup/nextcloud.dump 2>&1")
cmdlog = cmd("incus exec db --user 101 -- pg_dump --create --no-owner -Fc gitea > /var/DBBackup/gitea.dump 2>&1")
cmdlog = cmd("incus exec db --user 101 -- pg_dumpall -U postgres --globals-only > /var/DBBackup/globalRolle.sql 2>&1")

cmdlog += cmd("pg_restore /var/DBBackup/nextcloud.dump > /dev/null 2>&1")
cmdlog += cmd("pg_restore /var/DBBackup/gitea.dump > /dev/null 2>&1")
cmdlog += cmd("restic backup --host DB  /var/DBBackup/ 2>&1")
backup_log += details("Backup DB", cmdlog)
writehtml(backup_log)


#gitea
#cmdlog = cmd("incus exec db --user 101 -- pg_dump --create --no-owner -Fc gitea > /var/gitea.dump 2>&1")
#cmdlog += cmd("pg_restore /var/gitea.dump > /dev/null 2>&1")
#cmdlog+= cmd("restic backup --host giteaDB /var/gitea.dump 2>&1")
#backup_log += details("Backup Gitea DB", cmdlog)
#writehtml(backup_log)
cmd("rm -r /var/DBBackup")

#paper
#`incus exec db --user 101 -- pg_dump --create -v --no-owner -Ft paper | restic backup \
#--host paperDB --tag systemd.timer --stdin --stdin-filename paperDUMP.tar`

# start all container

`incus start --all`

backup_log += ['<h2>Backup FileSystem</h2>']

cmdlog = cmd("restic backup --one-file-system --host netcup2024 --exclude-caches / 2<&1")
backup_log += details("Backup Server Root Filesystem", cmdlog)
writehtml(backup_log)


cmdlog = cmd("restic backup --one-file-system --host netcupSpeicher2024 --tag systemd.timer \
  --exclude-caches --exclude=**preview /mnt/storage/ 2>&1")
backup_log += details("Backup Server Extendet Filesystem", cmdlog)
writehtml(backup_log)

backup_log += ['<h2>Backup Nacharbeiten</h2>']
cmdlog = cmd("restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --keep-yearly 3 2<&1")
backup_log += details("Restic Forget", cmdlog)
writehtml(backup_log)

cmdlog = cmd('restic prune 2<&1')
backup_log += details("Restic Prune", cmdlog)
writehtml(backup_log)

cmdlog = cmd("restic check --read-data-subset=5.0% 2<&1")
backup_log += details("Restic Check", cmdlog)
writehtml(backup_log)


backup_log += ['<h2>Updates</h2>']
#backup_log += ['<h3>Update System</h3>']
cmdlog = cmd('apt-get -y update')
cmdlog += cmd('apt-get -y upgrade')
backup_log += details("Update System", cmdlog)
writehtml(backup_log)

# container -> Backup

container.each do |con|
  cmdlog = cmd("incus exec #{con} --env DEBIAN_FRONTEND=noninteractive -- apt-get -y update")
  cmdlog += cmd("incus exec #{con} --env DEBIAN_FRONTEND=noninteractive -- apt-get -y upgrade")
  backup_log += details("Update Container #{con}", cmdlog)
  writehtml(backup_log)
end
backup_log += ['<h2>---> ENDE <---</h2>']
writehtml(backup_log)
