Add more networking options

This commit is contained in:
dave 2017-04-26 23:07:47 -07:00
parent a73bc9ca00
commit f11f339b42
4 changed files with 54 additions and 27 deletions

View File

@ -38,7 +38,9 @@ Instance Configuration
["dickson.freenode.net", 6667], ["dickson.freenode.net", 6667],
["morgan.freenode.net", 6667] ["morgan.freenode.net", 6667]
], ],
"ipv6":"off" "force_ipv6": false,
"force_ipv4": false,
"bind": ["1.2.3.4", 5678]
}, },
"modules":[ "modules":[
"PingResponder", "PingResponder",
@ -78,9 +80,22 @@ options:
the bot must reconnect to the IRC server later, the next server will the bot must reconnect to the IRC server later, the next server will
be used. be used.
.. cmdoption:: connection.ipv6 .. cmdoption:: connection.force_ipv6
Enable or disable defaulting to IPv6 using the value "off" or "on" Enable this option to force use of ipv6 connections and ignore ipv4 server addresses.
.. cmdoption:: connection.force_ipv4
Enable this option to force use of ipv4 connections and ignore ipv6 server addresses. Enabling force_ipv6
overrides force_ipv4.
.. cmdoption:: connection.bind
Set the local address and port to bind the connection to.
.. note::
To bind to an address but no specific port, set the second tuple entry to `null`.
.. cmdoption:: modules .. cmdoption:: modules

View File

@ -1,23 +1,23 @@
{ {
"bot":{ "bot":{
"datadir":"./data/", "datadir":"./data/",
"rpcbind":"0.0.0.0", "rpcbind":"0.0.0.0",
"rpcport":1876, "rpcport":1876,
"usermodules": [ "./data/modules/" ] "usermodules": [ "./data/modules/" ]
}, },
"connection":{ "connection":{
"servers": [ "servers": [
["weber.freenode.net", 6667], ["weber.freenode.net", 6667],
["asimov.freenode.net", 6667], ["asimov.freenode.net", 6667],
["card.freenode.net", 6667], ["card.freenode.net", 6667],
["dickson.freenode.net", 6667], ["dickson.freenode.net", 6667],
["morgan.freenode.net", 6667] ["morgan.freenode.net", 6667]
], ],
"ipv6":"off", "force_ipv6": false
}, },
"modules":[ "modules":[
"PingResponder", "PingResponder",
"Services", "Services",
"UserModule" "UserModule"
] ]
} }

View File

@ -43,8 +43,12 @@ class IRCCore(object):
"""List of server address""" """List of server address"""
self.port = 0 self.port = 0
"""Server port""" """Server port"""
self.ipv6 = False self.connection_family = socket.AF_UNSPEC
"""Use IPv6?""" """Socket family. 0 will auto-detect ipv4 or v6. Change this to socket.AF_INET or socket.AF_INET6 force use of
ipv4 or ipv6."""
self.bind_addr = None
"""Optionally bind to a specific address. This should be a (host, port) tuple."""
# Set up hooks for modules # Set up hooks for modules
self.initHooks() self.initHooks()
@ -56,7 +60,9 @@ class IRCCore(object):
self.reader, self.writer = await asyncio.open_connection(self.servers[self.server][0], self.reader, self.writer = await asyncio.open_connection(self.servers[self.server][0],
port=self.servers[self.server][1], port=self.servers[self.server][1],
loop=loop, loop=loop,
ssl=None) ssl=None,
family=self.connection_family,
local_addr=self.bind_addr)
self.fire_hook("_CONNECT") self.fire_hook("_CONNECT")
except (socket.gaierror, ConnectionRefusedError): except (socket.gaierror, ConnectionRefusedError):
traceback.print_exc() traceback.print_exc()

View File

@ -11,6 +11,7 @@ import sys
from pyircbot.rpc import BotRPC from pyircbot.rpc import BotRPC
from pyircbot.irccore import IRCCore from pyircbot.irccore import IRCCore
from collections import namedtuple from collections import namedtuple
from socket import AF_INET, AF_INET6
import os.path import os.path
import asyncio import asyncio
@ -42,6 +43,11 @@ class PyIRCBot(object):
"""IRC protocol handler""" """IRC protocol handler"""
self.irc = IRCCore(servers=self.botconfig["connection"]["servers"]) self.irc = IRCCore(servers=self.botconfig["connection"]["servers"])
if self.botconfig.get("connection").get("force_ipv6", False):
self.irc.connection_family = AF_INET6
elif self.botconfig.get("connection").get("force_ipv4", False):
self.irc.connection_family = AF_INET
self.irc.bind_addr = self.botconfig.get("connection").get("bind", None)
# legacy support # legacy support
self.act_PONG = self.irc.act_PONG self.act_PONG = self.irc.act_PONG