diff --git a/actions/tor b/actions/tor index 72c39ebbb..cb234a8bd 100755 --- a/actions/tor +++ b/actions/tor @@ -42,9 +42,15 @@ def parse_arguments(): # Stop Tor and disable service subparsers.add_parser('stop', help='Stop Tor service') - # Get currently configured Tor hidden service + # Get currently configured Tor hidden service information subparsers.add_parser('get-hs', help='Get hidden service') + # Enable Tor hidden service + subparsers.add_parser('enable-hs', help='Enable hidden service') + + # Disable Tor hidden service + subparsers.add_parser('disable-hs', help='Disable hidden service') + return parser.parse_args() @@ -78,23 +84,58 @@ def subcommand_stop(_): def subcommand_get_hs(_): - """Get currently configured Tor hidden service""" - hs_dir = "" - hs_ports = [] + """Print currently configured Tor hidden service information""" + print get_hidden_service() + + +def subcommand_enable_hs(_): + """Enable Tor hidden service""" + + if get_hidden_service() != "": + return with open(TOR_CONFIG, 'r') as file: lines = file.readlines() + + lines.append("# Hidden Service configured by Plinth\n") + lines.append("HiddenServiceDir /var/lib/tor/hidden_service/\n") + lines.append("HiddenServicePort 80 127.0.0.1:80\n") + lines.append("HiddenServicePort 443 127.0.0.1:443\n") + + with open(TOR_CONFIG, 'w') as file: + file.writelines(lines) + + subprocess.call(['service', 'tor', 'restart']) + + +def subcommand_disable_hs(_): + """Disable Tor hidden service""" + + if not get_hidden_service(): + return + + with open(TOR_CONFIG, 'r') as file: + lines = file.readlines() + + filtered_lines = [] + removing = False for line in lines: - if line.startswith('HiddenServiceDir'): - hs_dir = line.split()[1] - elif line.startswith('HiddenServicePort'): - hs_ports.append(line.split()[1]) + if removing: + if not line.startswith("HiddenService"): + # end of Plinth hidden service block -- stop removing lines + removing = False + filtered_lines.append(line) + else: + if line.startswith("# Hidden Service configured by Plinth"): + # start of Plinth hidden service block -- remove following HiddenService lines + removing = True + else: + filtered_lines.append(line) - if hs_dir != "": - with open(hs_dir + 'hostname', 'r') as file: - hs_hostname = file.read().strip() + with open(TOR_CONFIG, 'w') as file: + file.writelines(filtered_lines) - print hs_hostname + ' ' + ','.join(hs_ports) + subprocess.call(['service', 'tor', 'restart']) def set_tor_service(enable): @@ -111,6 +152,28 @@ def set_tor_service(enable): file.writelines(lines) +def get_hidden_service(): + """Returns a string with configured Tor hidden service information""" + hs_dir = "" + hs_ports = [] + + with open(TOR_CONFIG, 'r') as file: + lines = file.readlines() + for line in lines: + if line.startswith('HiddenServiceDir'): + hs_dir = line.split()[1] + elif line.startswith('HiddenServicePort'): + hs_ports.append(line.split()[1]) + + if hs_dir == "": + return "" + + with open(hs_dir + 'hostname', 'r') as file: + hs_hostname = file.read().strip() + + return hs_hostname + ' ' + ','.join(hs_ports) + + def main(): """Parse arguments and perform all duties""" arguments = parse_arguments()