This file documents ALL configuration options. Because juno is so excessively configurable, the less frequently used ones are omitted from the example configuration but are present here.
- Server info
- Modes
- Modules
- Maximum values
- Classes
- File paths
- SSL
- Administrative info
- Server options
- User options
- Channel options
- Services options
- Listening
- Server uplinks
- IRC operators
- Command aliases
- DNS blacklists
- IRCd definitions
Basic server info.
[ server ]
network = 'JunoDevNet' # network name
name = 'devserver.example.com' # server name
description = 'juno development server' # server description
sex = 'male' # server gender
id = 0 # server ID (must be unique and integral)
casemapping = 'rfc1459' # 'rfc1459' or 'ascii'
# you MUST use rfc1459 if using TS6
Mode definitions. These are omitted from the example configuration because, when not otherwise specified, defaults are used. These are merely mappings; you can safely define modes which may not even be present on the server (due to the providing modules not being loaded) without breaking things.
[ modes: user ]
ircop = 'o' # IRC operator (o)
invisible = 'i' # invisible mode (i)
ssl = 'z' # SSL connection (z)
registered = 'r' # registered nickname (r)
service = 'S' # network service (S)
deaf = 'D' # does not receive channel messages (D)
admin = 'a' # server administrator (a)
wallops = 'w' # receives wallops (w)
bot = 'B' # marks user as a bot (B)
cloak = 'x' # hostname cloaking (x)
mode_normal
- no parametermode_param
- parameter alwaysmode_pset
- parameter only when settingmode_list
- banlike/list modemode_key
- channel key (special case)
[ modes: channel ]
no_ext = [ mode_normal, 'n' ] # no external channel messages (n)
protect_topic = [ mode_normal, 't' ] # only operators can set the topic (t)
invite_only = [ mode_normal, 'i' ] # you must be invited to join (i)
free_invite = [ mode_normal, 'g' ] # you do not need op to invite (g)
free_forward = [ mode_normal, 'F' ] # you do not need op in forwad channel (F)
oper_only = [ mode_normal, 'O' ] # you need to be an ircop to join (O)
moderated = [ mode_normal, 'm' ] # only voiced and up may speak (m)
secret = [ mode_normal, 's' ] # secret channel (s)
private = [ mode_normal, 'p' ] # private channel, hide and no knocks (p)
ban = [ mode_list, 'b' ] # channel ban (b)
mute = [ mode_list, 'Z' ] # channel mute ban (Z)
except = [ mode_list, 'e' ] # ban exception (e)
invite_except = [ mode_list, 'I' ] # invite-only exception (I)
access = [ mode_list, 'A' ] # Channel::Access module list mode (A)
limit = [ mode_pset, 'l' ] # Channel user limit mode (l)
forward = [ mode_pset, 'f' ] # Channel forward mode (f)
key = [ mode_key, 'k' ] # Channel key mode (k)
permanent = [ mode_normal, 'P' ] # do not destroy channel when empty (P)
reg_only = [ mode_normal, 'r' ] # only registered users can join (r)
ssl_only = [ mode_normal, 'S' ] # only SSL users can join (S)
strip_colors = [ mode_normal, 'c' ] # strip mIRC color codes from messages (c)
op_moderated = [ mode_normal, 'z' ] # send blocked messages to channel ops (z)
join_throttle = [ mode_pset, 'j' ] # limit join frequency N:T (j)
no_forward = [ mode_normal, 'Q' ] # do not forward users to this channel (Q)
large_banlist = [ mode_normal, 'L' ] # allow lots of entries on lists (L)
Format is [ letter, preix, weight, weight to set ]
. Higher weight has more
privileges. Weight 0
is the reference point which should always refer to a
normal channel op.
If the last element is omitted, then any user with weight greater than or equal to a given status mode can give/take that mode.
The default behavior is that admins can give/take admin, but halfops cannot give/take halfop. Only ops or higher can.
Note that anything less than -1 (halfop) cannot set/unset any status. This is because they cannot set any channel modes.
[ prefixes ]
owner = [ 'q', '~', 2 ] # channel owner (q)
admin = [ 'a', '&', 1 ] # channel administrator (a)
op = [ 'o', '@', 0 ] # channel operator (o)
halfop = [ 'h', '%', -1, 0 ] # channel half-operator (h)
voice = [ 'v', '+', -2 ] # voiced channel member (v)
Each entry to the [api]
block is a module name to load on start. This section
is here merely for demonstration; for a more up-to-date list of available
modules, see this document.
[ api ]
# Basic stuff
Core # Loads core commands, modes, etc.
Resolve # Resolve hostnames
Ident # Resolve user identities (ident protocol)
Cloak # Hostname cloaking
Alias # Support for command aliases
SASL # Support for SASL authentication (for services)
JELP # Juno Extensible Linking Protocol
#TS6 # TS6 linking protocol
# Channel features
Channel::Fantasy # Fantasy commands
Channel::Access # Access list mode (+A)
Channel::Invite # Invitation support (INVITE, +i, +I, +g)
Channel::Key # Key support (+k)
Channel::Limit # Member limit support (+l)
Channel::Secret # Secret/private channel support (+s/+p)
Channel::OperOnly # Oper-only channel support (+O)
Channel::Forward # Channel forward support (+f, +F)
Channel::Mute # Mute/quiet bans (+Z)
Channel::TopicAdditions # Commands to prepend or append topic
Channel::Permanent # Preserve empty channels, make permanent (+P)
Channel::RegisteredOnly # Registered only channel support (+r)
Channel::SSLOnly # SSL users only channel support (+S)
Channel::NoColor # Strip colors from messages (+c)
Channel::OpModerate # Sends blocked messages to chanops (+z)
Channel::ModeSync # Improves channel mode synchronization
Channel::JoinThrottle # Prevents channel join flooding (+j)
Channel::LargeList # Enable large ban lists (+L)
# Server management
Modules # Manage IRCd modules directly from IRC
Git # Manage IRCd git repository directly from IRC
#Configuration::Set # Manage IRCd configuration directly from IRC
Reload # Reload or upgrade the IRCd in 1 command
Grant # grant user oper flags from IRC
#Eval # Evaluate Perl code directly from IRC
# Global ban support
Ban::Dline # server/user IP ban (D-Line/Z-Line)
Ban::Kline # user hostmask ban (K-Line)
Ban::Resv # nick and channel reservations (required for services)
# Extras
Monitor # IRCv3 client availability notifications
DNSBL # Built-in host blacklist checking
#LOLCAT # SPEEK LIEK A LOLCATZ!
Limits and maximum lengths.
[ limit ]
connection = 100 # max local connections
# Maximum number of characters in:
nick = 32 # nicknames
topic = 1000 # channel topics
kickmsg = 300 # kick messages
channelname = 50 # channel names
away = 100 # away messages
key = 50 # channel keys
Connection classes are used for both users and servers.
Default classes are included in etc/class.conf
.
Example default class.
This is used as a base for all connections.
[ class: default ]
# Base class for all connections
max_perip = 3 # local connections per IP address
max_globalperip = 5 # global connections per IP address
max_client = 80 # users
Example user class.
It should have allows_users
which matches ident@host
masks. This is used for
all users.
[ class: users ]
# Base class for all users
extends = 'default' # inherit from default
allow_users = '*@*' # allow all users to fit this class
max_bytes_line = 2048 # bytes per line
max_lines_sec = 30 # lines per second
max_channel = 100 # channels a user can be in at once
max_monitor = 100 # monitor entries; off = unlimited
ping_freq = 30 # how often to send pings
ping_timeout = 120 # seconds with no pong to drop user
Example restricted user class.
This example allows users matching the given mask to have higher queue limits.
[ class: lanusers ]
# Example user class with increased limits, requiring a specified mask
# and password
extends = 'users' # inherit from users
allow_users = '*@192.168.*' # allow users on LAN
max_bytes_line = 4096 # increased limits
max_lines_sec = 60
# Password (for PASS command) and encryption (NOT YET SUPPORTED)
# Use ./juno mkpasswd to generated an encrypted password.
# Accepted crypts: sha1, sha224, sha256, sha384, sha512, md5, none
password = '13fbd79c3d390e5d6585a21e11ff5ec1970cff0c'
encryption = 'sha1'
Example server class.
It should have allows_servers
which matches server names. This is used for all
servers. As with users, you can define additional classes with more specific
server name masks.
[ class: servers ]
# Base class for all servers
extends = 'default' # inherit from default
allow_servers = '*' # allow all servers to fit this class
ping_freq = 20 # how often to send pings
ping_timeout = 300 # seconds with no pong to drop server
ping_warn = 60 # seconds to warn about pings
delta_max = 120 # max time delta in seconds
delta_warn = 30 # time delta to produce a warning
Example IRC operator class.
These should have the requires_oper
option present so that normal connections
can't match them. See oper flags and
oper notices for more up-to-date lists of available flags.
[ class: locop ]
requires_oper # only allow with OPER command
extends = 'users' # all oper classes extend users
# oper privs
priv_rehash # local rehash
priv_see_invisible # see invisible users
priv_see_hidden # see hidden servers
priv_see_hosts # see real hosts
priv_see_secret # see secret channels
priv_set_permanent # set permanent channels
priv_set_large_banlist # set large channel lists
priv_modesync # use MODESYNC command
priv_squit # disconnect local uplinks
priv_connect # connect local uplinks
priv_kill # kill local users
# server notices
noti_user_mode_unknown
noti_channel_mode_unknown
noti_perl_warning
noti_exception
noti_rehash
noti_rehash_success
noti_rehash_fail
noti_new_server
noti_server_closing
noti_server_quit
noti_server_burst
noti_server_endburst
noti_connect
noti_connect_attempt
noti_connect_fail
noti_connect_success
noti_squit
noti_server_reintroduced
noti_server_identifier_taken
noti_server_protocol_warning
noti_server_protocol_error
[ class: globop ]
# inherits everything from locop
# (even requires_oper and extends = 'users')
extends = 'locop'
priv_grehash # global rehash
priv_gsquit # global uplink disconnect
priv_gconnect # global uplink connect
priv_gkill # kill global users
priv_modules # MODLOAD, MODUNLOAD, MODRELOAD
priv_kline # set K-Lines
priv_dline # set D-Lines
priv_resv # set nick/channel reserves
priv_list_bans # view global bans
noti_kline
noti_kline_delete
noti_kline_expire
noti_dline
noti_dline_delete
noti_dline_expire
noti_resv
noti_resv_delete
noti_resv_expire
noti_module_load
noti_module_unload
noti_module_reload
noti_reload
noti_update
noti_update_fail
noti_grant
noti_ungrant
[ file ]
motd = 'etc/ircd.motd.example' # message of the day
log = 'var/log/ircd.log' # where to write logs
[ ssl ]
cert = 'etc/ssl/cert.pem'
key = 'etc/ssl/key.pem'
[ admin ]
line1 = 'John Doe'
line2 = 'Server administrator'
email = 'admin@example.com'
[ servers ]
ping_freq = 20 # how often to send pings
ping_timeout = 300 # seconds with no pong to drop server
ping_warn = 60 # seconds to warn about pings
delta_max = 120 # max time delta in seconds
delta_warn = 30 # time delta to produce a warning
allow_hidden = on # allow servers to hide themselves
[ users ]
automodes = '+ix' # set these modes on users at connect
chghost_quit = on # quit and rejoin on host change
allow_uid_nick = on # allow NICK 0 command
notify_uid = off # send UID to users on connect
ping_freq = 30 # how often to send pings
ping_timeout = 120 # seconds with no pong to drop user
[ channels ]
automodes = '+ntqo +user +user' # set these modes as users enter channel
invite_must_exist = off # restrict INVITE to existing channels
only_ops_invite = off # restrict INVITE to chanops
resv_force_part = on # force users to part RESV'd channels
client_max_modes_simple = 46 # max simple mode count per msg
client_max_mode_params = 10 # max mode params per msg, MODES in RPL_ISUPPORT
max_modes_per_line = 5 # max modes per outgoing MODE message
max_modes_per_server_line = 10 # same as above, except for servers
max_param_length = 50 # number of characters permitted for parameters
max_ban_length = 195 # number of characters permitted for a ban
max_bans = 100 # number of bans permitted per channel
max_bans_large = 500 # number of bans permitted with Channel::LargeList (+L)
The commands present here are valid for use as fantasy commands. Commands that are not available to the server are quietly ignored. This is omitted from the example configuration.
[ channels: fantasy ]
kick
topic
part
names
modelist
up # any of these fantasy commands can be
down # disabled from the normal conf with:
topicprepend # [ channels: fantasy ]
topicappend # <command> = off
mode
eval
lolcat
[ services ]
nickserv = 'NickServ' # nickname of nick service. used with TS6
saslserv = 'SaslServ' # nickname of SASL service. used by SASL
saslserv_allow_reauthentication = on # allow reauthentication?
saslserv_max_failures = 3 # SASL failures before dropping
[listen]
blocks are named by the host to listen on.
Examples below include dedicated ports for linking protocols. This is required for all linking protocols except for JELP, which may share ports with the client protocol.
# all IPv4 hosts
[ listen: 0.0.0.0 ]
port = [6667..6669, 7000] # unsecured listening ports
sslport = [6697] # secure ports
ts6port = [7001] # proto-specific port
ts6sslport = [7002] # proto-specific SSL port
# all IPv6 hosts
[ listen: :: ]
port = [6667..6669, 7000] # unsecured listening ports
sslport = [6697] # secure ports
[connect]
blocks are named by the server name.
[ connect: server2.example.com ]
# Address(es) to accept connection from.
# MUST be IP addresses, not hostnames.
# Wildcards are accepted. Any number of address allowed.
address = ['192.168.1.\*', '127.0.0.1']
# Outgoing port. If initiating a connection, the server will try this port.
# Currently, this option does not affect incoming connections.
port = 7000
# Enable SSL connection? If so, be sure that the above port is an SSL listen
# port and that the other server has SSL configured properly. This setting
# is only applicable to outgoing connections which this server initiates.
ssl = on
# Plain text outgoing password
send_password = 'k'
# Incoming password and the encryption for it.
# Accepted crypts: sha1, sha224, sha256, sha384, sha512, md5, none
receive_password = '13fbd79c3d390e5d6585a21e11ff5ec1970cff0c'
encryption = 'sha1'
# Auto connect on startup. Note that this only applies to when the server
# is first started. To reconnect dropped connections, see auto_timer.
#autoconnect
# Reconnect timer. If connection drops, try again every x seconds.
# Uncomment below if you wish to enable this feature.
#auto_timer = 30
[oper]
blocks are named by the oper name used with the OPER
command.
[ oper: admin ]
# Operator class (optional).
# If present, the oper will receive flags and notices defined in this class
# and all other classes from which it may inherit.
class = 'netadmin'
# Hostmask(s) to accept for opering.
# These can include either hostnames or IP addresses.
# Multiple values accepted. Wildcards accepted.
host = ['*@*']
# The password and encryption for it
password = '13fbd79c3d390e5d6585a21e11ff5ec1970cff0c'
encryption = 'sha1'
# Flags (optional).
# Oper flags which are specific to this oper. These will be granted in
# conjunction with any others that might exist from oper classes.
# Multiple flags accepted. Wildcards NOT accepted.
# See doc/oper_flags.md. 'all' matches all flags.
flags = ['all']
# Oper notice flags (optional).
# Notice flags which are specific to this oper. These will be granted in
# conjunction with any others that might exist from oper classes.
# Multiple flags accepted. Wildcards not accepted. 'all' matches all flags.
notices = ['all']
See above for IRC operator classes.
Requires Alias module.
$N
will be replaced with the Nth parameter;$N-
will be replaced with the Nth parameter and all which follow it.
The default ones here may be outdated; see the default configuration for up-to-date info.
[ aliases ]
nickserv = 'PRIVMSG NickServ $1-'
chanserv = 'PRIVMSG ChanServ $1-'
operserv = 'PRIVMSG OperServ $1-'
botserv = 'PRIVMSG BotServ $1-'
groupserv = 'PRIVMSG GroupServ $1-'
ns = 'PRIVMSG NickServ $1-'
cs = 'PRIVMSG ChanServ $1-'
os = 'PRIVMSG OperServ $1-'
bs = 'PRIVMSG BotServ $1-'
gs = 'PRIVMSG GroupServ $1-'
Requires DNSBL module.
[ dnsbl: EFnetRBL ]
host = "rbl.efnetrbl.org"
ipv4 = on
ipv6 = off
timeout = 3
duration = '1d'
reason = "Your host is listed on EFnet RBL. See http://efnetrbl.org/?i=%ip"
[ dnsbl: DroneBL ]
host = "dnsbl.dronebl.org"
ipv4 = on
ipv6 = on
timeout = 3
duration = '1d'
reason = "Your host is listed on DroneBL. See http://dronebl.org/lookup?ip=%ip"
[ dnsbl: dan.me.uk ]
host = "tor.dan.me.uk"
ipv4 = on
ipv6 = off
timeout = 3
matches = [100]
duration = '1d'
reason = "Your host is listed as a Tor node."
These are used for linking with many types of servers. Generally you do not need this in your configuration, unless you intend to link juno with a server that is not supported by default.
[ ircd: fakeIRCd ]
fakeircd_based = on # for all ircds, you should include a $NAME_based
# key so that this can be used as a last resort
# guess for whether a certain feature is supported
extends = 'charybdis' # optionally specify another IRCd definition to
# inherit options from
nicklen = 31 # max nick length
no_host_slashes = off # '/' not permitted in hosts
truncate_hosts = 63 # truncate hosts to this length
burst_topicwho = on # in TS6, include the 'setby' param in TB command
[ ircd_umodes: fakeIRCd ]
# user modes in the same format as in [ modes: user ]
service = 'S' # network service (S)
ssl = 'Z' # using SSL (Z)
deaf = 'D' # does not receive channel messages (D)
admin = 'a' # server administrator (a)
wallops = 'w' # receives wallops (w)
cloak = 'x' # or 'h'! # cloaking is enabled (x)
[ ircd_cmodes: fakeIRCd ]
# channel modes in the same format as [ modes: channel ]
mute = [ mode_list, 'q' ] # channel mute ban (q)
free_invite = [ mode_normal, 'g' ] # you do not need op to invite (g)
forward = [ mode_pset, 'f' ] # forward users if they cannot enter (f)
free_forward = [ mode_normal, 'F' ] # you do not need op in forwad channel (F)
oper_only = [ mode_normal, 'O' ] # you need to be an ircop to join (O)
join_throttle = [ mode_pset, 'j' ] # limit join frequency N:T (j)
large_banlist = [ mode_normal, 'L' ] # allow lots of entries on lists (L)
permanent = [ mode_normal, 'P' ] # do not destroy channel when empty (P)
no_forward = [ mode_normal, 'Q' ] # do not forward users to this channel (Q)
strip_colors = [ mode_normal, 'c' ] # strip mIRC color codes from messages (c)
op_moderated = [ mode_normal, 'z' ] # send blocked messages to channel ops (z)
[ ircd_prefixes: elemental ]
# channel prefixes in the same format as [ prefixes ]
owner = [ 'y', '~', 2 ] # channel owner (y)
admin = [ 'a', '!', 1 ] # channel administrator (a)
op = [ 'o', '@', 0 ] # channel operator (o)
halfop = [ 'h', '%', -1 ] # channel half-operator (h)
voice = [ 'v', '+', -2 ] # voiced channel member (v)