Compare commits

...

No commits in common. "e344e7351ce54462f686461524a4a8eae7d6dd37" and "f5123f26957ef72a08e2e699c63dece366b804ee" have entirely different histories.

19 changed files with 1222 additions and 1720 deletions

1
.gitignore vendored
View File

@ -1,2 +1 @@
include.conf
config.env

View File

@ -6,59 +6,48 @@ ARG BUILD_SERVER_NAME="services.lame-network.local"
RUN apt -y update
RUN apt -y install coreutils cmake perl git automake autoconf build-essential libpcre2-dev rapidjson-dev libcurl4-gnutls-dev libargon2-dev libmaxminddb-dev libldap2-dev rapidjson-dev libmysqlclient-dev libmysqlclient-dev default-libmysqlclient-dev libpq-dev libre2-dev gnutls-dev libsqlite3-dev libmbedtls-dev libqrencode-dev libpcre3-dev libtre-dev pkg-config libwww-perl libidn-dev libpasswdqc-dev libcrack2-dev libperl-dev libsodium-dev cracklib-runtime libcrypt-cracklib-perl sendmail
RUN apt -y install coreutils perl git automake autoconf build-essential libpcre2-dev rapidjson-dev libcurl4-gnutls-dev libargon2-dev libmaxminddb-dev libldap2-dev rapidjson-dev libmysqlclient-dev libmysqlclient-dev default-libmysqlclient-dev libpq-dev libre2-dev gnutls-dev libsqlite3-dev libmbedtls-dev libqrencode-dev libpcre3-dev libtre-dev pkg-config libwww-perl libidn-dev libpasswdqc-dev libcrack2-dev libperl-dev libsodium-dev cracklib-runtime libcrypt-cracklib-perl sendmail gettext
RUN groupadd anope
RUN groupadd atheme
RUN useradd --system --shell /bin/bash anope -g anope
RUN useradd --system --shell /bin/bash atheme -g atheme
WORKDIR /tmp
RUN git clone https://github.com/anope/anope.git
RUN git clone https://github.com/atheme/atheme.git -b master
WORKDIR /tmp/anope
WORKDIR /tmp/atheme
#RUN git checkout 2.1
RUN git submodule update --init --recursive
#RUN git reset --hard 240f8b9e505af4888039769f5ce5a2388bdf228e
WORKDIR /tmp/anope/modules
RUN ls -1 extra/*.cpp | xargs -i ln -s {}
WORKDIR /tmp/anope
RUN cmake -DINSTDIR:STRING=/usr/local -DRUNGROUP:STRING=anope -DDEFUMASK:STRING=007 -DCMAKE_BUILD_TYPE:STRING=RELEASE -B /tmp/anope/build /tmp/anope
WORKDIR /tmp/anope/build
RUN ./configure --prefix=/usr/local --enable-large-net --enable-contrib --enable-legacy-pwcrypto --with-idn
RUN make -j$(nproc)
RUN make install
RUN mkdir -p /etc/anope -p /etc/ssl/anope -p /var/log/anope -p /var/lib/anope
RUN mkdir -p /etc/atheme -p /etc/ssl/atheme -p /var/log/atheme
ADD anope.conf /etc/anope
RUN mv /usr/local/etc /usr/local/etc_old
ADD include.default.conf /etc/anope/include.conf
RUN ln -sf /etc/atheme /usr/local/etc
RUN openssl genrsa -out /etc/ssl/anope/server.key
ADD data/atheme.conf /etc/atheme
RUN openssl req -new -key /etc/ssl/anope/server.key -out /etc/ssl/anope/server.csr \
-subj "/C=US/ST=Washington/L=Seattle/O=LameNetwork/OU=IT Department/CN=$BUILD_SERVER_NAME"
ADD data/include.default.conf /etc/atheme/include.conf
RUN openssl x509 -req -days 365 -in /etc/ssl/anope/server.csr -signkey /etc/ssl/anope/server.key -out /etc/ssl/anope/server.crt
RUN chown -R anope:anope /etc/anope /etc/ssl/anope /var/log/anope /var/lib/anope
RUN chown -R atheme:atheme /etc/atheme /etc/ssl/atheme /var/log/atheme
WORKDIR /
VOLUME /var/lib/anope
RUN rm -rf /tmp/atheme
VOLUME /etc/ssl/anope
USER atheme
VOLUME /var/log/anope
RUN /usr/local/bin/atheme-services -b ; true
USER anope
VOLUME /etc/atheme
ENTRYPOINT ["/usr/local/bin/anope", "--nofork", "--confdir=/etc/anope/", "--dbdir=/etc/anope/custom/", "--logdir=/var/log/anope/", "--moduledir=/usr/local/modules/"]
VOLUME /var/log/atheme
ENTRYPOINT ["/usr/local/bin/atheme-services", "-p", "/tmp/atheme.pid", "-n"]

View File

@ -1,2 +1,27 @@
- Copy `config.env.example` to `config.env` and `include.default.conf` to `include.conf` and edit both
- `chown -R 999 custom` and `docker-compose up -d`
# Instructions
## Remote with TLS
since atheme doesn't support TLS uplinks, (https://github.com/atheme/atheme/issues/265) stunnel has to be used for remote TLS
encryption (this assumes stunnel is running on the hub already):
- `cd stunnel/`
- Copy `stunnel.conf.example` to `stunnel.conf` then edit
- retrieve certificates from CA `see inspircd hub CA setup with easyrsa3`, place `ca.crt` in `ssl/`
- `docker-compose up -d`
## docker-compose
- Copy `config.env.example` to `config.env` and edit
- Copy `data/include.default.conf` to `data/include.conf` and edit
- `docker-compose build`
- `docker-compose up -d`
## Administration
- To enable debugging add `-d` to `DAEMON_FLAGS` in `config.env`
- `docker-compose up -d`
- `docker logs -f atheme-atheme-1`
### Anope migration
See `tools/` for `anope2atheme.php`. YMMV
### Resetting passwords
- `/oper`
- `/msg nickserv resetpass <nick>` this gives a temporary password for the user
- as the user: `/msg nickserv identify <temporary password` then `/msg nickserv set password <new password>`

1572
anope.conf

File diff suppressed because it is too large Load Diff

View File

@ -1 +1,2 @@
SERVER_NAME="services.lame-network.local"
DAEMON_FLAGS=""
SERVER_NAME="services.supernets.org"

1
custom/.gitignore vendored
View File

@ -1 +0,0 @@
*

2
data/.gitignore vendored Executable file
View File

@ -0,0 +1,2 @@
services.*
include.conf

598
data/atheme.conf Executable file
View File

@ -0,0 +1,598 @@
# loadmodule "/usr/local/modules/security/cmdperm"; https://github.com/atheme/atheme/issues/937
loadmodule "/usr/local/modules/protocol/inspircd";
# loadmodule "/usr/local/modules/protocol/mixin_nohalfops";
# loadmodule "/usr/local/modules/protocol/mixin_noholdnick";
# loadmodule "/usr/local/modules/protocol/mixin_noprotect";
# loadmodule "/usr/local/modules/protocol/mixin_noowner";
loadmodule "/usr/local/modules/backend/opensex";
loadmodule "/usr/local/modules/crypto/argon2";
loadmodule "/usr/local/modules/crypto/scrypt";
# loadmodule "/usr/local/modules/crypto/pbkdf2v2";
loadmodule "/usr/local/modules/crypto/bcrypt";
# loadmodule "/usr/local/modules/crypto/pbkdf2";
# loadmodule "/usr/local/modules/crypto/crypt3-sha2-512";
# loadmodule "/usr/local/modules/crypto/crypt3-sha2-256";
# loadmodule "/usr/local/modules/crypto/crypt3-md5";
loadmodule "/usr/local/modules/crypto/rawsha2-512";
loadmodule "/usr/local/modules/crypto/rawsha2-256";
loadmodule "/usr/local/modules/crypto/anope-enc-sha256";
loadmodule "/usr/local/modules/crypto/rawsha1";
loadmodule "/usr/local/modules/crypto/rawmd5";
loadmodule "/usr/local/modules/crypto/ircservices";
# loadmodule "/usr/local/modules/crypto/crypt3-des";
loadmodule "/usr/local/modules/crypto/base64";
# loadmodule "/usr/local/modules/auth/ldap";
loadmodule "/usr/local/modules/nickserv/main";
loadmodule "/usr/local/modules/nickserv/access";
loadmodule "/usr/local/modules/nickserv/badmail";
loadmodule "/usr/local/modules/nickserv/cert";
loadmodule "/usr/local/modules/nickserv/drop";
loadmodule "/usr/local/modules/nickserv/enforce";
loadmodule "/usr/local/modules/nickserv/ghost";
loadmodule "/usr/local/modules/nickserv/group";
loadmodule "/usr/local/modules/nickserv/help";
loadmodule "/usr/local/modules/nickserv/hold";
loadmodule "/usr/local/modules/nickserv/identify";
loadmodule "/usr/local/modules/nickserv/info";
loadmodule "/usr/local/modules/nickserv/info_lastquit";
loadmodule "/usr/local/modules/nickserv/list";
loadmodule "/usr/local/modules/nickserv/listlogins";
loadmodule "/usr/local/modules/nickserv/listmail";
loadmodule "/usr/local/modules/nickserv/listownmail";
loadmodule "/usr/local/modules/nickserv/login";
loadmodule "/usr/local/modules/nickserv/loginnolimit";
loadmodule "/usr/local/modules/nickserv/logout";
loadmodule "/usr/local/modules/nickserv/mark";
loadmodule "/usr/local/modules/nickserv/pwquality";
loadmodule "/usr/local/modules/nickserv/freeze";
loadmodule "/usr/local/modules/nickserv/listchans";
loadmodule "/usr/local/modules/nickserv/listgroups";
loadmodule "/usr/local/modules/nickserv/register";
loadmodule "/usr/local/modules/nickserv/regnolimit";
loadmodule "/usr/local/modules/nickserv/resetpass";
loadmodule "/usr/local/modules/nickserv/restrict";
loadmodule "/usr/local/modules/nickserv/return";
loadmodule "/usr/local/modules/nickserv/setpass";
loadmodule "/usr/local/modules/nickserv/sendpass";
# loadmodule "/usr/local/modules/nickserv/sendpass_user";
loadmodule "/usr/local/modules/nickserv/set_accountname";
loadmodule "/usr/local/modules/nickserv/set_badpasswdmsg";
loadmodule "/usr/local/modules/nickserv/set_email";
loadmodule "/usr/local/modules/nickserv/set_emailmemos";
loadmodule "/usr/local/modules/nickserv/set_enforcetime";
loadmodule "/usr/local/modules/nickserv/set_hidemail";
# loadmodule "/usr/local/modules/nickserv/set_language";
loadmodule "/usr/local/modules/nickserv/set_nevergroup";
loadmodule "/usr/local/modules/nickserv/set_neverop";
loadmodule "/usr/local/modules/nickserv/set_nogreet";
loadmodule "/usr/local/modules/nickserv/set_nomemo";
loadmodule "/usr/local/modules/nickserv/set_noop";
loadmodule "/usr/local/modules/nickserv/set_nopassword";
loadmodule "/usr/local/modules/nickserv/set_password";
loadmodule "/usr/local/modules/nickserv/set_privmsg";
loadmodule "/usr/local/modules/nickserv/set_private";
loadmodule "/usr/local/modules/nickserv/set_property";
loadmodule "/usr/local/modules/nickserv/set_pubkey";
loadmodule "/usr/local/modules/nickserv/set_quietchg";
loadmodule "/usr/local/modules/nickserv/status";
loadmodule "/usr/local/modules/nickserv/taxonomy";
loadmodule "/usr/local/modules/nickserv/vacation";
loadmodule "/usr/local/modules/nickserv/verify";
loadmodule "/usr/local/modules/nickserv/vhost";
loadmodule "/usr/local/modules/nickserv/waitreg";
loadmodule "/usr/local/modules/chanserv/main";
loadmodule "/usr/local/modules/chanserv/access";
loadmodule "/usr/local/modules/chanserv/akick";
loadmodule "/usr/local/modules/chanserv/ban";
# loadmodule "/usr/local/modules/chanserv/unban_self";
loadmodule "/usr/local/modules/chanserv/bansearch";
loadmodule "/usr/local/modules/chanserv/clone";
loadmodule "/usr/local/modules/chanserv/close";
loadmodule "/usr/local/modules/chanserv/clear";
loadmodule "/usr/local/modules/chanserv/clear_akicks";
loadmodule "/usr/local/modules/chanserv/clear_bans";
loadmodule "/usr/local/modules/chanserv/clear_flags";
loadmodule "/usr/local/modules/chanserv/clear_users";
loadmodule "/usr/local/modules/chanserv/count";
loadmodule "/usr/local/modules/chanserv/drop";
loadmodule "/usr/local/modules/chanserv/fflags";
loadmodule "/usr/local/modules/chanserv/flags";
loadmodule "/usr/local/modules/chanserv/ftransfer";
loadmodule "/usr/local/modules/chanserv/getkey";
loadmodule "/usr/local/modules/chanserv/halfop";
loadmodule "/usr/local/modules/chanserv/help";
loadmodule "/usr/local/modules/chanserv/hold";
loadmodule "/usr/local/modules/chanserv/info";
loadmodule "/usr/local/modules/chanserv/invite";
loadmodule "/usr/local/modules/chanserv/kick";
loadmodule "/usr/local/modules/chanserv/list";
loadmodule "/usr/local/modules/chanserv/mark";
loadmodule "/usr/local/modules/chanserv/moderate";
loadmodule "/usr/local/modules/chanserv/op";
loadmodule "/usr/local/modules/chanserv/owner";
loadmodule "/usr/local/modules/chanserv/protect";
loadmodule "/usr/local/modules/chanserv/quiet";
loadmodule "/usr/local/modules/chanserv/recover";
loadmodule "/usr/local/modules/chanserv/register";
loadmodule "/usr/local/modules/chanserv/set_email";
loadmodule "/usr/local/modules/chanserv/set_entrymsg";
loadmodule "/usr/local/modules/chanserv/set_fantasy";
loadmodule "/usr/local/modules/chanserv/set_gameserv";
loadmodule "/usr/local/modules/chanserv/set_guard";
loadmodule "/usr/local/modules/chanserv/set_keeptopic";
loadmodule "/usr/local/modules/chanserv/set_limitflags";
loadmodule "/usr/local/modules/chanserv/set_mlock";
loadmodule "/usr/local/modules/chanserv/set_prefix";
loadmodule "/usr/local/modules/chanserv/set_private";
loadmodule "/usr/local/modules/chanserv/set_property";
loadmodule "/usr/local/modules/chanserv/set_pubacl";
loadmodule "/usr/local/modules/chanserv/set_restricted";
loadmodule "/usr/local/modules/chanserv/set_secure";
loadmodule "/usr/local/modules/chanserv/set_topiclock";
loadmodule "/usr/local/modules/chanserv/set_url";
loadmodule "/usr/local/modules/chanserv/set_verbose";
loadmodule "/usr/local/modules/chanserv/status";
loadmodule "/usr/local/modules/chanserv/sync";
loadmodule "/usr/local/modules/chanserv/successor_acl";
loadmodule "/usr/local/modules/chanserv/taxonomy";
loadmodule "/usr/local/modules/chanserv/template";
loadmodule "/usr/local/modules/chanserv/topic";
loadmodule "/usr/local/modules/chanserv/voice";
loadmodule "/usr/local/modules/chanserv/why";
loadmodule "/usr/local/modules/chanserv/xop";
loadmodule "/usr/local/modules/chanserv/antiflood";
loadmodule "/usr/local/modules/chanfix/main";
loadmodule "/usr/local/modules/operserv/akill";
loadmodule "/usr/local/modules/operserv/clearchan";
loadmodule "/usr/local/modules/operserv/clones";
loadmodule "/usr/local/modules/operserv/compare";
loadmodule "/usr/local/modules/operserv/genhash";
loadmodule "/usr/local/modules/operserv/greplog";
loadmodule "/usr/local/modules/operserv/help";
loadmodule "/usr/local/modules/operserv/identify";
loadmodule "/usr/local/modules/operserv/ignore";
loadmodule "/usr/local/modules/operserv/info";
loadmodule "/usr/local/modules/operserv/joinrate";
loadmodule "/usr/local/modules/operserv/jupe";
loadmodule "/usr/local/modules/operserv/mode";
loadmodule "/usr/local/modules/operserv/modlist";
loadmodule "/usr/local/modules/operserv/modmanager";
loadmodule "/usr/local/modules/operserv/noop";
loadmodule "/usr/local/modules/operserv/rakill";
loadmodule "/usr/local/modules/operserv/readonly";
loadmodule "/usr/local/modules/operserv/rehash";
loadmodule "/usr/local/modules/operserv/restart";
loadmodule "/usr/local/modules/operserv/rmatch";
loadmodule "/usr/local/modules/operserv/rnc";
loadmodule "/usr/local/modules/operserv/rwatch";
# loadmodule "/usr/local/modules/operserv/set";
# loadmodule "/usr/local/modules/operserv/sgline";
loadmodule "/usr/local/modules/operserv/shutdown";
loadmodule "/usr/local/modules/operserv/soper";
loadmodule "/usr/local/modules/operserv/specs";
loadmodule "/usr/local/modules/operserv/sqline";
loadmodule "/usr/local/modules/operserv/update";
loadmodule "/usr/local/modules/operserv/uptime";
loadmodule "/usr/local/modules/memoserv/help";
loadmodule "/usr/local/modules/memoserv/send";
loadmodule "/usr/local/modules/memoserv/sendops";
loadmodule "/usr/local/modules/memoserv/sendgroup";
loadmodule "/usr/local/modules/memoserv/list";
loadmodule "/usr/local/modules/memoserv/read";
loadmodule "/usr/local/modules/memoserv/forward";
loadmodule "/usr/local/modules/memoserv/delete";
loadmodule "/usr/local/modules/memoserv/ignore";
loadmodule "/usr/local/modules/global/main";
loadmodule "/usr/local/modules/infoserv/main";
loadmodule "/usr/local/modules/saslserv/authcookie";
loadmodule "/usr/local/modules/saslserv/ecdh-x25519-challenge";
loadmodule "/usr/local/modules/saslserv/ecdsa-nist256p-challenge";
loadmodule "/usr/local/modules/saslserv/external";
loadmodule "/usr/local/modules/saslserv/plain";
# loadmodule "/usr/local/modules/saslserv/scram";
loadmodule "/usr/local/modules/gameserv/dice";
loadmodule "/usr/local/modules/gameserv/eightball";
loadmodule "/usr/local/modules/gameserv/gamecalc";
loadmodule "/usr/local/modules/gameserv/help";
loadmodule "/usr/local/modules/gameserv/lottery";
loadmodule "/usr/local/modules/gameserv/namegen";
loadmodule "/usr/local/modules/gameserv/rps";
loadmodule "/usr/local/modules/rpgserv/enable";
loadmodule "/usr/local/modules/rpgserv/help";
loadmodule "/usr/local/modules/rpgserv/info";
loadmodule "/usr/local/modules/rpgserv/list";
loadmodule "/usr/local/modules/rpgserv/search";
loadmodule "/usr/local/modules/rpgserv/set";
loadmodule "/usr/local/modules/botserv/main";
loadmodule "/usr/local/modules/botserv/help";
loadmodule "/usr/local/modules/botserv/info";
loadmodule "/usr/local/modules/botserv/bottalk";
loadmodule "/usr/local/modules/botserv/set_fantasy";
loadmodule "/usr/local/modules/botserv/set_nobot";
loadmodule "/usr/local/modules/botserv/set_private";
loadmodule "/usr/local/modules/botserv/set_saycaller";
loadmodule "/usr/local/modules/hostserv/help";
loadmodule "/usr/local/modules/hostserv/onoff";
loadmodule "/usr/local/modules/hostserv/offer";
loadmodule "/usr/local/modules/hostserv/request";
loadmodule "/usr/local/modules/hostserv/vhost";
loadmodule "/usr/local/modules/hostserv/vhostnick";
loadmodule "/usr/local/modules/hostserv/group";
loadmodule "/usr/local/modules/hostserv/drop";
loadmodule "/usr/local/modules/helpserv/helpme";
loadmodule "/usr/local/modules/helpserv/ticket";
loadmodule "/usr/local/modules/helpserv/services";
loadmodule "/usr/local/modules/alis/main";
loadmodule "/usr/local/modules/statserv/channel";
loadmodule "/usr/local/modules/statserv/netsplit";
loadmodule "/usr/local/modules/statserv/server";
loadmodule "/usr/local/modules/groupserv/main";
loadmodule "/usr/local/modules/groupserv/acsnolimit";
loadmodule "/usr/local/modules/groupserv/drop";
loadmodule "/usr/local/modules/groupserv/fflags";
loadmodule "/usr/local/modules/groupserv/flags";
loadmodule "/usr/local/modules/groupserv/help";
loadmodule "/usr/local/modules/groupserv/info";
loadmodule "/usr/local/modules/groupserv/join";
loadmodule "/usr/local/modules/groupserv/list";
loadmodule "/usr/local/modules/groupserv/listchans";
loadmodule "/usr/local/modules/groupserv/register";
loadmodule "/usr/local/modules/groupserv/regnolimit";
loadmodule "/usr/local/modules/groupserv/invite";
loadmodule "/usr/local/modules/groupserv/set";
loadmodule "/usr/local/modules/groupserv/set_channel";
loadmodule "/usr/local/modules/groupserv/set_description";
loadmodule "/usr/local/modules/groupserv/set_email";
loadmodule "/usr/local/modules/groupserv/set_groupname";
loadmodule "/usr/local/modules/groupserv/set_joinflags";
loadmodule "/usr/local/modules/groupserv/set_open";
loadmodule "/usr/local/modules/groupserv/set_public";
loadmodule "/usr/local/modules/groupserv/set_url";
loadmodule "/usr/local/modules/misc/httpd";
loadmodule "/usr/local/modules/misc/login_throttling";
loadmodule "/usr/local/modules/transport/xmlrpc";
loadmodule "/usr/local/modules/exttarget/oper";
loadmodule "/usr/local/modules/exttarget/registered";
loadmodule "/usr/local/modules/exttarget/channel";
loadmodule "/usr/local/modules/exttarget/chanacs";
loadmodule "/usr/local/modules/exttarget/server";
loadmodule "/usr/local/modules/proxyscan/dnsbl";
include "/usr/local/etc/include.conf";
crypto {
argon2_type = "argon2id";
argon2_memcost = 16;
argon2_timecost = 3;
argon2_threads = 1;
argon2_saltlen = 16;
argon2_hashlen = 64;
scrypt_memlimit = 14;
scrypt_opslimit = 524288;
# pbkdf2v2_digest = "SHA256";
# pbkdf2v2_rounds = 64000;
# pbkdf2v2_saltlen = 32;
# scram_mechanisms = "SCRAM-SHA-1,SCRAM-SHA-256";
bcrypt_cost = 7;
# crypt3_sha2_256_rounds = 5000;
# crypt3_sha2_512_rounds = 5000;
};
nickserv {
nick = "NICKSERV";
user = "_";
host = "services/SuperNETs";
real = "Nickname Services";
# spam;
# no_nick_ownership;
maxnicks = 8;
expire = 0;
# enforce_expire = 14;
enforce_delay = 32;
enforce_prefix = "`";
waitreg_time = 4;
pwquality_warn_only;
show_custom_metadata;
shorthelp = "";
listownmail_canon;
bad_password_message;
};
chanserv {
nick = "CHANSERV";
user = "_";
host = "services/SuperNETs";
real = "Channel Services";
aliases {
};
access {
};
reggroup = "!Services-Team";
maxchans = 5;
fantasy;
hide_xop;
hide_flags_akicks;
hide_pubacl_akicks;
templates {
vop = "+AV";
hop = "+AHehitrv";
aop = "+AOehiortv";
sop = "+AOaefhiorstv";
founder = "+AFORaefhioqrstv";
member = "+Ai";
op = "+AOiortv";
};
deftemplates = "MEMBER=+Ai OP=+AOeiortv";
changets;
trigger = "!";
expire = 30;
maxchanacs = 0;
maxfounders = 4;
founder_flags = "AFORefiorstv";
default_mlock = "+nt";
akick_time = 10;
antiflood_enforce_method = quiet;
show_custom_metadata;
shorthelp = "";
};
chanfix {
nick = "CHANFIX";
user = "_";
host = "services/SuperNETs";
real = "Channel Fixing Service";
aliases {
};
access {
};
autofix;
};
global {
nick = "GLOBAL";
user = "_";
host = "services/SuperNETs";
real = "Network Announcements";
aliases {
};
access {
};
};
infoserv {
nick = "INFOSERV";
user = "_";
host = "services/SuperNETs";
real = "Information Service";
aliases {
};
access {
};
logoninfo_count = 4;
logoninfo_reverse;
logoninfo_show_metadata;
};
operserv {
nick = "OPERSERV";
user = "_";
host = "services/SuperNETs";
real = "Operator Services";
aliases {
};
access {
};
modinspect_use_colors;
};
saslserv {
nick = "SASLSERV";
user = "_";
host = "services/SuperNETs";
real = "SASL Authentication Agent";
hide_server_names;
};
memoserv {
nick = "MEMOSERV";
user = "_";
host = "services/SuperNETs";
real = "Memo Services";
aliases {
};
access {
};
maxmemos = 64;
};
gameserv {
nick = "GAMESERV";
user = "_";
host = "services/SuperNETs";
real = "Game Services";
aliases {
};
access {
};
};
rpgserv {
nick = "RPGSERV";
user = "_";
host = "services/SuperNETs";
real = "RPG Finding Services";
aliases {
};
access {
};
};
botserv {
nick = "BOTSERV";
user = "_";
host = "services/SuperNETs";
real = "Bot Services";
aliases {
};
access {
};
min_users = 0;
};
groupserv {
nick = "GROUPSERV";
user = "_";
host = "services/SuperNETs";
real = "Group Management Services";
aliases {
};
access {
};
maxgroups = 16;
maxgroupacs = 256;
enable_open_groups;
join_flags = "+";
};
hostserv {
nick = "HOSTSERV";
user = "_";
host = "services/SuperNETs";
real = "Host Management Services";
aliases {
"APPROVE" = "ACTIVATE";
"DENY" = "REJECT";
};
access {
};
reggroup = "!Services-Team";
no_subsequent_requests;
request_per_nick;
};
helpserv {
nick = "HELPSERV";
user = "_";
host = "services/SuperNETs";
real = "Help Services";
aliases {
};
access {
};
};
statserv {
nick = "STATSERV";
user = "_";
host = "services/SuperNETs";
real = "Statistics Services";
aliases {
};
access {
};
};
alis {
nick = "ALIS";
user = "_";
host = "services/SuperNETs";
real = "Channel Directory";
aliases {
};
access {
};
maxmatches = 128;
};
proxyscan {
nick = "PROXYSCAN";
user = "_";
host = "services/SuperNETs";
real = "Proxyscan Service";
aliases {
};
access {
};
blacklists {
"dnsbl.dronebl.org";
"rbl.efnetrbl.org";
"tor.efnet.org";
};
dnsbl_action = snoop;
};
httpd {
host = "127.0.0.1";
# host = "::";
www_root = "/var/www";
port = 8080;
};
throttle {
address_burst = 5;
address_replenish = 1;
address_account_burst = 2;
address_account_replenish = 2;
};
logfile "/var/log/atheme/account.log" { register; set; };
logfile "/var/log/atheme/commands.log" { commands; };
logfile "/var/log/atheme/audit.log" { denycmd; };
logfile "#services" { admin; denycmd; error; info; register; request; };
logfile "!snotices" { denycmd; error; info; request; };
operclass "user" { };
operclass "ircop" {
privs {
special:ircop;
};
privs {
user:auspex;
user:admin;
user:sendpass;
user:vhost;
user:mark;
};
privs {
chan:auspex;
chan:admin;
chan:cmodes;
chan:joinstaffonly;
};
privs {
general:auspex;
general:helper;
general:viewprivs;
general:flood;
};
privs {
operserv:omode;
operserv:akill;
operserv:jupe;
operserv:global;
};
privs {
group:auspex;
group:admin;
};
};
operclass "sra" {
extends "ircop";
privs {
user:exceedlimits;
user:hold;
user:regnolimit;
};
privs {
general:metadata;
general:admin;
};
privs {
operserv:massakill;
operserv:akill-anymask;
operserv:noop;
operserv:grant;
};
# needoper;
};

72
data/include.default.conf Executable file
View File

@ -0,0 +1,72 @@
serverinfo {
name = "services.supernets.org";
desc = "IRC Services";
numeric = "10X";
recontime = 4;
netname = "SuperNETs";
hidehostsuffix = "hidden";
adminname = "admin";
adminemail = "no-reply@supernets.org";
registeremail = "no-reply@supernets.org";
# hidden;
# mta = "/usr/sbin/sendmail";
loglevel = { admin; error; info; network; wallops; };
maxcertfp = 8;
maxlogins = 8;
maxusers = 8;
mdlimit = 64;
emaillimit = 8;
emailtime = 256;
auth = none;
casemapping = rfc1459;
};
uplink "hub.supernets.org" {
host = "127.0.0.1";
port = 6000;
send_password = "changeme";
receive_password = "changeme";
};
operator "admin" {
operclass = "sra";
password = "changeme";
};
general {
# permissive_mode; # https://github.com/atheme/atheme/issues/937
helpchan = "#help";
helpurl = "https://www.supernets.org";
verbose_wallops;
join_chans;
leave_chans;
uflags = { hidemail; };
cflags = { verbose; verbose_ops; keeptopic; guard; };
flood_msgs = 0;
flood_time = 10;
# ratelimit_uses = 5;
# ratelimit_period = 60;
# vhost_change = 30;
kline_time = 1;
# kline_with_ident;
kline_verified_ident;
clone_time = 0;
commit_interval = 16;
db_save_blocking;
operstring = "is an IRC Operator";
servicestring = "is a Network Service";
default_clone_allowed = 8;
default_clone_warn = 4;
clone_identified_increase_limit;
# uplink_sendq_limit = 1048576;
language = "en";
exempts {
};
# allow_taint;
immune_level = ircop;
show_entity_id;
# load_database_mdeps;
hide_opers;
match_masks_through_vhost;
default_password_length = 16;
};

View File

@ -1,25 +1,16 @@
services:
anope:
ulimits:
nofile:
soft: "102400"
hard: "102400"
logging:
driver: "json-file"
options:
max-size: "64k"
restart: always
atheme:
build:
context: .
args:
BUILD_SERVER_NAME: ${SERVER_NAME}
image: anope
image: atheme
command: ${DAEMON_FLAGS}
network_mode: "host"
env_file: "config.env"
volumes:
- ./custom:/etc/anope/custom:rw
- ./include.conf:/etc/anope/include.conf:ro
- log:/var/log/anope
- ./data:/etc/atheme
- log:/var/log/atheme
volumes:
log:
name: anope_log
name: atheme_log

View File

@ -1,97 +0,0 @@
uplink
{
host = 127.0.0.1
protocol = "ipv4"
ssl = yes
port = "7000"
password = changeme
}
serverinfo
{
name = services.lame-network.local
description = "IRC Services"
localhost = 127.0.0.1
id = 10X
pid = "/tmp/anope.pid"
motd = "/etc/anope/motd.txt"
}
networkinfo
{
networkname = "NetcraveIRC"
nicklen = 31
userlen = 10
hostlen = 64
chanlen = 32
modelistsize = 256
nick_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-"
allow_undotted_vhosts = true
disallow_start_or_end = ".-"
}
mail
{
usemail = no
sendmailpath = "/usr/sbin/sendmail -it"
sendfrom = "no-reply@lame-network.local"
delay = 5m
dontquoteaddresses = no
content_type = "text/plain; charset=UTF-8"
registration_subject = "Nickname registration for %n"
registration_message = "Hi,
You have requested to register the nickname %n on %N.
Please type \" /msg NickServ CONFIRM %c \" to complete registration.
If you don't know why this mail was sent to you, please ignore it silently.
%N administrators."
reset_subject = "Reset password request for %n"
reset_message = "Hi,
You have requested to have the password for %n reset.
To reset your password, type \" /msg NickServ CONFIRM %n %c \"
If you don't know why this mail was sent to you, please ignore it silently.
%N administrators."
emailchange_subject = "Email confirmation"
emailchange_message = "Hi,
You have requested to change your email address from %e to %E.
Please type \" /msg NickServ CONFIRM %c \" to confirm this change.
If you don't know why this mail was sent to you, please ignore it silently.
%N administrators."
memo_subject = "New memo"
memo_message = "Hi %n,
You've just received a new memo from %s. This is memo number %d.
Memo text:
%t"
}
oper
{
name = "admin"
type = "Services Root"
require_oper = yes
}
module
{
name = "db_flatfile"
database = "/var/lib/anope/anope.db"
fork = no
nobackupokay = yes
keepbackups = 3
}

3
ssl/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*
!.gitignore
!ca.crt

40
ssl/ca.crt Normal file
View File

@ -0,0 +1,40 @@
-----BEGIN CERTIFICATE-----
MIIG+TCCBOGgAwIBAgIUTnY+1MZsN286sT+G2i8UWe3VjZwwDQYJKoZIhvcNAQEL
BQAwgaIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH
DA1TYW4gRnJhbmNpc2NvMRIwEAYDVQQKDAlTdXBlck5FVHMxDDAKBgNVBAsMA0lS
QzEdMBsGA1UEAwwUY2EudGFpbDkxMjJjOC50cy5uZXQxJTAjBgkqhkiG9w0BCQEW
Fm5vLXJlcGx5QHN1cGVybmV0cy5vcmcwHhcNMjQxMTA2MTkzMDM3WhcNMzQxMTA0
MTkzMDM3WjCBojELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAU
BgNVBAcMDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCVN1cGVyTkVUczEMMAoGA1UE
CwwDSVJDMR0wGwYDVQQDDBRjYS50YWlsOTEyMmM4LnRzLm5ldDElMCMGCSqGSIb3
DQEJARYWbm8tcmVwbHlAc3VwZXJuZXRzLm9yZzCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAKSUdSIh1QLRB+rP0CrLd9T3zMSnA6o0ToIiSwJFjDqZ6F3v
ZtYnZMD0OiNCJe89KNngaLbTY9CY5Yds2b9g3PemdAM1Kle9hMom+W6Q17T4oA2q
0hrJkvf4sFQo1P0P6KEQSWRPqSwQ7h10DQYNEvZ7Q9LCAsgHoCmVXZIdAm6fRZmM
ihTkXm0K24aTS8k/Tjgq+NsMulw0Z5SA19INvq+jk4AnYcqwuFPbPHdcKdfXryLh
M8dXbUQbv0z8tLGptLqr56ESnf3QuP9ad86hx22WxesJxnR7JwHBjWdlwO1hAdOa
QZjlcJxejIyYwHAU1FSpYdbH++HuQ6kd+DvREEF6FOVMlIyYqwHzo4fm9mzrne7s
NLTQWp2wnzv3RB2/Q2sMwd3ccG7SWfo7iCOXIYaEwGbjduk2/4y388uBAfbofT+T
8hAWgPVVEJiCpQ2cMzscQxA1mAk3WDB1fz9lHwMrlgBRa/Tftj3jVogdVPl5fDsD
/2sCQgVQ68ABT6hlzMp56iayhZu1jjnBc/fTKK40NHCh7WNvZgJ9pR4Lpqzmt6JA
Z4iY5WtHehg+xwhFoAfjjZdCiWvLNmfzet+PmW+D9c8V17faMMNfLsHTxHjzABoc
2jFSdGNOyoI1DPKDEw6f/ZlNY67YOesiozbvH+XBurFhzh04hkyPkKWSZnqhAgMB
AAGjggEjMIIBHzAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRI9BMsv2VBGfUEfJjN
s1Fb2B68zDCB4gYDVR0jBIHaMIHXgBRI9BMsv2VBGfUEfJjNs1Fb2B68zKGBqKSB
pTCBojELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcM
DVNhbiBGcmFuY2lzY28xEjAQBgNVBAoMCVN1cGVyTkVUczEMMAoGA1UECwwDSVJD
MR0wGwYDVQQDDBRjYS50YWlsOTEyMmM4LnRzLm5ldDElMCMGCSqGSIb3DQEJARYW
bm8tcmVwbHlAc3VwZXJuZXRzLm9yZ4IUTnY+1MZsN286sT+G2i8UWe3VjZwwCwYD
VR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAUfhnquPlKvCB/l47JZaC0V+wR
aAJlbCjqwCsfOJqE381i1yKBc7Dbk0rYmS68fjDDyeGs6Av/9wj6RZ4+WoY47WYL
fYCGF/HAFqyKllAfzKF+nvvBP8mKVOZX/QTlZKBD7biTjHTJSUou6y9LkRAwm7yw
cRHkJkPwPCHihLcn0MLdlf8vRrTCZqZ1wEiRd0jIPkrBdpYoc3ENg+3zQGkPnCsD
L1LwbiL7d1WASZ5cAxKKMl7rqA8oHCH8Ffou4DyK+igeEhcOxTu1A2jSpIAHjLZv
aoWy/aEl4QO1QmY4CTftb2qgX5rr7EDLRK4paqFMsPfv8nCK3w8KmwZ/s1rlYt10
oVoO3SJF+PRl78bMiuv55k+4UHh1S17fHuYKz31eGVkj9AfIec4FPewq4hHnLYO6
F5tX96OlTubweeNioZauKv4pynwleIhjnzW0af50beaGulJmY83gCenyQcxxdTxu
B7bmdj11/knCdFy0CKjZmvFNc99ujkH8Bac/qViHwjctWJ87mNLxHvlHQSMe9e7f
Z2FmtlL0tlFl4KSX3RLXBt5MzRq2zbGY6eAjm2Ld3F+/bPYoyi4t1dUZh9BglTUb
fW0A6bn325JCOPAMvyyBs4M4yeaUm5wep+KB1VyLhbm39OFotNz5oXZ/2WhQQK1E
WOpWX6M4m8GQTXG1IA==
-----END CERTIFICATE-----

1
stunnel/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
stunnel.conf

11
stunnel/Dockerfile Normal file
View File

@ -0,0 +1,11 @@
ARG UBUNTU_VERSION="noble"
FROM ubuntu:${UBUNTU_VERSION}
RUN apt -y update
RUN apt -y install stunnel
ADD stunnel.conf /etc/stunnel/stunnel.conf
CMD stunnel

View File

@ -0,0 +1,20 @@
services:
stunnel:
restart: on-failure:3
build:
context: .
image: stunnel
network_mode: "host"
volumes:
- ../ssl/ca.crt:/ca.crt:ro
- ../ssl/server.crt:/server.crt:ro
- ../ssl/server.key:/server.key:ro
- ./stunnel.conf:/etc/stunnel/stunnel.conf:ro
ulimits:
nofile:
soft: "102400"
hard: "102400"
logging:
driver: "json-file"
options:
max-size: "64k"

View File

@ -0,0 +1,9 @@
foreground = yes
[PKI client]
client = yes
accept = 127.0.0.1:6000
connect = 100.79.209.72:7777
CAfile = /ca.crt
verifyChain = yes
checkHost = super-temple.lame-server.local

1
tools/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
anope.db

410
tools/anope2atheme.php Normal file
View File

@ -0,0 +1,410 @@
<?php
/**
* Created by Klaas Tammling. (https://gist.github.com/KlaasT/449b28c63db129a7714d41b8e2074d90)
* Project: anope2atheme
* User: ktammling
* Date: 10.10.2016
* Time: 15:55
*/
$mu_hold = 0x00000001;
$mu_neverop = 0x00000002;
$mu_noop = 0x00000004;
$mu_waitauth = 0x00000008;
$mu_hidemail = 0x00000010;
$mu_oldalias = 0x00000020;
$mu_nomemo = 0x00000040;
$mu_emailmemos = 0x00000080;
$mu_cryptpass = 0x00000100;
$mu_old_sasl = 0x00000200;
$mu_noburstlogin = 0x00000400;
$mu_enforce = 0x00000800;
$mu_usepriv = 0x00001000;
$mu_private = 0x00002000;
$mu_quietchg = 0x00004000;
$levels['VOP'] = "+AV";
$levels['HOP'] = "+AHehirtv";
$levels['AOP'] = "+AOehiortv";
$levels['SOP'] = "+AOaefhiorstv";
$levels['QOP'] = "+AFORaefhioqrstv";
$access[1] = "+A";
$access[3] = "+VA";
$access[4] = "+vHiA";
$access[5] = "+vhoOirtA";
$access[10] = "+vhoOairRftA";
$access[15] = "+vhoOairRftA";
$access[20] = "+vhoOairRftA";
$access[999] = "+vhoOairRftA";
$access[9000] = "+vhoOaqsirRftA";
$access[9999] = "+vhoOaqsirRftA";
$access[10000] = "+vhoOaqsirRftA";
$tdata = file_get_contents("anope.db");
$data = explode("\n", $tdata);
unset($tdata);
$userset = array();
#$aliasset = array();
$channelset = array();
$is_mu = false;
$is_na = false;
$is_cu = false;
$is_ca = false;
$mu_account = "";
$mu_pass = "";
$mu_lang = "";
$mu_email = "";
$mu_register = "";
$mu_flags = 0;
$channel_flags = "+";
$mu_vhost_ident = "";
$mu_vhost_host = "";
$mu_vhost_creator = "";
$mu_vhost_time = "";
for($i = 0; $i < count($data); $i++) {
$line = $data[$i];
$data2 = explode(" ", $line);
if($is_mu or ($data2[0] == 'OBJECT' && $data2[1] == "NickCore")) {
$is_md = false;
$is_mu = true;
$is_cu = false;
$is_na = false;
if (isset($data2[1])) {
if ($data2[1] == "pass") {
$passvars = explode(":", $data2[2]);
$pass = $passvars[1];
$mu_pass = '$rawmd5$'.$pass;
}
if ($data2[1] == "display") {
$mu_account = $data2[2];
}
if ($data2[1] == "language") {
$mu_lang = (isset($data2[2])) ? $data2[2] : "default";
}
if ($data2[1] == "email") {
$mu_email = (isset($data2[2])) ? $data2[2] : "admin@st-city.net";
}
if ($data2[1] == "time_registered" && isset($data2[2])) {
$mu_register = $data2[2];
}
if($data2[1] == "HIDE_EMAIL")
$mu_flags |= $mu_hidemail;
if($data2[1] == "NS_PRIVATE")
$mu_flags |= $mu_private;
if($data2[1] == "NS_SECURE")
$mu_flags |= $mu_enforce;
$mu_flags = 272;
}
if (!empty($mu_account)) {
$userset[$mu_account] = array(
"mu_pass" => $mu_pass,
"mu_account" => $mu_account,
"mu_lang" => $mu_lang,
"mu_email" => $mu_email,
"mu_register" => $mu_register,
"mu_flags" => $mu_flags,
);
}
if ($data2[0] == "END") {
$mu_account = "";
$mu_pass = "";
$mu_lang = "";
$mu_email = "";
$mu_register = "";
$is_mu = false;
}
}
if($is_na or ($data2[0] == 'OBJECT' && $data2[1] == "NickAlias")) {
$is_md = false;
$is_mu = false;
$is_cu = false;
$is_na = true;
if (isset($data2[1]) && $data2[1]=="nick") {
$tmplined = 'MN ' . $data2[2];
}
if (isset($data2[1]) && $data2[1] == "time_registered") {
$mu_register = $data2[2];
}
if (isset($data2[1]) && $data2[1]=="nc") {
$mu_account = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "vhost_ident") {
$mu_vhost_ident = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "vhost_host") {
$mu_vhost_host = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "vhost_creator") {
$mu_vhost_creator = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "vhost_time") {
$mu_vhost_time = $data2[2];
}
if ($data2[0] == "END") {
$tmplined .= " ".$mu_account." ".$mu_register." ".time();
$lastnick = $mu_account;
$lastid = 'NA';
$dataNA = explode(" ", $tmplined);
if (!empty($userset[$dataNA[1]])) {
$userset[$dataNA[2]]['mu_register'] = $mu_register;
}
else {
$userset[$dataNA[2]]['aliases'][$dataNA[1]] = array(
"mu_register" => $mu_register,
"last_seen" => time(),
);
$userset[$dataNA[2]]['mu_register'] = $mu_register;
}
if (!empty($mu_vhost_host)) {
$userset[$mu_account]['vhost_ident'] = $mu_vhost_ident;
$userset[$mu_account]['vhost_host'] = $mu_vhost_host;
$userset[$mu_account]['vhost_creator'] = $mu_vhost_creator;
$userset[$mu_account]['vhost_time'] = $mu_vhost_time;
}
$mu_vhost_ident = "";
$mu_vhost_host = "";
$mu_vhost_creator = "";
$mu_vhost_time = "";
$mu_account = "";
$mu_pass = "";
$mu_lang = "";
$mu_email = "";
$mu_register = "";
$is_na = false;
$tmplined = "";
}
}
if($is_cu or ($data2[0] == 'OBJECT' && $data2[1] == "ChannelInfo")) {
$is_md = false;
$is_mu = false;
$is_cu = true;
$is_na = false;
if (isset($data2[1]) && $data2[1] == 'name') {
$cu_name = $data2[2];
}
if (isset($data2[1]) && $data2[1] == 'time_registered') {
$cu_register = $data2[2];
}
if (isset($data2[1]) && $data2[1] == 'last_used') {
$cu_last_used = $data2[2];
}
if (isset($data2[1]) && $data2[1] == 'founder') {
$cu_founder = $data2[2];
}
if (isset($data2[1]) && $data2[1] == 'last_topic') {
$cu_last_topic = "";
for($i2 = 2; $i2 < count($data2); $i2++) {
if (!empty($cu_last_topic)) {
$cu_last_topic .= " ".$data2[$i2];
}
else {
$cu_last_topic .= $data2[$i2];
}
}
}
if (isset($data2[1]) && $data2[1] == 'last_topic_setter') {
$cu_last_topic_setter = $data2[2];
}
if (isset($data2[1]) && $data2[1] == 'last_topic_time') {
$cu_last_topic_time = $data2[2];
}
if (isset($data2[1]) && $data2[1] == 'KEEPTOPIC') {
if ($data2[2] == "1") {
$channel_flags .= "k";
}
}
if (isset($data2[1]) && $data2[1] == 'CS_SECURE') {
if ($data2[2] == "1") {
$channel_flags .= "z";
}
}
if (isset($data2[1]) && $data2[1] == 'CS_PRIVATE') {
if ($data2[2] == "1") {
$channel_flags .= "p";
}
}
if (isset($data2[1]) && $data2[1] == 'CS_RESTRICT') {
if ($data2[2] == "1") {
$channel_flags .= "r";
}
}
if (!empty($cu_name)) {
$channelset[$cu_name] = array(
"cu_name" => $cu_name,
"cu_register" => $cu_register,
"cu_last_used" => $cu_last_used,
"cu_founder" => $cu_founder,
"cu_last_topic" => $cu_last_topic,
"cu_last_topic_setter" => $cu_last_topic_setter,
"cu_last_topic_time" => $cu_last_topic_time,
##"channel_flags" => $channel_flags,
"channel_flags" => 600,
);
}
if ($data2[0] == "END") {
$is_cu = false;
$cu_name = "";
$cu_register = 0;
$cu_last_used = 0;
$cu_founder = "";
$cu_last_topic = "";
$cu_last_topic_setter = "";
$cu_last_topic_time = 0;
$channel_flags = "+";
}
}
if($is_ca or ($data2[0] == 'OBJECT' && $data2[1] == "ChanAccess")) {
$is_md = false;
$is_mu = false;
$is_cu = false;
$is_na = false;
$is_ca = true;
if (isset($data2[1]) && $data2[1] == "provider") {
$ca_provider = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "ci") {
$ca_channel = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "mask") {
$ca_mask = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "creator") {
$ca_creator = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "created") {
$ca_created = $data2[2];
}
if (isset($data2[1]) && $data2[1] == "data") {
if ($ca_provider == "access/xop") {
$ca_level = $levels[$data2[2]];
}
else if ($ca_provider == "access/access") {
$ca_level = $access[$data2[2]];
}
}
if ($data2[0] == "END") {
$channel_access = array(
"ca_channel" => $ca_channel,
"ca_mask" => $ca_mask,
"ca_creator" => $ca_creator,
"ca_created" => $ca_created,
"ca_level" => $ca_level,
);
if (!empty($userset[$ca_mask])) {
$channelset[$ca_channel]['channel_access'][] = $channel_access;
}
$is_ca = false;
$channel_access = array();
$ca_channel = "";
$ca_mask = "";
$ca_creator = "";
$ca_created = "";
$ca_level = "";
$ca_provider = "";
}
}
}
$atheme = fopen("atheme.db", 'w');
fwrite($atheme, "DBV 7\n");
fwrite($atheme, "CF +vVoOtsriRfhHAb\n");
/* MDU Obi_Wan private:usercloak city-1464.galaxy-media.highway.hyperspace
MDU Obi_Wan private:usercloak-assigner Obi_Wan
MDU Obi_Wan private:usercloak-timestamp 1476550194
*/
foreach ($userset as $key => $value) {
fwrite($atheme, "MU ".$value['mu_account']." ".$value['mu_pass']. " ".$value['mu_email']." ".$value['mu_register']." ".time()." ".$mu_flags." ".$mu_lang."\n");
if (!empty($value['vhost_host'])) {
fwrite($atheme, "MDU ".$value['mu_account']." private:usercloak ".$value['vhost_host']."\n");
}
if (!empty($value['vhost_creator'])) {
fwrite($atheme, "MDU ".$value['mu_account']." private:usercloak-assigner ".$value['vhost_creator']."\n");
}
if (!empty($value['vhost_time'])) {
fwrite($atheme, "MDU ".$value['mu_account']." private:usercloak-timestamp ".$value['vhost_time']."\n");
}
if (isset($value['aliases'])) {
foreach ($value['aliases'] as $key2 => $value2) {
fwrite($atheme, "MN ". $value['mu_account'] ." ".$key2." ".$value2['mu_register']." ".$value2['last_seen']."\n");
}
}
}
foreach ($channelset as $key => $value) {
fwrite($atheme, "MC ".$key." ".$value['cu_register']." ".$value['cu_last_used']." ".$value['channel_flags']." 272 6 0\n");
fwrite($atheme, "CA ".$key." ".$value['cu_founder']." +AFORafhioqrstv ".$value['cu_register']." ".$value['cu_founder']."\n");
if (isset($value['channel_access'])) {
foreach ($value['channel_access'] as $key2 => $value2) {
fwrite($atheme, "CA ". $value2['ca_channel']." ".$value2['ca_mask']." ".$value2['ca_level']." ".$value2['ca_created']." ".$value2['ca_creator']."\n");
# die($key2);
}
}
fwrite($atheme, "MDC ".$key." private:topic:setter ".$value['cu_last_topic_setter']."\n");
fwrite($atheme, "MDC ".$key." private:topic:text ".$value['cu_last_topic']."\n");
fwrite($atheme, "MDC ".$key." private:topic:ts ".$value['cu_last_topic_time']."\n");
}
fclose($atheme);