mirror of
https://github.com/aljazceru/plugins.git
synced 2025-12-19 22:24:19 +01:00
backend: Use th backup URL in backup-cli and add snapshot type to FileBackend
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
from backup import FileBackend
|
from backup import FileBackend, get_backend
|
||||||
import os
|
import os
|
||||||
import click
|
import click
|
||||||
import json
|
import json
|
||||||
@@ -7,10 +7,10 @@ import json
|
|||||||
|
|
||||||
@click.command()
|
@click.command()
|
||||||
@click.argument("lightning-dir", type=click.Path(exists=True))
|
@click.argument("lightning-dir", type=click.Path(exists=True))
|
||||||
@click.argument("backup-dir", type=click.Path(exists=True))
|
@click.argument("backend-url")
|
||||||
def init(lightning_dir, backup_dir):
|
def init(lightning_dir, backend_url):
|
||||||
destination = 'file://' + os.path.join(backup_dir, 'backup.dbak')
|
destination = backend_url
|
||||||
backend = FileBackend(destination)
|
backend = get_backend(destination)
|
||||||
backend.version, backend.prev_version = 0, 0
|
backend.version, backend.prev_version = 0, 0
|
||||||
backend.offsets = [512, 0]
|
backend.offsets = [512, 0]
|
||||||
backend.version_count = 0
|
backend.version_count = 0
|
||||||
@@ -23,6 +23,8 @@ def init(lightning_dir, backup_dir):
|
|||||||
'backend_url': destination,
|
'backend_url': destination,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
# TODO Take a snapshot
|
||||||
|
|
||||||
print("Initialized backup backend {destination}, you can now start c-lightning".format(
|
print("Initialized backup backend {destination}, you can now start c-lightning".format(
|
||||||
destination=destination,
|
destination=destination,
|
||||||
))
|
))
|
||||||
|
|||||||
@@ -132,10 +132,11 @@ class FileBackend(Backend):
|
|||||||
with open(self.url.path, 'ab') as f:
|
with open(self.url.path, 'ab') as f:
|
||||||
f.seek(self.offsets[0])
|
f.seek(self.offsets[0])
|
||||||
f.write(length)
|
f.write(length)
|
||||||
|
f.write(typ)
|
||||||
f.write(payload)
|
f.write(payload)
|
||||||
self.prev_version, self.offsets[1] = self.version, self.offsets[0]
|
self.prev_version, self.offsets[1] = self.version, self.offsets[0]
|
||||||
self.version = entry.version
|
self.version = entry.version
|
||||||
self.offsets[0] += 4 + len(payload)
|
self.offsets[0] += 5 + len(payload)
|
||||||
self.write_metadata()
|
self.write_metadata()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
@@ -163,6 +164,15 @@ def resolve_backend_class(backend_url):
|
|||||||
return backend_cl
|
return backend_cl
|
||||||
|
|
||||||
|
|
||||||
|
def get_backend(destination):
|
||||||
|
backend_cl = resolve_backend_class(destination)
|
||||||
|
if backend_cl is None:
|
||||||
|
raise ValueError("No backend implementation found for {destination}".format(
|
||||||
|
destination=destination,
|
||||||
|
))
|
||||||
|
return backend_cl(destination)
|
||||||
|
|
||||||
|
|
||||||
def abort(reason: str) -> None:
|
def abort(reason: str) -> None:
|
||||||
plugin.log(reason)
|
plugin.log(reason)
|
||||||
plugin.rpc.stop()
|
plugin.rpc.stop()
|
||||||
@@ -246,12 +256,7 @@ def on_init(options: Mapping[str, str], plugin: Plugin, **kwargs):
|
|||||||
if not plugin.db_path.startswith('sqlite3'):
|
if not plugin.db_path.startswith('sqlite3'):
|
||||||
abort("The backup plugin only works with the sqlite3 database.")
|
abort("The backup plugin only works with the sqlite3 database.")
|
||||||
|
|
||||||
# Let's initialize the backed. First we need to figure out which backend to use.
|
plugin.backend = get_backend(destination)
|
||||||
backend_cl = resolve_backend_class(destination)
|
|
||||||
if backend_cl is None:
|
|
||||||
abort("Could not find a backend for scheme {p.scheme}".format(p=p))
|
|
||||||
|
|
||||||
plugin.backend = backend_cl(destination)
|
|
||||||
if not plugin.backend.initialize():
|
if not plugin.backend.initialize():
|
||||||
abort("Could not initialize the backup {}, please use 'backup-cli' to initialize the backup first.".format(destination))
|
abort("Could not initialize the backup {}, please use 'backup-cli' to initialize the backup first.".format(destination))
|
||||||
|
|
||||||
|
|||||||
@@ -12,20 +12,13 @@ cli_path = os.path.join(os.path.dirname(__file__), "backup-cli")
|
|||||||
|
|
||||||
|
|
||||||
def test_start(node_factory, directory):
|
def test_start(node_factory, directory):
|
||||||
bdest = os.path.join(directory, 'lightning-1', 'backup.dbak')
|
|
||||||
opts = {
|
|
||||||
'plugin': plugin_path,
|
|
||||||
'backup-destination': 'file://' + bdest,
|
|
||||||
}
|
|
||||||
|
|
||||||
subprocess.check_call([cli_path, "init", directory, directory])
|
|
||||||
bpath = os.path.join(directory, 'lightning-1', 'regtest')
|
bpath = os.path.join(directory, 'lightning-1', 'regtest')
|
||||||
bdest = os.path.join(bpath, 'backup.dbak')
|
bdest = 'file://' + os.path.join(bpath, 'backup.dbak')
|
||||||
os.makedirs(bpath)
|
os.makedirs(bpath)
|
||||||
subprocess.check_call([cli_path, "init", bpath, bpath])
|
subprocess.check_call([cli_path, "init", bpath, bdest])
|
||||||
opts = {
|
opts = {
|
||||||
'plugin': plugin_path,
|
'plugin': plugin_path,
|
||||||
'backup-destination': 'file://' + bdest,
|
'backup-destination': bdest,
|
||||||
}
|
}
|
||||||
l1 = node_factory.get_node(options=opts, cleandir=False)
|
l1 = node_factory.get_node(options=opts, cleandir=False)
|
||||||
|
|
||||||
@@ -48,12 +41,12 @@ def test_tx_abort(node_factory, directory):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
bpath = os.path.join(directory, 'lightning-1', 'regtest')
|
bpath = os.path.join(directory, 'lightning-1', 'regtest')
|
||||||
bdest = os.path.join(bpath, 'backup.dbak')
|
bdest = 'file://' + os.path.join(bpath, 'backup.dbak')
|
||||||
os.makedirs(bpath)
|
os.makedirs(bpath)
|
||||||
subprocess.check_call([cli_path, "init", bpath, bpath])
|
subprocess.check_call([cli_path, "init", bpath, bdest])
|
||||||
opts = {
|
opts = {
|
||||||
'plugin': plugin_path,
|
'plugin': plugin_path,
|
||||||
'backup-destination': 'file://' + bdest,
|
'backup-destination': bdest,
|
||||||
}
|
}
|
||||||
l1 = node_factory.get_node(options=opts, cleandir=False)
|
l1 = node_factory.get_node(options=opts, cleandir=False)
|
||||||
l1.stop()
|
l1.stop()
|
||||||
@@ -78,12 +71,12 @@ def test_failing_restore(nf, directory):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
bpath = os.path.join(directory, 'lightning-1', 'regtest')
|
bpath = os.path.join(directory, 'lightning-1', 'regtest')
|
||||||
bdest = os.path.join(bpath, 'backup.dbak')
|
bdest = 'file://' + os.path.join(bpath, 'backup.dbak')
|
||||||
os.makedirs(bpath)
|
os.makedirs(bpath)
|
||||||
subprocess.check_call([cli_path, "init", bpath, bpath])
|
subprocess.check_call([cli_path, "init", bpath, bdest])
|
||||||
opts = {
|
opts = {
|
||||||
'plugin': plugin_path,
|
'plugin': plugin_path,
|
||||||
'backup-destination': 'file://' + bdest,
|
'backup-destination': bdest,
|
||||||
}
|
}
|
||||||
l1 = node_factory.get_node(options=opts, cleandir=False)
|
l1 = node_factory.get_node(options=opts, cleandir=False)
|
||||||
l1.stop()
|
l1.stop()
|
||||||
@@ -103,12 +96,12 @@ def test_intermittent_backup(node_factory, directory):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
bpath = os.path.join(directory, 'lightning-1', 'regtest')
|
bpath = os.path.join(directory, 'lightning-1', 'regtest')
|
||||||
bdest = os.path.join(bpath, 'backup.dbak')
|
bdest = 'file://' + os.path.join(bpath, 'backup.dbak')
|
||||||
os.makedirs(bpath)
|
os.makedirs(bpath)
|
||||||
subprocess.check_call([cli_path, "init", bpath, bpath])
|
subprocess.check_call([cli_path, "init", bpath, bdest])
|
||||||
opts = {
|
opts = {
|
||||||
'plugin': plugin_path,
|
'plugin': plugin_path,
|
||||||
'backup-destination': 'file://' + bdest,
|
'backup-destination': bdest,
|
||||||
}
|
}
|
||||||
l1 = node_factory.get_node(options=opts, cleandir=False)
|
l1 = node_factory.get_node(options=opts, cleandir=False)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user