| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #!/usr/bin/python3
- # -*- coding: utf-8 -*-
- # $Id: btrfs-diskusage.py,v 1.1 2022/10/17 07:53:20 springm Exp springm $
- # $Revision: 1.1 $
- # $Date: 2022/10/17 07:53:20 $
- # $Log: btrfs-diskusage.py,v $
- # Revision 1.1 2022/10/17 07:53:20 springm
- # Initial revision
- '''
- * (shell) Lokaler Mount der Backup-Kopie
- * backup_the_backup.sh muss als root laufen.
- * rsync-kopiere repository von hermes (backup_the_backup.sh)
- /var/lib/restic und /var/lib/restic/backupcopies.json auf hermes
- müssen für springm beschreibbar sein
- * Hole json-file per scp von hermes
- * update json-file lokal
- * Eintrag mit aktuellem Datum
- * __summary updaten
- * kopiere json-file per scp auf hermes
- * umount der Backup-Kopie
- '''
- # ------------------------------------------- start script variables ---
- remotehost = 'hermes'
- ssh_username = 'root'
- remoterepo = '/backupdisk/backupdisk/restic-repo'
- json_remotefile = '/var/lib/restic/backupcopies.json'
- json_localfile = '/tmp/backupcopies.json'
- # UUID ermitteln mit blkid
- snapcolors = { 'a0942a33-911d-429f-9e7d-cf38f3730525' : 'blau',
- '1faf4622-fd5d-4cde-8d6a-8c9e9b0c7c5b' : 'violett' }
- # --------------------------------------------- end script variables ---
- import argparse
- import datetime
- from datetime import datetime, timedelta, timezone
- import json
- import re
- import socket
- import subprocess
- import sys
- from paramiko import SSHClient
- from scp import SCPClient
- jso = {}
- def load_jsonfile( ):
- try:
- with SCPClient(ssh.get_transport()) as scp:
- scp.get(json_remotefile, local_path=json_localfile)
- with open(json_localfile, 'r') as openfile:
- jso = json.load(openfile)
- except:
- print(f"Warning: could not get {json_remotefile} from {remotehost}")
- def disc_free ( mountpoint, host ):
- if host != False:
- # cmd = [ 'ssh', host, 'bash', '-c', f"df | grep {mountpoint} | cut -b 57-68,70-72" ]
- cmd = [ 'ssh', host, 'bash', '-c', f"df | grep {mountpoint} | cut -b 52-61,64-68" ]
- s = subprocess.check_output( cmd ).decode('utf-8').strip().split(' ')
- print("-".join(s))
- else:
- cmd = [ 'bash', '-c', f"df | grep {mountpoint} | cut -b 51-61,64-66" ]
- s = subprocess.check_output( cmd ).decode('utf-8').strip().split(' ')
- return( { 'fill_level' : s[1], 'bytes_free' : s[0] } )
- def disc_blkid ( mapperdev, host ):
- if host != False:
- cmd = [ 'ssh', host, f"""lsblk -n -o UUID {mapperdev}"""]
- s = subprocess.check_output( cmd ).decode('utf-8')
- else:
- cmd = [ 'bash', '-c', f"""lsblk -n -o UUID {mapperdev}"""]
- s = subprocess.check_output( cmd ).decode('utf-8')
- s = s.strip("\n")
- return(s)
- def nextcolor ( blkid ):
- for key in snapcolors:
- if key != blkid:
- return snapcolors[key]
- def update_json ():
- now = str(datetime.fromisoformat(args.repolastupdate))
- jso[now] = {}
-
- r_blkid = disc_blkid('/dev/mapper/backupdisk', remotehost)
- jso[now][r_blkid] = {}
- jso[now][r_blkid]['backup_server'] = remotehost
- jso[now][r_blkid]['bytes_free'] = disc_free('/backupdisk', remotehost)['bytes_free']
- jso[now][r_blkid]['fill_level'] = disc_free('/backupdisk', remotehost)['fill_level']
- print(jso[now][r_blkid]['fill_level'])
- localdevice = subprocess.check_output(['/usr/bin/grep', args.localrepobasedir, '/proc/mounts']).decode('utf-8').split()[0]
- blkid = disc_blkid(localdevice, False) # localhost
- jso[now][blkid] = {}
- jso[now][blkid]['bytes_free'] = disc_free(args.localrepobasedir, False)['bytes_free']
- jso[now][blkid]['fill_level'] = disc_free(args.localrepobasedir, False)['fill_level']
- jso[now][blkid]['color'] = snapcolors[blkid]
- jso['__summary'] = { 'last_backup_copy' : now,
- 'last_backup_blkid' : blkid,
- 'last_backup_color' : snapcolors[blkid],
- 'last_remotefreebytes' : jso[now][r_blkid]['bytes_free'],
- 'last_localfreebytes' : jso[now][blkid]['bytes_free'],
- 'last_remotefilllevel' : jso[now][r_blkid]['fill_level'],
- 'last_localfilllevel' : jso[now][blkid]['fill_level'],
- 'next_backup_color' : nextcolor(blkid) }
- def write_json():
- with open(json_localfile, 'w', encoding='utf-8') as f:
- json.dump(jso, f, ensure_ascii=False, indent=4)
- try:
- with SCPClient(ssh.get_transport()) as scp:
- scp.put(json_localfile, json_remotefile)
- except:
- print(f"Error: could not copy {json_localfile} to {remotehost}:{json_remotefile}")
- def rewrite_snapshots_json(host):
- cmd = [ 'ssh', f"""{ssh_username}@{host}""", 'bash', '-c', "/usr/local/sbin/restic_json.sh" ]
- print(cmd)
- s = subprocess.check_output( cmd ).decode('utf-8').strip().split(' ')
- print(" ".join(s))
- # ------------------------------------------------------------- main ---
- parser = argparse.ArgumentParser(
- prog = sys.argv[0],
- description = 'Update json file of backup-of-backup stats',
- epilog = 'Markus ist ein cooler Hund')
- parser.add_argument('--localrepobasedir', help='local basedir of restic repo', required=True)
- parser.add_argument('--repolastupdate', help='last update timestamp of repo in full iso format', required=True)
- args = parser.parse_args()
- ssh = SSHClient()
- ssh.load_system_host_keys()
- ssh.connect(remotehost, username=ssh_username)
- load_jsonfile()
- update_json()
- #print(json.dumps(jso, sort_keys=True, indent=4))
- write_json()
- rewrite_snapshots_json(remotehost)
|