MiNode/minode/i2p/dialer.py

51 lines
1.6 KiB
Python
Raw Normal View History

2017-06-09 20:41:33 +02:00
# -*- coding: utf-8 -*-
import logging
import socket
from .util import I2PThread
2017-06-09 20:41:33 +02:00
class I2PDialer(I2PThread):
2021-03-09 15:40:59 +01:00
def __init__(
self, state, destination, nick=None, *, sam_host=None, sam_port=None
2021-03-09 15:40:59 +01:00
):
2023-07-30 00:05:08 +02:00
# Initially 127.0.0.1:7656
self.sam_host = sam_host or state.i2p_sam_host
self.sam_port = sam_port or state.i2p_sam_port
2017-06-09 20:41:33 +02:00
self.destination = destination
self.nick = nick or state.i2p_session_nick
2017-06-09 20:41:33 +02:00
2023-07-30 00:05:08 +02:00
super().__init__(state, name='I2P Dial to {}'.format(self.destination))
self.s = socket.create_connection((self.sam_host, self.sam_port))
2017-06-09 20:41:33 +02:00
self.version_reply = []
self.success = True
2017-06-09 20:41:33 +02:00
def run(self):
2021-03-08 16:06:07 +01:00
logging.debug('Connecting to %s', self.destination)
2017-06-09 20:41:33 +02:00
self._connect()
2021-03-09 15:40:59 +01:00
if not self.state.shutting_down and self.success:
c = self.state.connection(
self.destination, 'i2p', self.s, 'i2p',
False, self.destination)
c.start()
2021-03-09 15:40:59 +01:00
self.state.connections.add(c)
2017-06-09 20:41:33 +02:00
def _connect(self):
self._send(b'HELLO VERSION MIN=3.0 MAX=3.3\n')
self.version_reply = self._receive_line().split()
if b'RESULT=OK' not in self.version_reply:
logging.debug('Error while connecting to %s', self.destination)
self.success = False
2017-06-09 20:41:33 +02:00
2021-03-08 16:06:07 +01:00
self._send(
b'STREAM CONNECT ID=' + self.nick + b' DESTINATION='
+ self.destination + b'\n')
2017-06-09 20:41:33 +02:00
reply = self._receive_line().split(b' ')
if b'RESULT=OK' not in reply:
logging.debug('Error while connecting to %s', self.destination)
self.success = False