From a6d4d56558fc438500c345b6e8d568ac729b5497 Mon Sep 17 00:00:00 2001 From: Lorryrui <1499192169@qq.com> Date: Mon, 25 Jun 2018 14:19:20 +0800 Subject: [PATCH 1/2] SSL cer/key, from env --- README.rst | 6 ++++++ etcddump/operations.py | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 076fe96..508371e 100644 --- a/README.rst +++ b/README.rst @@ -36,6 +36,12 @@ Usage is really simple and has been thought so that it resembles how most dumper # dump to stdout etcdumper dump https://etcd.example.com:4001 + # vim ~/.bash_profile, SSL file path, from env variables + ETCD_SSL_CER="/Users/Lorryrui/etcd.pem" + ETCD_SSL_KEY="/Users/Lorryrui/etcd.key" + export ETCD_SSL_CER + export ETCD_SSL_KEY + # dump to file etcdumper --file dump.json dump https://etcd.example.com:4001 diff --git a/etcddump/operations.py b/etcddump/operations.py index 0c2a547..98180d1 100644 --- a/etcddump/operations.py +++ b/etcddump/operations.py @@ -2,6 +2,7 @@ import etcd import json import sys +import os class BaseOperations(object): @@ -10,10 +11,15 @@ def __init__(self, url='http://localhost:4001'): self.get_client(url) - def get_client(self, url, ca_cert=None, cert=None): + def get_client(self, url,cert=None): parsed = urlparse(url) (h, p) = parsed.netloc.split(':') - self.client = etcd.Client(host=h, port=int(p), protocol=parsed.scheme, allow_reconnect=False, ca_cert=ca_cert, cert=cert) + + # SSL certificate, env variables + if parsed.scheme == 'https': + cert = (os.getenv('ETCD_SSL_CER'),os.getenv('ETCD_SSL_KEY')) + + self.client = etcd.Client(host=h, port=int(p), protocol=parsed.scheme, allow_reconnect=False, cert=cert) def entry_from_result(self, entry): return { @@ -78,4 +84,4 @@ def fillin(self, idx, lastidx): return idx def write(self, entry): - return self.client.write(entry['key'].encode('utf-8'), entry['value'].encode('utf-8'), ttl = entry['ttl'], dir = entry['dir']) + return self.client.write(entry['key'].encode('utf-8'), entry['value'].encode('utf-8'), ttl = entry['ttl'], dir = entry['dir']) From 3c4cee864aff67bd851e29a961188f54de64be5a Mon Sep 17 00:00:00 2001 From: Lorryrui <1499192169@qq.com> Date: Tue, 26 Jun 2018 08:55:30 +0800 Subject: [PATCH 2/2] bug fix: restore from dump.json --- etcddump/cli.py | 2 +- etcddump/operations.py | 26 +++++--------------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/etcddump/cli.py b/etcddump/cli.py index 72f94d2..87a386b 100644 --- a/etcddump/cli.py +++ b/etcddump/cli.py @@ -18,4 +18,4 @@ def main(**kw): cl.dump(filename=args.file) elif args.action == 'restore': cl = operations.Restorer(url=args.host) - cl.restore(filename=args.file, preserve_indexes=args.preserve_indexes) + cl.restore(filename=args.file) diff --git a/etcddump/operations.py b/etcddump/operations.py index 98180d1..0061db5 100644 --- a/etcddump/operations.py +++ b/etcddump/operations.py @@ -4,6 +4,9 @@ import sys import os +reload(sys) +sys.setdefaultencoding('utf8') + class BaseOperations(object): @@ -52,15 +55,8 @@ def dump(self, filename=None): print(json.dumps(dumplist)) class Restorer(BaseOperations): - def fake_entry(self): - return { - 'key': '/_etcd_dumper/bogus', - 'value': 'bogus', - 'ttl': 1, - 'dir': False - } - def restore(self, filename=None, preserve_indexes=False): + def restore(self, filename=None): if filename: with open(filename, 'rb') as f: data = json.load(f) @@ -68,20 +64,8 @@ def restore(self, filename=None, preserve_indexes=False): with sys.stdin as f: data = json.load(f) - lastidx = 0 - for entry in data: - if preserve_indexes: - self.fillin(entry['index'], lastidx) - r = self.write(entry) - lastidx = r.modifiedIndex - - def fillin(self, idx, lastidx): - while (idx < (lastidx - 1)): - r = self.write(fake_entry) - idx = r.modifiedIndex - return idx def write(self, entry): - return self.client.write(entry['key'].encode('utf-8'), entry['value'].encode('utf-8'), ttl = entry['ttl'], dir = entry['dir']) + return self.client.write(entry['key'], entry['value'], ttl = entry['ttl'], dir = entry['dir'])