forked from Tribler/tribler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tribler_plugin.py
148 lines (120 loc) · 5.37 KB
/
tribler_plugin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
"""
This twistd plugin enables to start Tribler headless using the twistd command.
"""
from datetime import date
import os
import signal
import time
from twisted.application.service import MultiService, IServiceMaker
from twisted.conch import manhole_tap
from twisted.internet import reactor
from twisted.plugin import IPlugin
from twisted.python import usage
from twisted.python.log import msg
from zope.interface import implements
from Tribler.Core.Modules.process_checker import ProcessChecker
from Tribler.Core.Session import Session
from Tribler.Core.SessionConfig import SessionStartupConfig
# Register yappi profiler
from Tribler.community.allchannel.community import AllChannelCommunity
from Tribler.community.search.community import SearchCommunity
from Tribler.dispersy.utils import twistd_yappi
class Options(usage.Options):
optParameters = [
["manhole", "m", 0, "Enable manhole telnet service listening at the specified port", int],
["statedir", "s", None, "Use an alternate statedir", str],
["restapi", "p", 8085, "Use an alternate port for the REST API", int],
["dispersy", "d", -1, "Use an alternate port for Dispersy", int],
["libtorrent", "l", -1, "Use an alternate port for libtorrent", int],
]
optFlags = [
["auto-join-channel", "a", "Automatically join a channel when discovered"],
["log-incoming-searches", "i", "Write information about incoming remote searches to a file"]
]
class TriblerServiceMaker(object):
implements(IServiceMaker, IPlugin)
tapname = "tribler"
description = "Tribler twistd plugin, starts Tribler as a service"
options = Options
def __init__(self):
"""
Initialize the variables of the TriblerServiceMaker and the logger.
"""
self.session = None
self._stopping = False
self.process_checker = None
def log_incoming_remote_search(self, sock_addr, keywords):
d = date.today()
with open(os.path.join(self.session.get_state_dir(), 'incoming-searches-%s' % d.isoformat()), 'a') as log_file:
log_file.write("%s %s %s %s" % (time.time(), sock_addr[0], sock_addr[1], ";".join(keywords)))
def shutdown_process(self, shutdown_message, code=1):
msg(shutdown_message)
reactor.addSystemEventTrigger('after', 'shutdown', os._exit, code)
reactor.stop()
def start_tribler(self, options):
"""
Main method to startup Tribler.
"""
def signal_handler(sig, _):
msg("Received shut down signal %s" % sig)
if not self._stopping:
self._stopping = True
self.session.shutdown()
msg("Tribler shut down")
reactor.stop()
self.process_checker.remove_lock_file()
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
config = SessionStartupConfig()
config.set_http_api_enabled(True)
# Check if we are already running a Tribler instance
self.process_checker = ProcessChecker()
if self.process_checker.already_running:
self.shutdown_process("Another Tribler instance is already using statedir %s" % config.get_state_dir())
return
msg("Starting Tribler")
if options["statedir"]:
config.set_state_dir(options["statedir"])
if options["restapi"] > 0:
config.set_http_api_enabled(True)
config.set_http_api_port(options["restapi"])
if options["dispersy"] != -1 and options["dispersy"] > 0:
config.set_dispersy_port(options["dispersy"])
if options["libtorrent"] != -1 and options["libtorrent"] > 0:
config.set_listen_port(options["libtorrent"])
self.session = Session(config)
upgrader = self.session.prestart()
if upgrader.failed:
self.shutdown_process("The upgrader failed: .Tribler directory backed up, aborting")
else:
self.session.start()
msg("Tribler started")
if options["auto-join-channel"]:
msg("Enabling auto-joining of channels")
for community in self.session.get_dispersy_instance().get_communities():
if isinstance(community, AllChannelCommunity):
community.auto_join_channel = True
if options["log-incoming-searches"]:
msg("Logging incoming remote searches")
for community in self.session.get_dispersy_instance().get_communities():
if isinstance(community, SearchCommunity):
community.log_incoming_searches = self.log_incoming_remote_search
def makeService(self, options):
"""
Construct a Tribler service.
"""
tribler_service = MultiService()
tribler_service.setName("Tribler")
manhole_namespace = {}
if options["manhole"] > 0:
port = options["manhole"]
manhole = manhole_tap.makeService({
'namespace': manhole_namespace,
'telnetPort': 'tcp:%d:interface=127.0.0.1' % port,
'sshPort': None,
'passwd': os.path.join(os.path.dirname(__file__), 'passwd'),
})
tribler_service.addService(manhole)
reactor.callWhenRunning(self.start_tribler, options)
return tribler_service
service_maker = TriblerServiceMaker()