Dzahn has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/345791 )
Change subject: new profile/role for IRC server using charybdis (WIP)
......................................................................
new profile/role for IRC server using charybdis (WIP)
This is an attempt to solve 2 things at once, first start using
charybdis instead of ratbox-ircd as IRCd (see ticket why), have a role
to test that in labs with the central puppetmaster) and also turn it into
the newer puppet "profile"-structure.
The plan is to use this for testing and once it works to start using
it in prod and delete the old mw_rc_irc role instead.
Bug: T134271
Change-Id: Ied452adb6fb599c1a87b8684f491374b1c750ab1
---
A modules/ircserver/files/monitor/ircd_stats.py
A modules/ircserver/files/systemd/ircd.service
A modules/ircserver/files/systemd/ircecho.service
A modules/ircserver/files/udpmxircecho.py
A modules/ircserver/manifests/charybdis.pp
A modules/ircserver/templates/ircd.conf.erb
A modules/ircserver/templates/motd.erb
A modules/profile/manifests/ircserver.pp
A modules/role/manifests/ircserver.pp
9 files changed, 951 insertions(+), 0 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/operations/puppet
refs/changes/91/345791/1
diff --git a/modules/ircserver/files/monitor/ircd_stats.py
b/modules/ircserver/files/monitor/ircd_stats.py
new file mode 100644
index 0000000..9664ae4
--- /dev/null
+++ b/modules/ircserver/files/monitor/ircd_stats.py
@@ -0,0 +1,52 @@
+import diamond.collector
+import socket
+import re
+
+
+class IRCDStatsCollector(diamond.collector.Collector):
+
+ def get_default_config(self):
+ """
+ Returns the default collector settings
+ """
+ config = super(IRCDStatsCollector, self).get_default_config()
+ config.update({
+ 'path': 'ircd',
+ 'server': 'localhost',
+ 'user': 'ircd_stats_bot',
+ 'port': 6667,
+ })
+ return config
+
+ def recv_until(self, the_socket, end):
+ total_data = ''
+ while True:
+ data = the_socket.recv(8192)
+ total_data += (data)
+ if end in total_data:
+ break
+ return total_data.rstrip('\0').strip()
+
+ def collect(self):
+ irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ irc.connect((self.config['server'], int(self.config['port'])))
+ # making ircd happy with # of args
+ irc.send("USER %s %s %s :%s\n" % (self.config['user'],
+ self.config['user'],
+ self.config['user'],
+ self.config['user']))
+
+ irc.send("NICK %s\n" % (self.config['user'],))
+ termout = self.recv_until(irc, 'End of /MOTD command')
+ users = re.search("There\sare\s(\d+)\susers", termout)
+ chans = re.search("(\d+)\s:channels\sformed", termout)
+ if users and chans:
+ self.publish('users', users.groups()[0].strip())
+ self.publish('channels', chans.groups()[0].strip())
+ finally:
+ try:
+ irc.send("QUIT \n")
+ irc.close()
+ except:
+ pass
diff --git a/modules/ircserver/files/systemd/ircd.service
b/modules/ircserver/files/systemd/ircd.service
new file mode 100644
index 0000000..0ccfde2
--- /dev/null
+++ b/modules/ircserver/files/systemd/ircd.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=IRCd for Mediawiki RecentChanges feed
+After=network.target
+
+[Service]
+User=irc
+Group=irc
+ExecStart=/usr/bin/ircd -foreground
+[Install]
+WantedBy=multi-user.target
diff --git a/modules/ircserver/files/systemd/ircecho.service
b/modules/ircserver/files/systemd/ircecho.service
new file mode 100644
index 0000000..52e8591
--- /dev/null
+++ b/modules/ircserver/files/systemd/ircecho.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=IRC bot for the MW RC IRCD
+After=ircd.service
+Requires=ircd.service
+
+[Service]
+User=irc
+Group=irc
+ExecStart=/usr/local/bin/udpmxircecho.py
+Restart=on-failure
+RestartSec=3
+[Install]
+WantedBy=multi-user.target
diff --git a/modules/ircserver/files/udpmxircecho.py
b/modules/ircserver/files/udpmxircecho.py
new file mode 100755
index 0000000..f48b3ba
--- /dev/null
+++ b/modules/ircserver/files/udpmxircecho.py
@@ -0,0 +1,88 @@
+#! /usr/bin/env python
+try:
+ from irc.bot import SingleServerIRCBot
+except ImportError:
+ from ircbot import SingleServerIRCBot
+import argparse
+import json
+import threading
+import socket
+import sys
+reload(sys)
+sys.setdefaultencoding('utf8')
+
+argparser = argparse.ArgumentParser()
+argparser.add_argument(
+ '--config-file',
+ help='Path to config file',
+ default='/etc/udpmxircecho-config.json',
+ type=argparse.FileType('r')
+)
+args = argparser.parse_args()
+config_data = json.load(args.config_file)
+
+
+class EchoReader(threading.Thread):
+ def __init__(self, bot):
+ threading.Thread.__init__(self)
+ self.bot = bot
+
+ def run(self):
+ udpsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ udpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+
+ try:
+ udpsock.bind(('', config_data['udp_port']))
+ except socket.error, msg:
+ sys.stderr.write("[ERROR] %s\n" % msg[1])
+ sys.exit(2)
+
+ while True:
+ try:
+ s = udpsock.recv(65535)
+ sp = s.split("\t")
+ if len(sp) == 2:
+ channel = sp[0]
+ text = sp[1].lstrip().replace('\r', '').replace('\n', '')
+
+ if channel not in self.bot.chans:
+ self.bot.chans.append(channel)
+ self.bot.connection.join(channel)
+ # this throws an exception if not connected.
+ self.bot.connection.privmsg(channel, text)
+ except EOFError:
+ # Once the input is finished, the bot should exit
+ sys.exit()
+ except Exception as e:
+ print e
+
+
+class EchoBot(SingleServerIRCBot):
+ def __init__(self):
+ port = config_data['irc_port']
+ nickname = config_data['irc_nickname']
+ server = config_data['irc_server']
+ print "connecting to %s as %s on port %s" % (server, nickname, port)
+ server_list = [(server, port)]
+ realname = config_data['irc_realname']
+ SingleServerIRCBot.__init__(self, server_list, nickname, realname)
+ self.chans = []
+
+ def on_nicknameinuse(self, c, e):
+ print '%s nickname in use!' % (c.get_nickname(),)
+ c.nick(c.get_nickname() + "_")
+
+ def on_welcome(self, c, e):
+ print "got welcome"
+ c.oper("rc", config_data['irc_oper_pass'])
+
+ for chan in self.chans:
+ c.join(chan)
+
+
+def main():
+ bot = EchoBot()
+ sthr = EchoReader(bot)
+ sthr.start()
+ bot.start()
+main()
diff --git a/modules/ircserver/manifests/charybdis.pp
b/modules/ircserver/manifests/charybdis.pp
new file mode 100644
index 0000000..3ce6a84
--- /dev/null
+++ b/modules/ircserver/manifests/charybdis.pp
@@ -0,0 +1,65 @@
+# Sets up the Wikimedia (read-only) IRCd
+# This is a modified ircd server and is not
+# suitable for a general ircd deployment
+class ircserver::charybdis {
+
+ require_package('charybdis', 'irssi')
+
+ # public part of the ircd config
+ file { '/usr/etc/ircd.conf':
+ mode => '0444',
+ owner => 'irc',
+ group => 'irc',
+ content => template('mw_rc_irc/ircd.conf.erb');
+ }
+
+ # private config block for auth/allowed users
+ file { '/usr/etc/auth.conf':
+ mode => '0444',
+ owner => 'irc',
+ group => 'irc',
+ content => secret('mw_rc_irc/auth.conf');
+ }
+
+ # private config block for operators and their passwords
+ file { '/usr/etc/operator.conf':
+ mode => '0444',
+ owner => 'irc',
+ group => 'irc',
+ content => secret('mw_rc_irc/operator.conf');
+ }
+
+ # message of the day / connect banner
+ file { '/usr/etc/ircd.motd':
+ mode => '0444',
+ owner => 'irc',
+ group => 'irc',
+ content => template('mw_rc_irc/motd.erb');
+ }
+
+ file { '/etc/systemd/system/ircd.service':
+ owner => 'root',
+ group => 'root',
+ mode => '0444',
+ source => 'puppet:///modules/mw_rc_irc/systemd/ircd.service',
+ }
+
+ service { 'ircd':
+ ensure => running,
+ provider => 'systemd',
+ require => File['/etc/systemd/system/ircd.service'],
+ }
+
+ diamond::collector { 'IRCDStats':
+ source => 'puppet:///modules/mw_rc_irc/monitor/ircd_stats.py',
+ settings => {
+ method => 'Threaded',
+ },
+ }
+
+ monitoring::service { 'ircd':
+ description => 'ircd',
+ check_command => 'check_ircd',
+ critical => true,
+ }
+}
diff --git a/modules/ircserver/templates/ircd.conf.erb
b/modules/ircserver/templates/ircd.conf.erb
new file mode 100644
index 0000000..164db47
--- /dev/null
+++ b/modules/ircserver/templates/ircd.conf.erb
@@ -0,0 +1,668 @@
+/* This file is managed by Puppet!
+ *
+ * Copyright (C) 2000-2002 Hybrid Development Team
+ * Copyright (C) 2002-2003 ircd-ratbox development team
+ *
+ * Written by ejb, wcampbel, db, leeh and others
+ * Previously modified for EFNet by Disciple
+ *
+ * $Id: example.efnet.conf 23955 2007-05-14 17:22:36Z leeh $
+ */
+
+/* IMPORTANT NOTES:
+ *
+ * class {} blocks MUST be specified before anything that uses them. That
+ * means they must be defined before auth {} and before connect {}.
+ *
+ * auth {} blocks MUST be specified in order of precedence. The first one
+ * that matches a user will be used. So place spoofs first, then specials,
+ * then general access, then restricted.
+ *
+ * Both shell style (#) and C style comments are supported.
+ *
+ * Files may be included by either:
+ * .include "filename"
+ * .include <filename>
+ *
+ * Times/durations are written as:
+ * 12 hours 30 minutes 1 second
+ *
+ * Valid units of time:
+ * month, week, day, hour, minute, second
+ *
+ * Valid units of size:
+ * megabyte/mbyte/mb, kilobyte/kbyte/kb, byte
+ *
+ * Sizes and times may be singular or plural.
+ */
+
+ /* serverinfo {}: Contains information about the server. (OLD M:) */
+serverinfo {
+ /* name: the name of our server */
+ name = "irc.wikimedia.org";
+
+ /* use ts6: whether we want to use the TS6 protocol to other servers
+ * or not.
+ */
+ use_ts6 = no;
+
+ /* sid: the unique server id of our server. This must be three
+ * characters long. The first character must be a digit [0-9], the
+ * remaining two chars may be letters [A-Z] or digits [0-9].
+ *
+ * This must be specified even if use_ts6 is set to no.
+ */
+ sid = "42Y";
+
+ /* description: the description of our server. '[' and ']' may not
+ * be used here for compatibility with older servers.
+ */
+ description = "Wikimedia IRC Server";
+
+ /* network info: the name and description of the network this server
+ * is on. Shown in the 005 reply and used with serverhiding.
+ */
+ network_name = "Wikimedia";
+ network_desc = "Wikimedia RC -> IRC gateway";
+
+ /* hub: allow this server to act as a hub and have multiple servers
+ * connected to it.
+ */
+ hub = no;
+
+ /* vhost: the IP to bind to when we connect outward to ipv4 servers.
+ * This should be an ipv4 IP only.
+ */
+ #vhost = "192.169.0.1";
+
+ /* vhost6: the IP to bind to when we connect outward to ipv6 servers.
+ * This should be an ipv6 IP only.
+ */
+ #vhost6 = "3ffe:80e8:546::2";
+
+ /* default max clients: the default maximum number of clients
+ * allowed to connect. This can be changed once ircd has started by
+ * issuing:
+ * /quote set maxclients <limit>
+ */
+ default_max_clients = 10000;
+};
+
+/* admin {}: contains admin information about the server. (OLD A:) */
+admin {
+ name = "Wikimedia Administrators";
+ description = "Wikimedia Administrator";
+ email = "[email protected]";
+};
+
+/* log {}: contains information about logfiles. */
+log {
+ /* logfiles: the logfiles to use for specific activity. if these
+ * paths are defined, then ircd will log to them, otherwise it wont.
+ *
+ * The confs are, in order:
+ * - userlog: user exits
+ * - fuserlog: failed user connections
+ * - operlog: /oper usage
+ * - foperlog: failed /oper usage
+ * - serverlog: server connects/disconnects
+ * - glinelog: glines
+ * - klinelog: klines, etc
+ * - killlog: kills
+ * - operspylog: operspy usage
+ * - ioerrorlog: IO errors
+ */
+ fname_userlog = "logs/userlog";
+ #fname_fuserlog = "logs/fuserlog";
+ fname_operlog = "logs/operlog";
+ #fname_foperlog = "logs/foperlog";
+ fname_serverlog = "logs/serverlog";
+ fname_glinelog = "logs/glinelog";
+ #fname_klinelog = "logs/klinelog";
+ fname_killlog = "logs/killlog";
+ fname_operspylog = "logs/operspylog";
+ #fname_ioerrorlog = "logs/ioerror";
+};
+
+/* class {}: contain information about classes for users (OLD Y:) */
+class "users" {
+ /* class name must go above */
+
+ /* ping time: how often a client must reply to a PING from the
+ * server before they are dropped.
+ */
+ ping_time = 3 minutes;
+
+ /* number per ident: the number of users per user@host networkwide
+ * allowed to connect. Unidented connections are classified as
+ * the same ident.
+ */
+ number_per_ident = 30000;
+
+ /* number per ip: the number of local users per host allowed */
+ number_per_ip = 30000;
+
+ /* number per ip global: the number of network wide connections
+ * per host allowed for a user, including connections to the
+ * local server.
+ */
+ number_per_ip_global = 30000;
+
+ /* cidr_bitlen: Limits numbers of connections from a subnet size
+ * the following example makes the subnet /64 this is useful
+ * for IPv6 connections in particular
+ * Also note that the way ircd-ratbox is written if you have
+ * compiled support for IPv6, IPv4 cidr bitlens need to be modified
+ * Basically to get the approriate length add 96 to the IPv4 length
+ * For example for a /24 do 96+24 = 120
+ *
+ */
+ cidr_bitlen = 32;
+
+ /* number_per_cidr: Number of connections to allow from a subnet of the
+ * size given in cidr_bitlen. 4 seems to be a good default to me.
+ */
+ number_per_cidr = 3000;
+
+ /* max number: the maximum number of users allowed in this class */
+ max_number = 10000;
+
+ /* sendq: the amount of data allowed in a clients queue before
+ * they are dropped.
+ */
+ sendq = 100 kbytes;
+};
+
+class "restricted" {
+ ping_time = 1 minute 30 seconds;
+ number_per_ip = 100;
+ max_number = 100;
+ sendq = 60kb;
+};
+
+class "opers" {
+ ping_time = 5 minutes;
+ number_per_ip = 0;
+ max_number = 10;
+ sendq = 2 mb;
+};
+
+class "server" {
+ ping_time = 5 minutes;
+
+ /* connectfreq: only used in server classes. specifies the delay
+ * between autoconnecting to servers.
+ */
+ connectfreq = 10 minutes;
+
+ /* max number: the amount of servers to autoconnect to */
+ max_number = 10;
+
+ /* sendq: servers need a higher sendq as they send more data */
+ sendq=15 megabytes;
+};
+
+/* listen {}: contain information about the ports ircd listens on (OLD P:) */
+listen {
+ /* port: the specific port to listen on. if no host is specified
+ * before, it will listen on all available IPs.
+ *
+ * ports are seperated via a comma, a range may be specified using ".."
+ */
+
+ /* port: listen on all available IPs, ports 5000, 6665 to 6669 */
+ port = 6664 .. 6669, 8001;
+
+};
+
+# The auth and operator blocks are in the private repo.
+.include "auth.conf"
+.include "operator.conf"
+
+/* The channel block contains options pertaining to channels */
+channel {
+ /* invex: Enable/disable channel mode +I, a n!u@h list of masks
+ * that can join a +i channel without an invite.
+ *
+ * EFNet Note: This MUST be run on efnet.
+ */
+ use_invex = yes;
+
+ /* except: Enable/disable channel mode +e, a n!u@h list of masks
+ * that can join a channel through a ban (+b).
+ *
+ * EFNet Note: This MUST be run on efnet.
+ */
+ use_except = yes;
+
+ /* knock: Allows users to request an invite to a channel that
+ * is locked somehow (+ikl). If the channel is +p or you are banned
+ * the knock will not be sent.
+ */
+ use_knock = yes;
+
+ /* invite ops only: Restrict /invite to ops on channels, rather than
+ * allowing unopped users to invite people to a -i channel.
+ */
+ invite_ops_only = yes;
+
+ /* knock delay: The amount of time a user must wait between issuing
+ * the knock command.
+ */
+ knock_delay = 1 minute;
+
+ /* knock channel delay: How often a knock to any specific channel
+ * is permitted, regardless of the user sending the knock.
+ */
+ knock_delay_channel = 1 minute;
+
+ /* max chans: The maximum number of channels a user can join/be on. */
+ max_chans_per_user = 20000;
+
+ /* quiet on ban: stop banned people talking in channels. */
+ quiet_on_ban = yes;
+
+ /* max bans: maximum number of +b/e/I modes in a channel */
+ /* EFNET approved 100 at 01/08/03 */
+ max_bans = 100;
+
+ /* splitcode: split users, split servers and either no join on split
+ * or no create on split must be enabled for split checking.
+ * splitmode will be entered on either split users or split servers
+ * dropping below the limit.
+ *
+ * you may force splitmode to be permanent by /quote set splitmode on
+ */
+
+ /* split users: when the usercount is lower than this level, consider
+ * ourselves split. this must be set for automatic splitmode
+ */
+ default_split_user_count = 20000;
+
+ /* split servers: when the amount of servers that have acknowledged
+ * theyve finished bursting is lower than this, consider ourselves
+ * split. this must be set for automatic splitmode
+ */
+ default_split_server_count = 15;
+
+ /* split: no create: disallow users creating channels on split
+ *
+ * EFNet Note: This MUST be run on efnet.
+ */
+ no_create_on_split = yes;
+
+ /* split: no join: disallow users joining channels at all on a split */
+ no_join_on_split = no;
+
+ /* burst topicwho: when bursting topics, also burst the topic setter */
+ /* NOTE: on efnet this will add about 500k-1mb to a burst. */
+ burst_topicwho = yes;
+};
+
+
+/* The general block contains many of the options that were once compiled
+ * in options in config.h. The general block is read at start time.
+ */
+general {
+ /* hide error messages: defines whether error messages from
+ * servers are hidden or not. These can sometimes contain IPs and
+ * can have an adverse effect on server ip hiding. Set to:
+ * yes: hide from opers and admin
+ * opers: hide from opers only
+ * no: do not hide error messages
+ */
+ hide_error_messages = opers;
+
+ /* hide spoof ips: hide the real ips of spoofed users */
+ hide_spoof_ips = yes;
+
+ /* default invisible: set clients +i on connect */
+ default_invisible = no;
+
+ /* default operstring: defines the default oper response
+ * in /whois queries, eg "is an IRC Operator"
+ */
+ default_operstring = "is an IRC Operator";
+
+ /* default adminstring: defines the default admin response
+ * in /whois queries, eg "is a Server Administrator"
+ */
+ default_adminstring = "is a Server Administrator";
+
+ /* tkline_expire_notices: give a notice to opers when a tkline
+ * expires
+ */
+ tkline_expire_notices = no;
+
+ /* floodcount: the default value of floodcount that is configurable
+ * via /quote set floodcount. This is the amount of lines a user
+ * may send to any other user/channel in one second.
+ */
+ default_floodcount = 10;
+
+ /* disable fake channels: disable local users joining fake versions
+ * of channels, eg #foo^B^B. Disables bold, mirc colour, reverse,
+ * underline and hard space. (ASCII 2, 3, 22, 31, 160 respectively).
+ */
+ disable_fake_channels = yes;
+
+ /* failed oper notice: send a notice to all opers on the server when
+ * someone tries to OPER and uses the wrong password, host or ident.
+ */
+ failed_oper_notice = yes;
+
+ /* dots in ident: the amount of '.' characters permitted in an ident
+ * reply before the user is rejected.
+ */
+ dots_in_ident=2;
+
+ /* dot in ipv6: ircd-hybrid-6.0 and earlier will disallow hosts
+ * without a '.' in them. this will add one to the end. only needed
+ * for older servers.
+ */
+ dot_in_ip6_addr = no;
+
+ /* min nonwildcard: the minimum non wildcard characters in k/d/g lines
+ * placed via the server. klines hand placed are exempt from limits.
+ * wildcard chars: '.' '*' '?' '@'
+ */
+ min_nonwildcard = 3;
+
+ /* min nonwildcard simple: the minimum non wildcard characters in
+ * xlines/resvs placed via the server.
+ * wildcard chars: '*' '?'
+ */
+ min_nonwildcard_simple = 3;
+
+ /* max accept: maximum allowed /accept's for +g usermode */
+ max_accept = 200;
+
+ /* max monitor: the maximum amount of nicknames a client may have in
+ * their monitor (server-side notify) list.
+ */
+ max_monitor = 80;
+
+ /* nick flood: enable the nickflood control code */
+ anti_nick_flood = yes;
+
+ /* nick flood: the nick changes allowed in the specified period */
+ max_nick_time = 20 seconds;
+ max_nick_changes = 5;
+
+ /* anti spam time: the minimum time a user must be connected before
+ * custom quit messages are allowed.
+ */
+ anti_spam_exit_message_time = 5 minutes;
+
+ /* ts delta: the time delta allowed between server clocks before
+ * a warning is given, or before the link is dropped. all servers
+ * should run ntpdate/rdate to keep clocks in sync
+ */
+ ts_warn_delta = 30 seconds;
+ ts_max_delta = 5 minutes;
+
+ /* client exit: prepend a users quit message with "Client exit: " */
+ client_exit = yes;
+
+ /* dline reason: show the user the dline reason when they connect
+ * and are dlined.
+ */
+ dline_with_reason = yes;
+
+ /* kline delay: delay the checking of klines until a specified time.
+ * Useful if large kline lists are applied often to prevent the
+ * server eating CPU.
+ */
+ kline_delay = 5 seconds;
+
+ /* kline reason: show the user the reason why they are k/d/glined
+ * on exit. may give away who set k/dline when set via tcm.
+ */
+ kline_with_reason = yes;
+
+ /* kline reason: make the users quit message on channels this
+ * reason instead of the oper's reason.
+ */
+ kline_reason = "Connection closed";
+
+ /* non redundant klines: flag and ignore redundant klines */
+ non_redundant_klines = yes;
+
+ /* warn no nline: warn opers about servers that try to connect but
+ * we dont have a connect {} block for. Twits with misconfigured
+ * servers can get really annoying with this enabled.
+ */
+ warn_no_nline = yes;
+
+ /* stats e disabled: disable stats e. useful if server ips are
+ * exempted and you dont want them listing on irc.
+ */
+ stats_e_disabled = no;
+
+ /* stats c oper only: make stats c (connect {}) oper only */
+ stats_c_oper_only=no;
+
+ /* stats h oper only: make stats h (hub_mask/leaf_mask) oper only */
+ stats_h_oper_only=no;
+
+ /* stats y oper only: make stats y (class {}) oper only */
+ stats_y_oper_only=no;
+
+ /* stats o oper only: make stats o (opers) oper only */
+ stats_o_oper_only=yes;
+
+ /* stats P oper only: make stats P (ports) oper only
+ * NOTE: users doing stats P will never be given the ips that the
+ * server listens on, simply the ports.
+ */
+ stats_P_oper_only=no;
+
+ /* stats i oper only: make stats i (auth {}) oper only. set to:
+ * yes: show users no auth blocks, made oper only.
+ * masked: show users first matching auth block
+ * no: show users all auth blocks.
+ */
+ stats_i_oper_only=yes;
+
+ /* stats k/K oper only: make stats k/K (klines) oper only. set to:
+ * yes: show users no auth blocks, made oper only
+ * masked: show users first matching auth block
+ * no: show users all auth blocks.
+ */
+ stats_k_oper_only=yes;
+
+ /* map oper only: make /map oper only */
+ map_oper_only = yes;
+
+ /* operspy admin only: make operspy notices to +Z admin only */
+ operspy_admin_only = no;
+
+ /* caller id wait: time between notifying a +g user that somebody
+ * is messaging them.
+ */
+ caller_id_wait = 1 minute;
+
+ /* pace wait simple: time between use of less intensive commands
+ * (HELP, remote WHOIS, WHOWAS)
+ */
+ pace_wait_simple = 1 second;
+
+ /* pace wait: time between more intensive commands
+ * (ADMIN, INFO, LIST, LUSERS, MOTD, STATS, VERSION)
+ */
+ pace_wait = 10 seconds;
+
+ /* short motd: send clients a notice telling them to read the motd
+ * instead of forcing a motd to clients who may simply ignore it.
+ */
+ short_motd = no;
+
+ /* ping cookies: require clients to respond exactly to a ping command,
+ * can help block certain types of drones and FTP PASV mode spoofing.
+ */
+ ping_cookie = no;
+
+ /* connect timeout: sets how long we should wait for a connection
+ * request to succeed
+ */
+ connect_timeout = 30 seconds;
+
+ /* disable auth: disables identd checking */
+ disable_auth = no;
+
+ /* no oper flood: increase flood limits for opers. */
+ no_oper_flood = yes;
+
+ /* glines: enable glines, network wide temp klines */
+ /*
+ * EFnet Note: This feature is required for European EFnet servers
+ * and is used by several North American servers. As
+ * such, it has been left on by default. If you
+ * do not want your server to participate in G:Lines
+ * you should disable this.
+ */
+ glines = yes;
+
+ /* gline time: the amount of time a gline will remain before expiring */
+ gline_time = 1 day;
+
+ /* gline_min_cidr: If using a CIDR gline, the minimum length the
+ * mask must be
+ */
+ gline_min_cidr = 16;
+
+ /* idletime: the maximum amount of time a user may idle before
+ * they are disconnected
+ */
+ idletime = 0;
+
+ /* REMOVE ME. The following line checks you've been reading. */
+
+
+ /* max targets: the maximum amount of targets in a single
+ * PRIVMSG/NOTICE. set to 999 NOT 0 for unlimited.
+ */
+ max_targets = 4;
+
+ /* client flood: maximum number of lines in a clients queue before
+ * they are dropped for flooding.
+ */
+ client_flood = 20;
+
+ /* use_whois_actually: send clients requesting a whois a numeric
+ * giving the real IP of non-spoofed clients to prevent DNS abuse.
+ */
+ use_whois_actually = yes;
+
+ /* usermodes configurable: a list of usermodes for the options below
+ *
+ * +b - bots - See bot and drone flooding notices
+ * +c - cconn - Client connection/quit notices
+ * +C - cconnext - Extended client connection/quit notices
+ * +d - debug - See debugging notices
+ * +f - full - See I: line full notices
+ * +g - callerid - Server Side Ignore
+ * +i - invisible - Not shown in NAMES or WHO unless you share a
+ * a channel
+ * +k - skill - See server generated KILL messages
+ * +l - locops - See LOCOPS messages
+ * +n - nchange - See client nick changes
+ * +r - rej - See rejected client notices
+ * +s - servnotice - See general server notices
+ * +u - unauth - See unauthorised client notices
+ * +w - wallop - See server generated WALLOPS
+ * +x - external - See remote server connection and split notices
+ * +y - spy - See LINKS, STATS, TRACE notices etc.
+ * +z - operwall - See oper generated WALLOPS
+ * +Z - operspy - See operspy notices
+ */
+
+ /* oper only umodes: usermodes only opers may set */
+ oper_only_umodes = bots, cconn, debug, full, skill, nchange,
+ rej, spy, external, operwall, locops, unauth;
+
+ /* oper umodes: default usermodes opers get when they /oper */
+ oper_umodes = locops, servnotice, operwall, wallop;
+
+ /* servlink path: path to 'servlink' program used by ircd to handle
+ * encrypted/compressed server <-> server links.
+ *
+ * only define if servlink is not in same directory as ircd itself.
+ */
+ #servlink_path = "/usr/local/ircd/bin/servlink";
+
+ /* use egd: if your system does not have *random devices yet you
+ * want to use OpenSSL and encrypted links, enable this. Beware -
+ * EGD is *very* CPU intensive when gathering data for its pool
+ */
+ #use_egd = yes;
+
+ /* egdpool path: path to EGD pool. Not necessary for OpenSSL >= 0.9.7
+ * which automatically finds the path.
+ */
+ #egdpool_path = "/var/run/egd-pool";
+
+
+ /* compression level: level of compression for compressed links between
+ * servers.
+ *
+ * values are between: 1 (least compression, fastest)
+ * and: 9 (most compression, slowest).
+ */
+ #compression_level = 6;
+
+ /* burst_away: This enables bursting away messages to servers.
+ * With this disabled, we will only propogate AWAY messages
+ * as users send them, but never burst them. Be warned though
+ * enabling this could increase the size of a burst significantly
+ * for a large network, like EFnet.
+ */
+ /* egdpool path: path to EGD pool. Not necessary for OpenSSL >= 0.9.7
+ * which automatically finds the path.
+ */
+ #egdpool_path = "/var/run/egd-pool";
+
+
+ /* compression level: level of compression for compressed links between
+ * servers.
+ *
+ * values are between: 1 (least compression, fastest)
+ * and: 9 (most compression, slowest).
+ */
+ #compression_level = 6;
+
+ /* burst_away: This enables bursting away messages to servers.
+ * With this disabled, we will only propogate AWAY messages
+ * as users send them, but never burst them. Be warned though
+ * enabling this could increase the size of a burst significantly
+ * for a large network, like EFnet.
+ */
+ burst_away = yes;
+
+ /* reject time: the amount of rejections through klines/dlines etc
+ * allowed in the given time before the rejection is cached and
+ * a pseudo temp dline is placed
+ */
+ reject_ban_time = 1 minute;
+ reject_after_count = 3;
+
+ /* reject duration: the amount of time to cache the rejection */
+ reject_duration = 5 minutes;
+
+ /* max_unknown_ip: maximum number of pending connections to the server
+ * that are allowed per IP address
+ */
+ max_unknown_ip = 200;
+};
+
+modules {
+ /* module path: paths to search for modules specified below and
+ * in /modload.
+ */
+ path = "/usr/local/ircd/modules";
+ path = "/usr/local/ircd/modules/autoload";
+
+ /* module: the name of a module to load on startup/rehash */
+ #module = "some_module.so";
+};
+
diff --git a/modules/ircserver/templates/motd.erb
b/modules/ircserver/templates/motd.erb
new file mode 100644
index 0000000..0cbb4fa
--- /dev/null
+++ b/modules/ircserver/templates/motd.erb
@@ -0,0 +1,19 @@
+*******************************************************
+This is the Wikimedia RC->IRC gateway
+
+https://wikitech.wikimedia.org/wiki/Irc.wikimedia.org
+*******************************************************
+Sending messages to channels is not allowed.
+
+A channel exists for all Wikimedia wikis which have been
+changed since the last time the server was restarted. In
+general, the name is just the domain name with the .org
+left off. For example, the changes on the English Wikipedia
+are available at #en.wikipedia
+
+If you want to talk, please join one of the many
+Wikimedia-related channels on irc.freenode.net.
+
+Alternatively, you can use Wikimedia's RCStream service,
+which streams recent changes as JSON using the WebSockets protocol.
+See https://wikitech.wikimedia.org/wiki/RCStream for details.
diff --git a/modules/profile/manifests/ircserver.pp
b/modules/profile/manifests/ircserver.pp
new file mode 100644
index 0000000..1f715e7
--- /dev/null
+++ b/modules/profile/manifests/ircserver.pp
@@ -0,0 +1,27 @@
+class profile::ircserver {
+
+ include ::standard
+ include ::base::firewall
+ include passwords::udpmxircecho
+ # $udpmxircecho_pass = $passwords::udpmxircecho::udpmxircecho_pass
+
+ #class { '::mw_rc_irc::irc_echo':
+ # ircpassword => $udpmxircecho_pass,
+ #}
+
+ include mw_rc_irc::ircserver
+
+ # IRCd - public access
+ ferm::service { 'ircd_public':
+ proto => 'tcp',
+ port => '(6664 6665 6666 6667 6668 6669 8001)',
+ }
+
+ # IRC RecentChanges bot - gets updates from appservers
+ ferm::service { 'udpmxircecho':
+ proto => 'udp',
+ port => '9390',
+ srange => '$MW_APPSERVER_NETWORKS',
+ }
+
+}
diff --git a/modules/role/manifests/ircserver.pp
b/modules/role/manifests/ircserver.pp
new file mode 100644
index 0000000..b24db32
--- /dev/null
+++ b/modules/role/manifests/ircserver.pp
@@ -0,0 +1,9 @@
+# read-only IRC server to display RecentChanges
+class role::ircserver {
+
+ system::role { 'role::ircserver': description => 'MW Changes IRC Broadcast
Server' }
+
+ include ::standard
+ include ::profile::ircserver::charybdis
+
+}
--
To view, visit https://gerrit.wikimedia.org/r/345791
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ied452adb6fb599c1a87b8684f491374b1c750ab1
Gerrit-PatchSet: 1
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Dzahn <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits