From 837286a970833a163881c09358920108ddfb71c6 Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Sun, 14 Jul 2019 22:01:56 -0500 Subject: [PATCH] use proper data folders --- onionr/config.py | 6 ++--- onionr/core.py | 5 ++-- onionr/logger/readline.py | 2 +- onionr/logger/settings.py | 4 ++- onionr/netcontroller/netcontrol.py | 5 ++-- onionr/onionr.py | 13 ++++++---- onionr/onionrplugins.py | 14 +++++------ onionr/utils/identifyhome.py | 39 ++++++++++++++++++++++++++++++ 8 files changed, 63 insertions(+), 25 deletions(-) create mode 100644 onionr/utils/identifyhome.py diff --git a/onionr/config.py b/onionr/config.py index 47373f8b..98085828 100755 --- a/onionr/config.py +++ b/onionr/config.py @@ -19,11 +19,9 @@ ''' import os, json, logger - +from utils import identifyhome # set data dir -dataDir = os.environ.get('ONIONR_HOME', os.environ.get('DATA_DIR', 'data/')) -if not dataDir.endswith('/'): - dataDir += '/' +dataDir = identifyhome.identify_home() _configfile = os.path.abspath(dataDir + 'config.json') _config = {} diff --git a/onionr/core.py b/onionr/core.py index 195a8d04..b523c5ff 100755 --- a/onionr/core.py +++ b/onionr/core.py @@ -30,6 +30,7 @@ import dbcreator, onionrstorage, serializeddata, subprocesspow from etc import onionrvalues, powchoice from onionrutils import localcommand, stringvalidators, bytesconverter, epoch from onionrutils import blockmetadata +from utils import identifyhome import storagecounter class Core: @@ -38,9 +39,7 @@ class Core: Initialize Core Onionr library ''' # set data dir - self.dataDir = os.environ.get('ONIONR_HOME', os.environ.get('DATA_DIR', 'data/')) - if not self.dataDir.endswith('/'): - self.dataDir += '/' + self.dataDir = identifyhome.identify_home() try: self.usageFile = self.dataDir + 'disk-usage.txt' diff --git a/onionr/logger/readline.py b/onionr/logger/readline.py index 9929a30e..73ed4f60 100644 --- a/onionr/logger/readline.py +++ b/onionr/logger/readline.py @@ -29,7 +29,7 @@ def readline(message = ''): color = colors.fg.green + colors.bold output = colors.reset + str(color) + '... ' + colors.reset + str(message) + colors.reset - if not settings.get_settings() & USE_ANSI: + if not settings.get_settings() & settings.USE_ANSI: output = colors.filter(output) sys.stdout.write(output) diff --git a/onionr/logger/settings.py b/onionr/logger/settings.py index 62bad00b..98f11357 100644 --- a/onionr/logger/settings.py +++ b/onionr/logger/settings.py @@ -18,7 +18,9 @@ along with this program. If not, see . ''' import os -data_home = os.environ.get('DATA_DIR', os.environ.get('DATA_DIR', 'data')) +from utils import identifyhome + +data_home = os.environ.get('ONIONR_LOG_DIR', identifyhome.identify_home()) # Use the bitwise operators to merge these settings USE_ANSI = 0b100 if os.name == 'nt': diff --git a/onionr/netcontroller/netcontrol.py b/onionr/netcontroller/netcontrol.py index 28532ed5..e0b54804 100644 --- a/onionr/netcontroller/netcontrol.py +++ b/onionr/netcontroller/netcontrol.py @@ -20,6 +20,7 @@ import os, sys, base64, subprocess, signal import config, logger from . import getopenport +from utils import identifyhome config.reload() class NetController: ''' @@ -28,9 +29,7 @@ class NetController: def __init__(self, hsPort, apiServerIP='127.0.0.1'): # set data dir - self.dataDir = os.environ.get('ONIONR_HOME', os.environ.get('DATA_DIR', 'data/')) - if not self.dataDir.endswith('/'): - self.dataDir += '/' + self.dataDir = identifyhome.identify_home() self.torConfigLocation = self.dataDir + 'torrc' self.readyState = False diff --git a/onionr/onionr.py b/onionr/onionr.py index d67943cf..f9b361ab 100755 --- a/onionr/onionr.py +++ b/onionr/onionr.py @@ -43,11 +43,12 @@ from netcontroller import NetController from onionrblockapi import Block import onionrproofs, onionrexceptions, communicator, setupconfig import onionrcommands as commands # Many command definitions are here +from utils import identifyhome try: from urllib3.contrib.socks import SOCKSProxyManager except ImportError: - raise Exception("You need the PySocks module (for use with socks5 proxy to use Tor)") + raise ImportError("You need the PySocks module (for use with socks5 proxy to use Tor)") class Onionr: def __init__(self): @@ -67,7 +68,7 @@ class Onionr: pass # set data dir - self.dataDir = os.environ.get('ONIONR_HOME', os.environ.get('DATA_DIR', 'data/')) + self.dataDir = identifyhome.identify_home() if not self.dataDir.endswith('/'): self.dataDir += '/' @@ -97,7 +98,8 @@ class Onionr: if not os.path.exists(plugins.get_plugin_data_folder(name)): try: os.mkdir(plugins.get_plugin_data_folder(name)) - except: + except Exception as e: + logger.warn('Error enabling plugin: ' + str(e)) plugins.disable(name, onionr = self, stop_event = False) self.communicatorInst = None @@ -139,7 +141,8 @@ class Onionr: command = '' finally: self.execute(command) - + + os.chdir(self.userRunDir) return def exitSigterm(self, signum, frame): @@ -175,7 +178,7 @@ class Onionr: def get_hostname(self): try: - with open('./' + self.dataDir + 'hs/hostname', 'r') as hostname: + with open(self.dataDir + 'hs/hostname', 'r') as hostname: return hostname.read().strip() except FileNotFoundError: return "Not Generated" diff --git a/onionr/onionrplugins.py b/onionr/onionrplugins.py index 9698f5d1..a76fc92b 100755 --- a/onionr/onionrplugins.py +++ b/onionr/onionrplugins.py @@ -19,11 +19,9 @@ ''' import os, re, importlib import onionrevents as events, config, logger - +from utils import identifyhome # set data dir -dataDir = os.environ.get('ONIONR_HOME', os.environ.get('DATA_DIR', 'data/')) -if not dataDir.endswith('/'): - dataDir += '/' +dataDir = identifyhome.identify_home() _pluginsfolder = dataDir + 'plugins/' _instances = dict() @@ -75,15 +73,15 @@ def enable(name, onionr = None, start_event = True): return False else: enabled_plugins.append(name) - config.set('plugins.enabled', enabled_plugins, True) - + config.set('plugins.enabled', enabled_plugins, savefile=True) + if start_event is True: start(name) return True else: return False else: - logger.error('Failed to enable plugin \"%s\", disabling plugin.' % name) + logger.error('Failed to enable plugin \"%s\", disabling plugin.' % name, terminal=True) disable(name) return False @@ -245,7 +243,7 @@ def get_plugin_data_folder(name, absolute = True): Returns the location of a plugin's data folder ''' - return get_plugins_folder(name, absolute) + dataDir + return get_plugins_folder(name, absolute) def check(): ''' diff --git a/onionr/utils/identifyhome.py b/onionr/utils/identifyhome.py new file mode 100644 index 00000000..b62fdf22 --- /dev/null +++ b/onionr/utils/identifyhome.py @@ -0,0 +1,39 @@ +''' + Onionr - Private P2P Communication + + Identify a data directory for Onionr +''' +''' + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +''' +import os, platform + +def identify_home(): + + path = os.environ.get('ONIONR_HOME', None) + if path is None: + system = platform.system() + if system == 'Linux': + path = os.path.expanduser('~') + '/.local/share/onionr/' + elif system == 'Windows': + path = os.path.expanduser('~') + '\\AppData\\Local\\onionr\\' + elif system == 'Darwin': + path = os.path.expanduser('~' + '/Library/Application Support/onionr/') + else: + path = 'data/' + else: + path = os.path.abspath(path) + if not path.endswith('/'): + path += '/' + return path \ No newline at end of file