big refactoring: command line options and electrum.conf options override settings in wallet file.
This commit is contained in:
@@ -1,66 +1,176 @@
|
||||
import json
|
||||
import os
|
||||
import json, ast
|
||||
import os, ast
|
||||
from util import user_dir
|
||||
|
||||
from version import ELECTRUM_VERSION, SEED_VERSION
|
||||
from interface import parse_proxy_options
|
||||
|
||||
|
||||
# old stuff.. should be removed at some point
|
||||
def replace_keys(obj, old_key, new_key):
|
||||
if isinstance(obj, dict):
|
||||
if old_key in obj:
|
||||
obj[new_key] = obj[old_key]
|
||||
del obj[old_key]
|
||||
for elem in obj.itervalues():
|
||||
replace_keys(elem, old_key, new_key)
|
||||
elif isinstance(obj, list):
|
||||
for elem in obj:
|
||||
replace_keys(elem, old_key, new_key)
|
||||
|
||||
def old_to_new(d):
|
||||
replace_keys(d, 'blk_hash', 'block_hash')
|
||||
replace_keys(d, 'pos', 'index')
|
||||
replace_keys(d, 'nTime', 'timestamp')
|
||||
replace_keys(d, 'is_in', 'is_input')
|
||||
replace_keys(d, 'raw_scriptPubKey', 'raw_output_script')
|
||||
|
||||
|
||||
|
||||
class SimpleConfig:
|
||||
|
||||
default_options = {
|
||||
"gui": "lite",
|
||||
"proxy": None,
|
||||
"winpos-qt": [100, 100, 840, 400],
|
||||
"winpos-lite": [4, 25, 351, 149],
|
||||
"history": False
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
# Find electrum data folder
|
||||
self.config_folder = user_dir()
|
||||
# Read the file
|
||||
if os.path.exists(self.config_file_path()):
|
||||
self.load_config()
|
||||
def __init__(self, options):
|
||||
|
||||
self.wallet_config = {}
|
||||
self.read_wallet_config(options.wallet_path)
|
||||
|
||||
self.common_config = {}
|
||||
self.read_common_config()
|
||||
|
||||
self.options_config = {}
|
||||
|
||||
if options.server: self.options_config['server'] = options.server
|
||||
if options.proxy: self.options_config['proxy'] = parse_proxy_options(options.proxy)
|
||||
if options.gui: self.options_config['gui'] = options.gui
|
||||
|
||||
|
||||
|
||||
def set_key(self, key, value, save = False):
|
||||
# find where a setting comes from and save it there
|
||||
if self.options_config.get(key):
|
||||
return
|
||||
|
||||
elif self.wallet_config.get(key):
|
||||
self.wallet_config[key] = value
|
||||
if save: self.save_wallet_config()
|
||||
|
||||
elif self.common_config.get(key):
|
||||
self.common_config[key] = value
|
||||
if save: self.save_common_config()
|
||||
|
||||
else:
|
||||
self.config = self.default_options
|
||||
# Make config directory if it does not yet exist.
|
||||
if not os.path.exists(self.config_folder):
|
||||
os.mkdir(self.config_folder)
|
||||
self.save_config()
|
||||
# add key to wallet config
|
||||
self.wallet_config[key] = value
|
||||
if save: self.save_wallet_config()
|
||||
|
||||
# This is a friendly fallback to the old style default proxy options
|
||||
if(self.config.get("proxy") is not None and self.config["proxy"]["mode"] == "none"):
|
||||
self.set_key("proxy", None, True)
|
||||
|
||||
def set_key(self, key, value, save = True):
|
||||
self.config[key] = value
|
||||
if save == True:
|
||||
self.save_config()
|
||||
def get(self, key, default=None):
|
||||
# 1. command-line options always override everything
|
||||
if self.options_config.has_key(key):
|
||||
# print "found", key, "in options"
|
||||
out = self.options_config.get(key)
|
||||
|
||||
def save_config(self):
|
||||
if not os.path.exists(self.config_folder):
|
||||
os.mkdir(self.config_folder)
|
||||
f = open(self.config_file_path(), "w+")
|
||||
f.write(json.dumps(self.config))
|
||||
|
||||
def load_config(self):
|
||||
f = open(self.config_file_path(), "r")
|
||||
file_contents = f.read()
|
||||
if file_contents:
|
||||
user_config = json.loads(file_contents)
|
||||
for i in user_config:
|
||||
self.config[i] = user_config[i]
|
||||
# 2. configuration file overrides wallet file
|
||||
elif self.common_config.has_key(key):
|
||||
out = self.common_config.get(key)
|
||||
|
||||
else:
|
||||
self.config = self.default_options
|
||||
self.save_config()
|
||||
|
||||
def config_file_path(self):
|
||||
return "%s" % (self.config_folder + "/config.json")
|
||||
out = self.wallet_config.get(key)
|
||||
|
||||
def __init__(self):
|
||||
# Find electrum data folder
|
||||
self.config_folder = user_dir()
|
||||
self.config = self.default_options
|
||||
# Read the file
|
||||
if os.path.exists(self.config_file_path()):
|
||||
self.load_config()
|
||||
self.save_config()
|
||||
if out is None and default is not None:
|
||||
out = default
|
||||
return out
|
||||
|
||||
|
||||
def is_modifiable(self, key):
|
||||
if self.options_config.has_key(key) or self.common_config.has_key(key):
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
def read_common_config(self):
|
||||
for name in [ os.path.join( user_dir(), 'electrum.conf') , '/etc/electrum.conf']:
|
||||
if os.path.exists(name):
|
||||
from interface import parse_proxy_options
|
||||
try:
|
||||
import ConfigParser
|
||||
except:
|
||||
print "cannot parse electrum.conf. please install ConfigParser"
|
||||
return
|
||||
|
||||
p = ConfigParser.ConfigParser()
|
||||
p.read(name)
|
||||
try:
|
||||
self.common_config['server'] = p.get('interface','server')
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
self.common_config['proxy'] = parse_proxy_options(p.get('interface','proxy'))
|
||||
except:
|
||||
pass
|
||||
break
|
||||
|
||||
|
||||
|
||||
def init_path(self, wallet_path):
|
||||
"""Set the path of the wallet."""
|
||||
if wallet_path is not None:
|
||||
self.path = wallet_path
|
||||
return
|
||||
|
||||
# Look for wallet file in the default data directory.
|
||||
# Keeps backwards compatibility.
|
||||
wallet_dir = user_dir()
|
||||
|
||||
# Make wallet directory if it does not yet exist.
|
||||
if not os.path.exists(wallet_dir):
|
||||
os.mkdir(wallet_dir)
|
||||
self.path = os.path.join(wallet_dir, "electrum.dat")
|
||||
|
||||
|
||||
|
||||
def save_common_config(self):
|
||||
s = repr(self.common_config)
|
||||
# todo: decide what to do
|
||||
print "not saving settings in common config:", s
|
||||
|
||||
|
||||
|
||||
def read_wallet_config(self, path):
|
||||
"""Read the contents of the wallet file."""
|
||||
self.wallet_file_exists = False
|
||||
self.init_path(path)
|
||||
try:
|
||||
with open(self.path, "r") as f:
|
||||
data = f.read()
|
||||
except IOError:
|
||||
return
|
||||
try:
|
||||
d = ast.literal_eval( data ) #parse raw data from reading wallet file
|
||||
old_to_new(d)
|
||||
except:
|
||||
raise IOError("Cannot read wallet file.")
|
||||
|
||||
self.wallet_config = d
|
||||
self.wallet_file_exists = True
|
||||
|
||||
|
||||
def set_interface(self, interface):
|
||||
pass
|
||||
|
||||
def set_gui(self, gui):
|
||||
pass
|
||||
|
||||
def save(self):
|
||||
self.save_wallet_config()
|
||||
|
||||
|
||||
def save_wallet_config(self):
|
||||
s = repr(self.wallet_config)
|
||||
f = open(self.path,"w")
|
||||
f.write( s )
|
||||
f.close()
|
||||
import stat
|
||||
os.chmod(self.path,stat.S_IREAD | stat.S_IWRITE)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user