From c71f81e852f0de76214d465f4acadc38efb98990 Mon Sep 17 00:00:00 2001 From: ValentinBELYN <35041719+ValentinBELYN@users.noreply.github.com> Date: Thu, 1 Feb 2018 20:20:19 +0100 Subject: [PATCH] Small improvements --- CHANGELOG.md | 6 +++ setup/setup.bundle | Bin 6787 -> 6715 bytes setup/setup.py | 8 +-- src/onion.conf | 2 +- src/onion.py | 131 ++++++++++++++++++++------------------------- 5 files changed, 68 insertions(+), 79 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c26c9be..d9aafbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v1.0.1 +> *Released on 2018-02-01* + +- Small improvements. +- Bug fixes when running scenarios. + ## v1.0.0 > *Released on 2018-01-07* diff --git a/setup/setup.bundle b/setup/setup.bundle index a63c46209276187bf537d455cd1ec9632ace9b3f..2736a92756ac2e48615a93f22f9f19353f9a08d5 100644 GIT binary patch literal 6715 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. | # +-----------------------------------------------------------------+ -# GitHub Edition # +-----------------------------------------------------------------+ # | IMPORTS | # +-----------------------------------------------------------------+ from threading import Thread -from subprocess import call, DEVNULL, STDOUT +from subprocess import run, DEVNULL, STDOUT from signal import signal, SIGINT, SIGTERM from time import sleep from datetime import datetime @@ -67,9 +68,9 @@ __license__ = 'GNU General Public License v3.0' # Version -__version__ = '1.0' -__build__ = '20' -__date__ = '2018-01-07' +__version__ = '1.0.1' +__build__ = '22' +__date__ = '2018-02-01' # +-----------------------------------------------------------------+ @@ -188,9 +189,9 @@ def run(self): while onion_signal: # Sending an ICMP request to the remote host and retrieving # the return code - code = call(['ping', '-c', '1', '-W', '1', '-I', + code = run(['ping', '-c', '1', '-W', '1', '-I', sender_interface, self.address], - stdout=DEVNULL, stderr=STDOUT) + stdout=DEVNULL, stderr=STDOUT).returncode # Determine whether a host is alive or not # if counter = 0 -> dead @@ -210,13 +211,13 @@ def run(self): if counter > 0: sleep(1) - def get_status(self): + def is_alive(self): '''Return if the host is alive. Examples: - >>> host.get_status() + >>> host.is_alive() True -> alive - >>> host.get_status() + >>> host.is_alive() False -> dead ''' return self.status @@ -224,7 +225,7 @@ def get_status(self): class OnionParser(): '''Retrieves values from a configuration file. - + Important: You must import the 'configparser' module before. ''' @@ -287,8 +288,8 @@ def __init__(self, filename, template): self.config[section][option] = value - # If the option does not exist and is optional, - # add a special value + # If the option is not specified but is optional, + # adding a special value elif not self.template[section][option]['required']: self.config[section][option] = 'NOT_SPECIFIED' else: @@ -318,21 +319,6 @@ def add_error(self, section, option): # +-----------------------------------------------------------------+ # | FUNCTIONS | # +-----------------------------------------------------------------+ -def capitalize(string): - '''Capitalize a string. - - Examples: - >>> 'deadTime option'.capitalize() - 'Deadtime option' - >>> 'deadTime option'.title() - 'Deadtime Option' - >>> capitalize('deadTime option') - 'DeadTime option' - ''' - - return string[0].upper() + string[1:] - - def loader(message, delay): '''Display a loading bar. @@ -345,7 +331,7 @@ def loader(message, delay): bars = ('|', '/', '-', '\\') for i in range(0, delay): - print('{} {}'.format(bars[i % 4], message), end='\r', flush=True) + print('{} {}'.format(bars[i % 4], message), end='\r', flush=True) sleep(0.05) @@ -361,9 +347,9 @@ def log(level, message): levels = ( 'INFORMATION', 'WARNING', - 'DANGER' + 'CRITICAL' ) - + colors = ( '0', # Default '1;33', # Yellow @@ -451,12 +437,15 @@ def set_scenario(scenario): >>> set_scenario('passive') ''' - log(1, 'The Onion server {} is {}.'.format(server_address, scenario)) + log(1, 'The Onion server {} is {}'.format(server_address, scenario)) - if scenario == 'active': - call(scenario_active) - else: - call(scenario_passive) + try: + if scenario == 'active': + run(scenario_active) + else: + run(scenario_passive) + except: + log(2, 'An error occurred while running the {} scenario'.format(scenario)) # +-----------------------------------------------------------------+ @@ -488,14 +477,14 @@ def onion_check(): # Displaying the configuration for section in config: - print(' Checking the {} section...'.format(capitalize(section))) + print(' Checking the {} section...'.format(section.capitalize())) for option in config[section]: if config[section][option] == 'NOT_FOUND': status = '[ \033[1;33mERROR\033[0m ]' else: status = '[ OK ]' - print(' ' * 9 + capitalize(option + ' option').ljust(40) + status) + print(' ' * 10 + (option + ' option').ljust(40) + status) print() @@ -536,18 +525,18 @@ def onion_about(): about_author = __author__.ljust(32) about_license = __license__.ljust(32) - print('\n o+ +-------------------------------------------+', - ' /d/ | Onion HA Engine |', - ' .h dds. +-------------------------------------------+', - ' /h+ ddhdo. | Version: {} |'.format(about_version), - ' :yh/ -ddh/ ds. | Release: {} |'.format(about_date), - ' -yds` `hdddy dd+ | Author: {} |'.format(about_author), - ' /ddy yddddd+ dd+ | License: {} |'.format(about_license), - ' hdd+ -ddddddy ddh +-------------------------------------------+', - ' hddy :ddddddy ddy', - ' -hdds` hddddd hdh. Configuration: {}'.format(CONFIG_FILE), - ' `ohdh+. dddh+odh+` Mode: {}'.format(about_onion_mode), - ' `-+syyhddys+:` Address: {}\n'.format(about_server_address), + print('\n o+ +-------------------------------------------+', + ' /d/ | Onion HA Engine |', + ' .h dds. +-------------------------------------------+', + ' /h+ ddhdo. | Version: {} |'.format(about_version), + ' :yh/ -ddh/ ds. | Release: {} |'.format(about_date), + ' -yds` `hdddy dd+ | Author: {} |'.format(about_author), + ' /ddy yddddd+ dd+ | License: {} |'.format(about_license), + ' hdd+ -ddddddy ddh +-------------------------------------------+', + ' hddy :ddddddy ddy', + ' -hdds` hddddd hdh. Configuration: {}'.format(CONFIG_FILE), + ' `ohdh+. dddh+odh+` Mode: {}'.format(about_onion_mode), + ' `-+syyhddys+:` Address: {}\n'.format(about_server_address), sep='\n') @@ -556,11 +545,11 @@ def onion_help(): print('Usage: oniond [command]\n', 'Commands:', - ' - start Starts the Onion node with the current configuration.', - ' - check Checks the Onion node configuration.', - ' - version Outputs the version of the Onion node.', - ' - about Displays all information about the daemon.', - ' - help Displays this help message.\n', + ' start start Onion with the current configuration', + ' check check the Onion node configuration', + ' version output the version of the Onion node', + ' about display all information about the daemon', + ' help display this help message\n', '\'start\' is the default command.', sep='\n') @@ -582,7 +571,7 @@ def onion_help(): onion_help() exit(0) else: - print('oniond {start|check|version|about|help}') + print('Unknown command: {}'.format(options[1])) exit(1) # Root privileges are required to continue @@ -621,11 +610,8 @@ def onion_help(): # Writing the daemon PID in a file current_pid = getpid() -try: - with open(PID_FILE, 'w') as file: - file.write(str(current_pid)) -except IOError: - pass +with open(PID_FILE, 'w') as file: + file.write(str(current_pid)) # Logging the start of Onion log(0, 'Onion is starting...') @@ -642,7 +628,7 @@ def onion_help(): server.start() gateway.start() -log(0, 'Onion is started in {} mode.'.format(server_mode)) +log(0, 'Onion is started in {} mode'.format(server_mode)) # Loop of analysis and learning latest_scenario = 0 @@ -651,8 +637,8 @@ def onion_help(): gateway_warning = 0 while onion_signal: - server_status = server.get_status() - gateway_status = gateway.get_status() + server_status = server.is_alive() + gateway_status = gateway.is_alive() # Logging equipment status if server_status != latest_server_status: @@ -663,7 +649,7 @@ def onion_help(): else: status_name = 'DOWN' - log(0, 'The remote server {} is {}.'.format(remote_address, status_name)) + log(0, 'The remote server {} is {}'.format(remote_address, status_name)) if gateway_status != latest_gateway_status: latest_gateway_status = gateway_status @@ -673,7 +659,7 @@ def onion_help(): else: status_name = 'DOWN' - log(0, 'The gateway {} is {}.'.format(remote_address, status_name)) + log(0, 'The gateway {} is {}'.format(remote_address, status_name)) # Scenarios # The Onion node is master @@ -717,7 +703,7 @@ def onion_help(): # The 'gateway_warning' variable avoids false positives if the # OnionRing threads are out of sync if gateway_warning > 2: - log(2, 'Onion is suspended and waits for the gateway reply.') + log(2, 'Onion is suspended and waits for the gateway reply') sleep(2.5) else: gateway_warning = 0 @@ -737,10 +723,7 @@ def onion_help(): sleep(1) # Deleting the Onion PID file -try: - path_pid_file.unlink() -except IOError: - pass +path_pid_file.unlink() -log(0, 'Onion shutdown completed.') +log(0, 'Onion shutdown completed') exit(0)