# This is a sample configuration file for PyLink. You'll likely want to rename it to pylink.yml # and begin your configuration there. # Note: lines starting with a "#" are comments and will be ignored. # Note 2: Use SPACES, NOT tabs to indent, or you will get parser errors on start! # Defines general settings for the PyLink server. Prior to PyLink 1.2, this configuration block # was named "bot:". pylink: # Sets nick, user/ident, and real name. nick: PyLink ident: pylink realname: PyLink Service Client # Server description (shown in /links, /whois, etc.) serverdesc: PyLink Server # Sets the fantasy command prefix for the main PyLink bot. To configure fantasy prefixes for # other service bots, add or modify the "prefix:" option in the configuration section of each # plugin. # Note: prior to PyLink 1.2, defining a prefix here made it global for all service bots. This # was removed because it called all bots in a channel at once (even if they have conflicting # commands), which usually led to one successful reply and a string of "Command not found" # errors. prefix: "&" # Whether service bots will respond to commands prefixes with their nick. respondtonick: true # Custom prefixes for other service bots if they are loaded. Note: this is deprecated # since PyLink 1.2 in favour of adding prefixes into each plugin's configuration block # itself (see the "prefix:" option in the "games:" block in this case). #prefixes: # games: "@" # Determines whether hideoper modes should be respected in WHOIS replies. # Defaults to true if not specified. whois_use_hideoper: true # Determines whether extended WHOIS replies should be sent to users with # +B set (marked as a bot). For better security, it is recommended to leave this off. whois_show_extensions_to_bots: false # Determines whether PyLink service clients should protect themselves from # kicks, kills, etc. using IRCd-side servprotect modes. For this to work # properly, this usually requires that PyLink be U-Lined. This defaults to # False. protect_services: false # Determines how long plugins should wait (in seconds) before flushing their # databases to disk. Defaults to 300 seconds. Changes here require a reload # of all database-enabled plugins to take effect. save_delay: 300 # Determines whether services should default to sending command responses as private notices, # even if the command was called in a channel. This defaults to False. #prefer_private_replies: false # Determines whether spawning additional services for bots (e.g. Automode, Games) should be # enabled. This defaults to True, unless a network's protocol module doesn't support spawning # extra service bots. #spawn_services: true # Defines extra directories to look up plugins and protocol modules in. # Environment variables (e.g. $HOME) and home folders (~) are expanded here, in that order. #plugin_dirs: ["~/my-plugins", "~/pylink-contrib-modules/plugins"] #protocol_dirs: ["~/pylink-contrib-modules/protocols"] login: # NOTE: for users migrating from PyLink < 1.1, the old login:user/login:password settings # have been deprecated. We strongly recommend migrating to the new "accounts:" block below, as # it supports multiple accounts, hashed passwords, and allows more flexibility (accounts no # longer imply admin access). # IMPORTANT: If you're switching from login:user/login:password, you MUST ADD YOURSELF to a # "permissions:" block like the one below, or you will lose IRC administration access to your # PyLink daemon! accounts: # Creates an account with username "user1". You can define other usernames at the # same level here (key name is user name). user1: # Defines the password for the user. You can encrypt passwords using the # 'mkpasswd' command or the 'pylink-mkpasswd' utility included with PyLink. password: "$6$rounds=81447$WlVlZYCgbnjPmVqy$28Tu/Zl0xNpePqimax2wABKn5GCoWomYEI1Pu5jqYyQNULazR4BxQmscZ0MgBHqBCCke.3u5eOtBSZwL3WwVf0" # Determines whether the password given is in plain-text. Defaults to false # (plain text) for backwards compatibility. encrypted: true permissions: # Permissions are described in more detail in example-permissions.yml, if you want to # customize permissions further. # Replace ABC123 with your PyLink account name (configured above) # in order to give yourself admin access. "$pylinkacc:ABC123": - "*" servers: # Please note: these are only EXAMPLE link blocks. You should edit them and # remove ones that you don't need in your config. # Short name for the network. This is used for relay's nick suffixes, the # network plugin's (dis)connect commands, and various other places internally. # CHANGE THIS to some abbreviation representing your network; usually # something 3-5 characters should be good. inspnet: # Server IP, port, and passwords. The ip: field also supports resolving # hostnames. ip: 127.0.0.1 port: 7000 recvpass: "abcd" sendpass: "abcd" # Set the bind host, useful for multi-homed hosts. #bindhost: 1.2.3.4 # The full network name, used by plugins. netname: "InspIRCd Network" # Hostname we will use to connect to the remote server hostname: "pylink.yournet.local" # SID - required for TS6 and TS6-like servers. This must be three characters: # the first char must be a digit [0-9], and the remaining two chars may # be either uppercase letters [A-Z] or digits. sid: "0PY" # SID range - the range of SIDs PyLink is allowed to use to generate # server IDs. On TS6, this should be a combination of digits, letters, # and #'s. Each # denotes a range (0-9A-Z) of characters that can be # used by PyLink to generate appropriate SIDs. You will want to make # sure no other servers are using this range. # There must be at least one # in this entry. sidrange: "8##" # Autojoin channels. The "channels" option affects all service bots, but you can also # configure channels per service using keys in the name of "_channels" # Comment out or remove these keys if you don't want service bots# to join any channels by # default. channels: ["#pylink"] pylink_channels: ["#services"] automode_channels: ["#chat"] # Sets the protocol module to use for this network - see the README for a # list of supported IRCds. protocol: "inspircd" # Sets autoconnect delay - comment this out or set the value below 1 to # disable autoconnect entirely. autoconnect: 5 # Optional autoconnect settings: # Defines whether we should multiply the autoconnect delay by a certain value every time # a connection fails. This defaults to 2 if not set (30 secs becomes 60 secs, 120 secs, etc.) #autoconnect_multiplier: 2 # Defines what the maximum autoconnect time will be (defaults to 1800 secs). #autoconnect_max: 1800 # Sets the ping frequency in seconds (i.e. how long we should wait between # sending pings to our uplink). When more than two consecutive pings are missed, # PyLink will disconnect with a ping timeout. This defaults to 90 if not set. pingfreq: 90 # If enabled, this opts this network out of relay IP sharing: this network # will not have its users' IPs sent across the relay, and it will not see any # IPs of other networks' users. #relay_no_ips: true # Sets the max nick length for the network. It is important that this is # set correctly, or PyLink might introduce a nick that is too long and # cause netsplits! This defaults to 30 if not set. maxnicklen: 30 # Toggles SSL for this network. Defaults to False if not specified. #ssl: true # Optional SSL cert/key to pass to the uplink server. #ssl_certfile: pylink-cert.pem #ssl_keyfile: pylink-key.pem # Optionally, you can set this option to verify the SSL certificate # fingerprint of your uplink. #ssl_fingerprint: "e0fee1adf795c84eec4735f039503eb18d9c35cc" # This sets the hash type for the fingerprint (md5, sha1, sha256, etc.) # Valid values include md5 and sha1-sha512, though others may be # supported depending on your system: see # https://docs.python.org/3/library/hashlib.html # This setting defaults to sha256. #ssl_fingerprint_type: sha256 ts6net: ip: ::1 # Determines whether IPv6 should be used for this connection. Should the ip: # above be a hostname instead of an IP, this will also affect whether A records # (no IPv6) or AAAA records (IPv6) will be used in resolving it. ipv6: yes port: 7000 recvpass: "abcd" sendpass: "abcd" hostname: "pylink.example.com" sid: "8PY" netname: "some TS6 network" sidrange: "8P#" protocol: "ts6" autoconnect: 5 # Note: /'s in nicks are automatically converted to |'s for TS6 # networks (charybdis, etc.), since they don't allow "/" in nicks. separator: "|" # The following options are specific to TS6 servers: # Toggles owner (+y), admin (+a), and halfop (+h) support for # shadowircd/elemental-ircd. # This defaults to off for the best compatibility. use_owner: false use_admin: false use_halfop: false # Toggles support of shadowircd/elemental-ircd specific channel modes: # +T (no notice), +u (hidden ban list), +E (no kicks), +J (blocks kickrejoin), # +K (no repeat messages), +d (no nick changes), and user modes: # +B (bot), +C (blocks CTCP), +D (deaf), +V (no invites), +I (hides WHOIS channel list) use_elemental_modes: false unrealnet: ip: 1.2.3.4 port: 8067 # Received and sent passwords. For passwordless links using SSL fingerprints, simply set # these two fields to "*" and enable SSL with a cert and key file. recvpass: "coffee" sendpass: "tea" #ssl: true #ssl_certfile: mycert.pem #ssl_keyfile: mycert.pem hostname: "pylink.example.com" sid: "2PY" netname: "This should match your UnrealIRCd config" sidrange: "8##" channels: [] protocol: "unreal" autoconnect: 5 # You can also define network-specific nicks and idents for various service # bots, using the configuration options "servicename_nick" and "servicename_ident". #pylink_nick: MagicServ #pylink_ident: magicserv #games_nick: MagicGames #games_ident: magicgames nefarious: ip: somenet.ddns.local #ipv6: false port: 45454 recvpass: "recv" sendpass: "send" hostname: "pylink.midnight.vpn" # For P10, the SID and SID range options are just numbers. Make sure nothing # else is using the range you're reserving for PyLink. sid: 50 sidrange: "100-150" channels: ["#lounge"] protocol: p10 autoconnect: 5 netname: "Nefarious test server" ### The following options are specific to P10 servers: # Determines whether extended accounts should be used for this network. # For Nefarious, this **MUST** match the EXTENDED_ACCOUNTS setting in your IRCd configuration. # Disable this if you are using X3, and leave it on for any other service package # (atheme, etc.) # For other P10 IRCds, this should be set to FALSE. use_extended_accounts: true # Sets the IRCd type. The following options are supported here: 'nefarious', 'snircd', 'ircu', and # 'generic'. This defaults to 'nefarious'. # With this key set to 'nefarious', FAKE (external vHost changing) and SETHOST (host changing # for PyLink / relay clients) are enabled, along with a set of modes tailored to Nefarious. # With this key set to 'snircd', SETHOST and a set of modes tailored to snircd are enabled. # vHost changing of other users (e.g. via the changehost plugin) is not supported. # With this key set to 'ircu', a set of modes tailored to IRCu is enabled. # vHost changing is not supported. # With this key set to 'generic', neither of these host changing features are enabled # and a baseline RFC1459 mode set is used. This configuration is not officially supported. #p10_ircd: nefarious # Determines whether account-based cloaks should be used (someone.users.yournet.org # format). This should match your IRCd configuration: # On Nefarious, ENABLE this if HOST_HIDING_STYLE is set to either 1 or 3. # On other P10 IRCds, ENABLE this if HOST_HIDING is set to TRUE. use_account_cloaks: false # The cloak suffix to be used for account-based cloaks. This **MUST** match your # IRCd configuration if use_account_cloaks is enabled. cloak_suffix: "users.yournet.org" ### The following options are specific to Nefarious servers and should be set to false if ### you're using another P10 IRCd (unless your variant supports them as well): # Halfop is optional in Nefarious. This should match your IRCd configuration. use_halfop: false # Determines whether account-based cloaks should be used for opers # (someone.opers.yournet.org format). If use_account_cloaks is disabled, # this will have no effect. This should match your IRCd configuration: use_oper_account_cloaks: false # The cloak suffix to be used for IRCop account-based cloaks. This **MUST** match your # IRCd configuration if use_oper_account_cloaks is enabled. oper_cloak_suffix: "staff.yournet.org" # Determines whether UnrealIRCd-style hashed-host cloaks will be used. # This should match your IRCd configuration: # ENABLE this if HOST_HIDING_STYLE is set to either 2 or 3. use_hashed_cloaks: false # Sample Clientbot configuration, if you want to connect PyLink as a bot to relay somewhere # (or do other bot things). magicnet: ip: 1.2.3.4 port: 6697 # Server password (optional). Some networks also forward this to NickServ, so you can # use it to log in on connect. #sendpass: "wastedbytes103" channels: ["#this-works-as-usual"] protocol: "clientbot" # Once again, you can override the nick and ident of service bots on specific networks using # the "servicename_nick" and "servicename_ident" options. pylink_nick: pybot #pylink_ident: pybot # SSL options. Certfile and keyfile are optional, but can be used for CertFP/SASL external # if supported. ssl: true #ssl_certfile: mycert.pem #ssl_keyfile: mycert.pem # SASL login: for mechanisms, only EXTERNAL (SSL cert) and PLAIN (username and password) # are supported so far. # SASL PLAIN requires the sasl_username and sasl_password options to be set, while # SASL EXTERNAL requires ssl, ssl_certfile, and ssl_keyfile to work. #sasl_mechanism: "PLAIN" #sasl_username: "mIRCsKripterz" #sasl_password: "DownLoaditn00b!!!" # If this option is enabled, the bot will attempt SASL authentication even after it's # connected, as services become available throughout netsplits and reconnects. # Note: This requires an IRC server capable of IRCv3.2 cap-notify and sasl: # InspIRCd 3.x and charybdis 4+ (and derivatives) are some compatible examples (as of 2016-12-19) #sasl_reauth: true # Autoconnect works like usual. autoconnect: 30 # Message throttling: when set to a non-zero value, only one message will be sent every X # seconds. If your bot is constantly running into Excess Flood errors, raising this to # something like 0.5 or 1.0 should help. Defaults to 0.01 if not set. throttle_time: 0.3 # Clientbot also supports auto perform, using raw IRC messages. #autoperform: # - "NOTICE somebody :hello, i've connected" # Determines whether oper statuses should be tracked on this Clientbot network. This # defaults to False for the best security, since oper status may allow more access to the # entire PyLink service than what's desired, even when PyLink is only connected as a bot. track_oper_statuses: false # Determines whether messages from unknown clients (servers, clients not sharing in a -n # channel, etc.) should be forwarded via the PyLink server. If this is disabled, these # messages will be silently dropped. This overrides the "accept_weird_senders" option in the # "relay:" configuration block, and defaults to True for consistency with older releases. #relay_weird_senders: false # Plugins to load (omit the .py extension) plugins: # Commands plugin: Provides simple commands for things like checking login # status, and showing info on users and channels. - commands # Networks plugin: Allows you to manage connections to networks while # PyLink is running. - networks # Ctcp plugin: handles basic CTCP replies (VERSION, etc). - ctcp # Oper commands plugin: Provides a subset of network management commands. # (KILL, JUPE, etc.) # Note: these commands will be made available to anyone who's opered on your # network, so make sure your opers are trustworthy! #- opercmds # Bots plugin: Allows you to manipulate pseudo-clients (bots) on networks. #- bots # Relay plugin: Server-side (like Janus) relay plugin. See the relay: block # below for configuration. #- relay # Relay Clientbot support: this allows channel messages and events like # JOIN, PART, KICK, etc. to relay over networks using Clientbot. You will # want this loaded if you're using PyLink as a relay bot. #- relay_clientbot # Fantasy plugin: Allows you to trigger commands in channels by PyLink's # nick or configurable prefix characters. #- fantasy # Changehost plugin: Automatically changes the hostmask (i.e. sets vHosts) on # matching users as they connect. This requires the changehost: block # to be configured correctly below. #- changehost # Automode plugin: allows assigning channel access to specific hostmasks or # exttargets. See https://github.com/GLolol/PyLink/blob/master/docs/automode.md # for a usage guide. #- automode # Servermaps plugin: displays network /map's from the PyLink server's perspective. #- servermaps # Servprotect plugin: disconnects from network if a certain limit # of kills/saves per X seconds is met. #- servprotect # Global plugin: Janus-style global plugin; announces messages to all channels the PyLink # client is in. #- global logging: # This configuration block defines targets that PyLink should log commands, # errors, etc., to. # This sets the level for STDOUT logging, which is always enabled. Valid # settings include DEBUG, INFO, WARNING, ERROR, and CRITICAL: see # https://docs.python.org/3/library/logging.html#logging-levels for details. stdout: INFO channels: # Logs to channels on the specified networks. # Make sure that the main PyLink client is also configured to join your # log channel in the "channels:" block for the relevant networks. # Note: Log messages are forwarded over relay, so you will get duplicate # messages if you add log blocks for more than one channel in one # relay. # Note 2: DEBUG logging is not supported here: any log level settings # below INFO be automatically raised to INFO. inspnet: "#services": loglevel: INFO "#pylink-notifications": loglevel: WARNING ts6net: "#services": loglevel: INFO files: # Logs to file targets. These will be placed in the log/ folder in the # PyLink directory, with a filename based on the current instance name # and the target name: instancename-targetname.log # When running with ./pylink, this will create log/pylink-errors.log # When running with ./pylink someconf.yml, this will create log/someconf-errors.log "errors": loglevel: ERROR # Ditto above. When running with ./pylink, it will use log/pylink-commands.log # When running with ./pylink someconf.yml, this will create log/someconf-commands.log "commands": loglevel: INFO # Uncomment this to enable debug logging. This is only needed if you're developing for # PyLink or are requested to enable this when reporting a bug. #"debug": # loglevel: DEBUG #filerotation: # Configures optional log file rotation. When enabled, PyLink will create rotate files # in the format pylink-commands.log, pylink-commands.log.1, pylink-commands.log.2, etc. # If either max_bytes or backup_count is 0, log rotation will be disabled. # Max amount of bytes per file, before rotation is done. Defaults to 50 MiB (52428800 bytes). #max_bytes: 52428800 # Amount of backups to make. Defaults to 5. #backup_count: 5 changehost: # This block configures the Changehost plugin. You don't need this if you # aren't using it. # Sets the networks where Changehost should be enabled. Please note: changehost does NOT support # arbitrarily cloaking clients introduced by PyLink (e.g. relay clients), as doing so would make # ban matching impossible. In these cases, it is the remote admin's job to turn on cloaking on # their IRCd! enabled_nets: - inspnet - ts6net # Sets the networks where Changehost hosts should be enforced: that is, any attempts # by the user or other services to overwrite a host will be reverted. #enforced_nets: # - inspnet # Sets the masks that Changehost enforcement should ignore: these can be users with certain # hosts, exttargets, etc. enforce_exceptions: - "*!*@yournet/staff/*" #- "$account" # Determines whether Changehost rules should also match the host portion of a mask by IP and # real hosts. These default to false. #match_ip: false #match_realhosts: false # This sets the hostmasks that Changehost should look for. Whenever someone # with a matching nick!user@host connects, their host will be set to the # text defined. The following substitutions are available here: # $uid, $ts (time of connection), $nick, $realhost, $ident, and $ip. # Invalid characters in hosts are replaced with a "-". # Also, make sure you quote each entry so the YAML parser treats them as # raw strings. hosts: # Here are some examples. Note that to keep your users' details # private, you should probably refrain from using $ip or $realhost, # in these hostmasks, unless cloaking is already disabled. "*!GLolol@*.yournet.com": "$nick.opers.yournet.com" "*!*@localhost": "some-server.hostname" # Freenode-style masks are possible with this (though without the # hashing) "*!*@bnc-server.yournet.com": "yournet/bnc-users/$ident" "*!*@ircip?.mibbit.com": "$ident.$realhost" "WebchatUser*!*@*": "webchat/users/$ident" relay: # This block defines various options for the Relay plugin. You don't need this # if you aren't using it. # Determines whether remote opers will have user mode +H (hideoper) set on # them. This has the benefit of lowering the oper count in /lusers and # /stats (P|p), but only on IRCds that support it. This defaults to true # if not set. hideoper: true # Determines whether real IPs should be sent across the relay. You should # generally have a consensus with your linked networks on whether this should # be turned on. You will see other networks' user IP addresses, and they # will see yours. Individual networks can also opt out of IP sharing # both ways by defining "relay_no_ips: true" in their server block. show_ips: false # Determines whether NickServ login info should be shown in the /whois output for # relay users. # Valid options include "all" (show this to everyone), "opers" (show only to # opers), and "none" (disabled). Defaults to none if not specified. whois_show_accounts: all # Determines whether the origin server should be shown in the /whois output for # relay users. # Valid options include "all" (show this to everyone), "opers" (show only to # opers), and "none" (disabled). Defaults to none if not specified. whois_show_server: opers # Determines whether the servers disconnecting in a netsplit should be shown when # relaying quits due to a netsplit. Defaults to False. show_netsplits: false # Sets the default Relay separator. Defaults to / if not specified. The "separator" # option in server blocks override this if specified. separator: "/" # Determines whether all nicks will be tagged by default, instead of only when a # nick collision happens. It is HIGHLY RECOMMENDED that you enable this, unless you're # absolutely sure NO ONE will be using the same nick on 2 or more networks in your # relay. # This defaults to True if not specified. Disabling this option is currently # experimental. tag_nicks: true # If tag_nicks is False, this specifies a list of NICK globs that network # tags should be added for anyways (e.g. network services). forcetag_nicks: - "*Serv" # This determines whether private messages & notices will be forwarded over Clientbot relay, # and whether the 'rpm' command will be allowed from Clientbot networks. This defaults to # False. allow_clientbot_pms: false # Sets the suffix that relay subservers should use. Defaults to "relay" (as in net1.relay, # net2.relay, etc.) if not specified. #server_suffix: "relay.yournet.net" # Sets whether Clientbot mode sync will be enabled. Valid options: # "full" - Sync bans, ban/invite exceptions, prefix modes, and all RFC1459-standard modes. The # bot will need op in the Clientbot channel for this to work both ways. # "half" - Sync only bans, ban/invite exceptions, and prefix modes. The bot will need op in the # Clientbot channel for this to work both ways. # "none" - Turns off mode sync. This is the default. # # Note: when mode sync is enabled and the bot is opped, CLAIM protection will be enforced across # Clientbot links as well. This means that the bot will try to revert any mode changes by non-ops # or services not in the channel. The workaround is to add all Clientbot networks to the CLAIM # list of any affected channels. # #clientbot_modesync: none # Determines whether messages from unknown clients (servers, clients not sharing in a -n channel, # etc.) should be forwarded via the PyLink server. If this is disabled, these messages will be # silently dropped. This defaults to True for consistency with older releases. #accept_weird_senders: false # Optionally defines a message that should be sent to all leaf channels that a network owns, when # it disconnects. This uses a template string as documented at # https://docs.python.org/3/library/string.html#template-strings, with the following substitutions: # $network: the name of the network that this message is being announced to # $channel: the channel that this message is being announced to # $homenetwork: the name of the network that disconnected # $homechannel: the original name of the channel this message is being announced to # If this option is empty or not set, no announcement is made. #disconnect_announcement: >- # Network $homenetwork has disconnected: $channel will remain open as the link is # re-established, but new links will be disabled. #servprotect: # This block configures the servprotect plugin; you don't need this if you aren't using it. # length: How many KILL/SAVE's before a disconnect? #length: 5 # age: Determines how much time (in seconds) should pass before the servprotect cache is reset. # Note: updates to this option require a reload of the servprotect plugin, which automatically # resets the cache. #age: 10 automode: # The following options in this block are common to all plugins that spawn service bots (games, # automode, etc.): # Sets the nick of the Automode service, if you're using it. If not defined, this defaults to # the service name ("automode" in this case). nick: Automode #ident: Automode # For each service, you can also specify what prefix modes you want the service bot to join channels with. # Setting this to op (+o) for Automode makes it appear more like a standard IRC service, and lessens # the risk of mode overrides being dropped. joinmodes: 'o' # Determines whether a separate service bot should be spawned for this plugin. This defaults to # True, unless a network's protocol module doesn't support spawning extra service bots. # This option overrides the global "spawn_services" option defined in "pylink:". #spawn_service: true # Defines a fantasy prefix for the Automode bot (requires spawn_services to be set and the # fantasy plugin to be loaded). prefix: "@" games: # Sets the nick of the Games service, if you're using it. This defaults to "games" if not defined. nick: Games # Defines a fantasy prefix for the Games bot. prefix: "./" stats: # Determines the time format that the Stats plugin should use for showing dates + times. # Defaults to "%a, %d %b %Y %H:%M:%S +0000" (the RFC 2812 standard) if not specified. time_format: "%c" global: # Sets the text format for the global plugin, if it is loaded. This uses a template string as # documented at https://docs.python.org/3/library/string.html#template-strings, with the # following substitutions: # $sender: the nick of the sender # $network: the short network name of the origin network # $fullnetwork: the full network name of the origin network # $current_channel: the channel we're broadcasting on # $current_network: the network we're currently broadcasting on # $current_fullnetwork: the full name of the network we're currently broadcasting on # $text: the global text #format: "[$sender@$fullnetwork] $text"