self.collecty = collecty
+ @dbus.service.method(BUS_DOMAIN, in_signature="s")
+ def Backup(self, filename):
+ self.collecty.backup(filename)
+
@dbus.service.method(BUS_DOMAIN, in_signature="sa{sv}", out_signature="a{sv}")
def GenerateGraph(self, template_name, kwargs):
"""
self.proxy = self.bus.get_object(BUS_DOMAIN, "/GraphGenerator")
+ def backup(self, filename):
+ """
+ Writes a backup of everything to file given filehandle
+ """
+ self.proxy.Backup(filename)
+
+ def backup_cli(self, ns):
+ print(_("Backing up..."))
+
+ self.backup(ns.filename)
+
def last_update(self, template_name, **kwargs):
last_update = self.proxy.LastUpdate(template_name, kwargs)
help=_("Lists all graph templates"))
parser_list_templates.set_defaults(func=self.list_templates_cli)
+ # backup
+ backup = subparsers.add_parser("backup",
+ help=_("Backup all RRD data"),
+ )
+ backup.add_argument("filename", nargs="?")
+ backup.set_defaults(func=self.backup_cli)
+
# version
parser_version = subparsers.add_parser("version", help=_("Show version"))
parser_version.set_defaults(func=self.version_cli)
import rrdtool
import sched
import signal
+import tarfile
+import tempfile
import time
from . import bus
return plugin.last_update(*args, **kwargs)
+ def backup(self, filename):
+ # Write all data to disk first
+ self.write_queue.commit()
+
+ log.info(_("Backing up to %s..." % filename))
+
+ # Opening a compressed tar file with will have all files added to it
+ with tarfile.open(filename, mode="w:gz") as archive:
+ for path, directories, files in os.walk(DATABASE_DIR):
+ for file in files:
+ # Skip any non-RRD files
+ if not file.endswith(".rrd"):
+ continue
+
+ # Compose the full file path
+ file = os.path.join(path, file)
+
+ log.debug(_("Adding %s to backup...") % file)
+
+ with tempfile.NamedTemporaryFile() as t:
+ rrdtool.dump(file, t.name)
+
+ # Add the file to the archive
+ archive.add(
+ t.name, arcname=file[len(DATABASE_DIR):],
+ )
+
+ log.info(_("Backup finished"))
+
class WriteQueue(object):
def __init__(self, collecty):