mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-02-04 08:13:38 +00:00
tor: Reimplement getting ports in Python
This commit is contained in:
parent
36adc84b5d
commit
3d5f68381d
51
actions/tor
51
actions/tor
@ -22,11 +22,16 @@ Configuration helper for the Tor service
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import codecs
|
||||
import os
|
||||
import re
|
||||
import socket
|
||||
|
||||
from plinth import action_utils
|
||||
|
||||
TOR_CONFIG = '/etc/tor/torrc'
|
||||
TOR_STATE_FILE = '/var/lib/tor/state'
|
||||
TOR_AUTH_COOKIE = '/var/run/tor/control.authcookie'
|
||||
|
||||
|
||||
def parse_arguments():
|
||||
@ -34,20 +39,12 @@ def parse_arguments():
|
||||
parser = argparse.ArgumentParser()
|
||||
subparsers = parser.add_subparsers(dest='subcommand', help='Sub command')
|
||||
|
||||
# Enable and start the service
|
||||
subparsers.add_parser('enable', help='Enable and start Tor service')
|
||||
|
||||
# Disable and stop the service
|
||||
subparsers.add_parser('disable', help='Disable and stop Tor 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')
|
||||
subparsers.add_parser('get-ports', help='Get list of Tor ports')
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
@ -146,6 +143,42 @@ def get_hidden_service():
|
||||
return hs_hostname + ' ' + ','.join(hs_ports)
|
||||
|
||||
|
||||
def subcommand_get_ports(_):
|
||||
"""Return a list of running Tor ports."""
|
||||
try:
|
||||
print('orport', _get_orport())
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
with open(TOR_STATE_FILE, 'r') as state_file:
|
||||
for line in state_file:
|
||||
matches = re.match(r'^\s*TransportProxy\s+(\S*)\s+\S+:(\d+)\s*$',
|
||||
line)
|
||||
if matches:
|
||||
print('{0} {1}'.format(matches.group(1), matches.group(2)))
|
||||
|
||||
|
||||
def _get_orport():
|
||||
"""Return the ORPort by querying running instance."""
|
||||
cookie = open(TOR_AUTH_COOKIE, 'rb').read()
|
||||
cookie = codecs.encode(cookie, 'hex').decode()
|
||||
|
||||
commands = '''AUTHENTICATE {cookie}
|
||||
GETINFO net/listeners/or
|
||||
QUIT
|
||||
'''.format(cookie=cookie)
|
||||
|
||||
tor_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
tor_socket.connect(('localhost', 9051))
|
||||
tor_socket.send(commands.encode())
|
||||
response = tor_socket.recv(1024)
|
||||
tor_socket.close()
|
||||
|
||||
line = response.split(b'\r\n')[1].decode()
|
||||
matches = re.match(r'.*="[^:]+:(\d+)"', line)
|
||||
return matches.group(1)
|
||||
|
||||
|
||||
def main():
|
||||
"""Parse arguments and perform all duties"""
|
||||
arguments = parse_arguments()
|
||||
|
||||
@ -1,28 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# This file is part of Plinth.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# Action to get ports used by Tor.
|
||||
|
||||
echo "ORPort" `tor-get-orport`
|
||||
|
||||
transports="obfs3 scramblesuit"
|
||||
for transport in $transports
|
||||
do
|
||||
echo $transport `grep $transport /var/lib/tor/state | awk -F'[: ]*' '{print $4}'`
|
||||
done
|
||||
@ -73,7 +73,7 @@ def index(request):
|
||||
|
||||
def get_status():
|
||||
"""Return the current status"""
|
||||
output = actions.superuser_run('tor-get-ports')
|
||||
output = actions.superuser_run('tor', ['get-ports'])
|
||||
port_info = output.split('\n')
|
||||
ports = {}
|
||||
for line in port_info:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user