Compare commits

...

7 Commits

Author SHA1 Message Date
d5b44bb523 Including dependency 2024-04-08 00:04:55 -05:00
d2fea2be16 Updates for ravensend 2024-04-08 00:03:30 -05:00
6663651c0b Updates for functionality; getting in-line with standards 2024-04-08 00:00:47 -05:00
f537e649e4 Updating to fix packaging 2023-10-14 13:33:51 -05:00
51f895639b Updating for egrep 2023-10-14 13:15:22 -05:00
cc12803ecf Updating packaging 2023-10-14 13:14:40 -05:00
f0685bc0af Updating for hooks 2023-10-14 13:12:53 -05:00
15 changed files with 110 additions and 70 deletions

3
.gitignore vendored
View File

@@ -1,5 +1,6 @@
raven.mono raven.mono
TheRaven-*.pkg.tar.zst **.pkg.tar.zst
pkg/ pkg/
src/ src/
.config .config
wiki/

58
LICENSE
View File

@@ -1,27 +1,31 @@
# http://www.wtfpl.net/about/ # http://www.wtfpl.net/about/
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004 Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long copies of this license document, and changing it is allowed as long
as the name is changed. as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO. 0. You just DO WHAT THE FUCK YOU WANT TO.
ANINIX ADDENDUM ANINIX ADDENDUM
Trademark Pending 2017 (https://aninix.net/irc/) Trademark 2017 (https://aninix.net/)
The "AniNIX" name and |> logo is trademark-pending as of 2017. All The "AniNIX" name and |> logo are trademarked as of 2017/11/21.
AniNIX materials can be reproduced and re-used, though you must AniNIX materials may be reproduced and re-used (though you must
contact the admins of the network to get written permission to use contact the admins of the network to get written permission to use
the AniNIX name. the AniNIX name or logo) so long as such reproduction or re-use
does not inhibit the original AniNIX use of the same.
Attribution is appreciated for other materials but not legally
required or necessary. Attribution is appreciated for other materials but not legally
required or necessary.
"AniNIX" trademark serial: 87177883
|> Logo trademark serial: 87177887

View File

@@ -1,17 +1,14 @@
CONFDIR = ${pkgdir}/usr/local/etc/TheRaven CONFDIR = ${pkgdir}/usr/local/etc/TheRaven
INSTALLDIR = ${pkgdir}/opt/aninix/TheRaven
SCRIPTS != ls -1 *.bash
compile: clean ./chatbot-support.bash ./math-support.bash compile: clean ./chatbot-support.bash ./math-support.bash
(mcs -out:raven.mono /opt/aninix/Uniglot/CSharp/*.csharp *.csharp Raven.csharp 2>&1 | grep -v CS2002); printf "" (mcs -out:raven.mono /opt/aninix/Uniglot/CSharp/*.csharp *.csharp Raven.csharp 2>&1 | grep -v CS2002); printf ""
clean:
for i in raven.mono; do if [ -f $$i ]; then rm $$i; fi; done
test: compile
cd ./sample-confs; mono ../raven.mono -c sample.conf -v -h
install: compile install: compile
mkdir -p ${pkgdir}/opt source $$PWD/installscript && pre_install || true
cp raven.mono ${pkgdir}/opt/raven.mono install -o raven -g raven -m 0750 -d ${INSTALLDIR}
for script in ${SCRIPTS} raven.mono; do install -o raven -g raven -m 0640 $$script ${INSTALLDIR}; done
if [ ! -d ${CONFDIR} ]; then mkdir -p ${CONFDIR}; cp sample-confs/* ${CONFDIR}; fi if [ ! -d ${CONFDIR} ]; then mkdir -p ${CONFDIR}; cp sample-confs/* ${CONFDIR}; fi
# Hook to deprivilege bot # Hook to deprivilege bot
make checkperm make checkperm
@@ -19,15 +16,26 @@ install: compile
mkdir -p ${pkgdir}/usr/lib/systemd/system/ mkdir -p ${pkgdir}/usr/lib/systemd/system/
cp ./raven.service ${pkgdir}/usr/lib/systemd/system/raven.service cp ./raven.service ${pkgdir}/usr/lib/systemd/system/raven.service
reverse: ${pkgdir}/usr/lib/systemd/system/raven.service clean:
cp ${pkgdir}/usr/lib/systemd/system/raven.service . for i in raven.mono; do if [ -f $$i ]; then rm $$i; fi; done
checkperm: ${pkgdir}/opt/raven.mono uninstall:
if ! id raven; then sudo useradd raven; echo User raven added; fi rm -Rf ${INSTALLDIR} ${CONFDIR}
chown -R raven:raven ${pkgdir}/opt/raven.mono ${CONFDIR}* systemctl disable --now raven.service
chmod 0600 ${pkgdir}/opt/raven.mono ${CONFDIR}*/* rm /usr/lib/systemd/system/raven.service
chmod 0700 ${CONFDIR}*
test: compile
cd ./sample-confs; mono ../raven.mono -c sample.conf -v -h
checkperm: ${INSTALLDIR}/raven.mono
chown -R raven:raven ${INSTALLDIR} ${CONFDIR}
chmod 0600 ${INSTALLDIR}/* ${CONFDIR}/*
chmod 0700 ${CONFDIR} ${INSTALLDIR}
diff: diff:
diff ./raven.service ${pkgdir}/usr/lib/systemd/system/raven.service diff ./raven.service ${pkgdir}/usr/lib/systemd/system/raven.service
diff ./sample.conf ${pkgdir}/usr/local/etc/TheRaven/raven.conf diff ./sample.conf ${pkgdir}/usr/local/etc/TheRaven/raven.conf
reverse: /usr/lib/systemd/system/raven.service /usr/local/etc/TheRaven
cp /usr/lib/systemd/system/raven.service .
cp ${INSTALLDIR}/*.bash .

View File

@@ -17,10 +17,10 @@ license=('custom')
groups=() groups=()
provides=("${pkgname}") provides=("${pkgname}")
conflicts=() conflicts=()
replaces=("${pkgname,,}", "aninix-${pkgname,,}") replaces=("${pkgname,,}" "aninix-${pkgname,,}")
backup=() backup=()
options=() options=()
install= install=installscript
changelog= changelog=
source=() source=()
noextract=() noextract=()

View File

@@ -1,16 +1,37 @@
This is a simple IRCbot for the AniNIX's operations. This is a simple IRC bot for the AniNIX's operations.
# Etymology
The Raven is a named after the [common raven](https://en.wikipedia.org/wiki/Raven) by [DarkFeather](/DarkFeather). There's a lot of history there, but it's effectively that user's namesake & avatar.
# Relevant Files and Software
The Raven's source code can be compiled into a deployable agent. To enable this bot, just install the package from [the AniNIX repository](https://maat.aninix.net) or run the following:
# Usage
To enable this bot, just install the package from [the AniNIX repository](https://maat.aninix.net) or run the following:
``` ```
make make
sudo make install sudo make install
sudo systemctl start raven.service sudo systemctl enable --now raven.service
sudo systemctl enable raven.service
``` ```
The configuration lives in `/usr/local/etc/TheRaven`. Unique files are provided for logins, search functions, help text, CrowFacts and magic8 functions, etc.
TheRaven is dependent on /bin/bash and [wget](https://wiki.archlinux.org/index.php/Wget) for the TinyURL features. It is dependent on the [Mono](https://wiki.archlinux.org/index.php/Mono) package for compiling on Linux.
TheRaven also expects an OS script, `api-keys`, that will return a TinyURL API key when run with the `tinyurl` parameter.
# Available Clients
There are no direct clients -- connect to [IRC](https://irc.aninix.net) or our Discord bridge. Use `r.help` in any channel where TheRaven is present to find out what it can do, or PM it directly.
# Equivalents or Competition
[Sopel](https://sopel.chat/) is an equivalent, maintained IRC bot. We maintain our own for the use case of testing code development.
Various Discord bots also perform the same function.
# Functionality # Functionality
This IRCbot has some simple commands that can be found by most users with `r.help` in whatever channel the bot has joined. This IRC bot has some simple commands that can be found by most users with `r.help` in whatever channel the bot has joined.
Administrative functions are controlled by the access lists and can be found with `r.adminhelp`. Administrative functions are controlled by the access lists and can be found with `r.adminhelp`.

View File

@@ -283,7 +283,7 @@ namespace AniNIX.TheRaven {
if (response.msgCode.Equals("PRIVMSG") && !String.IsNullOrWhiteSpace(response.message) && (response.target.Equals(Nick) || response.message.StartsWith(String.Format("{0}:",Nick)) || response.message.EndsWith(String.Format("{0}!",Nick)) || response.message.EndsWith(String.Format("{0}?",Nick)) || response.message.EndsWith(String.Format("{0}.",Nick)) || response.message.EndsWith(String.Format("{0}",Nick)))) { if (response.msgCode.Equals("PRIVMSG") && !String.IsNullOrWhiteSpace(response.message) && (response.target.Equals(Nick) || response.message.StartsWith(String.Format("{0}:",Nick)) || response.message.EndsWith(String.Format("{0}!",Nick)) || response.message.EndsWith(String.Format("{0}?",Nick)) || response.message.EndsWith(String.Format("{0}.",Nick)) || response.message.EndsWith(String.Format("{0}",Nick)))) {
IRCClientMessage send = new IRCClientMessage(); IRCClientMessage send = new IRCClientMessage();
try { try {
String aliceResponse = ExecuteCommand.Run(String.Format("bash ./chatbot-support.bash \"{0}\" {1}",response.message.Replace("'","").Replace("\"","").Split('\n')[0].Trim(),Nick)).Trim(); String aliceResponse = ExecuteCommand.Run(String.Format("bash /opt/aninix/TheRaven/chatbot-support.bash \"{0}\" {1}",response.message.Replace("'","").Replace("\"","").Split('\n')[0].Trim(),Nick)).Trim();
if (String.IsNullOrWhiteSpace(aliceResponse)) throw new Exception("No response from ALICE chatbot service"); if (String.IsNullOrWhiteSpace(aliceResponse)) throw new Exception("No response from ALICE chatbot service");
send.PrivMsg(aliceResponse,(response.target.Equals(Nick))?response.user:response.target); send.PrivMsg(aliceResponse,(response.target.Equals(Nick))?response.user:response.target);
} catch (Exception e) { } catch (Exception e) {

View File

@@ -84,7 +84,7 @@ namespace AniNIX.TheRaven {
if (bySpace.Length < 2) { if (bySpace.Length < 2) {
} else { } else {
send.PrivMsg(ExecuteCommand.Run(String.Format("/bin/bash /usr/local/src/TheRaven/math-support.bash \"{0}\"",incoming.message.Replace("r.math ","").Replace("'","").Replace("\"",""))),(incoming.target.Equals(theRaven.Nick))?incoming.user:incoming.target); send.PrivMsg(ExecuteCommand.Run(String.Format("/bin/bash /opt/aninix/TheRaven/math-support.bash \"{0}\"",incoming.message.Replace("r.math ","").Replace("'","").Replace("\"",""))),(incoming.target.Equals(theRaven.Nick))?incoming.user:incoming.target);
} }
connection.Write(send); connection.Write(send);
return; return;
@@ -127,7 +127,7 @@ namespace AniNIX.TheRaven {
connection.Write(send); connection.Write(send);
return; return;
case "r.ip": case "r.ip":
send.PrivMsg(ExecuteCommand.Run("curl -s $(ip r list | grep default | cut -f 3 -d \" \"):80 | grep \"WAN IP\" | cut -f 13 -d \">\" | cut -f 1 -d \"<\""),(incoming.target.Equals(theRaven.Nick))?incoming.user:incoming.target); send.PrivMsg(ExecuteCommand.Run("/bin/bash /opt/aninix/TheRaven/ip.bash"),(incoming.target.Equals(theRaven.Nick))?incoming.user:incoming.target);
connection.Write(send); connection.Write(send);
return; return;
case "r.searches": case "r.searches":

8
installscript Normal file
View File

@@ -0,0 +1,8 @@
pre_install() {
groupadd raven &>/dev/null
useradd -g raven -s /bin/false raven &> /dev/null
}
pre_remove() {
getent passwd raven &>/dev/null && userdel raven &> /dev/null
}

View File

@@ -1,2 +1,2 @@
#!/bin/bash #!/bin/bash
lynx -connect_timeout=3 -read_timeout=3 --dump 'http://m.wolframalpha.com/input/?i='"$(echo $1 | sed 's/+/%2B/g' | tr ' ' '+')"'&x=0&y=0' | cat -n | egrep '^ 21' | head -n 1 | xargs | sed 's/^21 //' lynx -connect_timeout=3 -read_timeout=3 --dump 'http://m.wolframalpha.com/input/?i='"$(echo $1 | sed 's/+/%2B/g' | tr ' ' '+')"'&x=0&y=0' | cat -n | grep -E '^ 21' | head -n 1 | xargs | sed 's/^21 //'

View File

@@ -4,7 +4,7 @@ After=network.target
[Service] [Service]
WorkingDirectory=/usr/local/etc/TheRaven WorkingDirectory=/usr/local/etc/TheRaven
ExecStart=/usr/bin/mono /opt/raven.mono -c raven.conf ExecStart=/usr/bin/mono /opt/aninix/TheRaven/raven.mono -c raven.conf
ExecReload=/bin/kill -HUP $MAINPID ExecReload=/bin/kill -HUP $MAINPID
KillMode=process KillMode=process
Restart=always Restart=always

View File

@@ -19,15 +19,15 @@ install: compile
mkdir -p ${pkgdir}/usr/local/etc/ mkdir -p ${pkgdir}/usr/local/etc/
install -m 0640 -o raven -g raven ./ravensend-daemon.yml ${pkgdir}/usr/local/etc/ install -m 0640 -o raven -g raven ./ravensend-daemon.yml ${pkgdir}/usr/local/etc/
diff:
for i in ${LIST}; do diff /usr/local/bin/$$i $$i; done
diff ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service ./ravensend-daemon.service
reverse: ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service reverse: ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service
cp ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service . cp ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service .
for i in ${LIST}; do cp ${pkgdir}/usr/lib/systemd/system/$$i .; done for i in ${LIST}; do cp ${pkgdir}/usr/local/bin/$$i .; done
checkperm: ${pkgdir}/opt/raven.mono checkperm: ${pkgdir}/opt/raven.mono
for i in ${LIST}; do chown -R raven: ${pkgdir}/usr/local/bin/$$i; chmod 0755 ${pkgdir}/usr/local/bin/$$i; done for i in ${LIST}; do chown -R raven: ${pkgdir}/usr/local/bin/$$i; chmod 0755 ${pkgdir}/usr/local/bin/$$i; done
chown raven: ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service chown raven: ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service
chmod 0644 ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service chmod 0644 ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service
diff:
for i in ${LIST}; do diff ${pkgdir}/usr/lib/systemd/system/$$i $$i; done
diff ${pkgdir}/usr/lib/systemd/system/ravensend-daemon.service ./ravensend-daemon.service

View File

@@ -1,5 +1,5 @@
# Maintainer: DarkFeather <ircs://aninix.net:6697/darkfeather> # Maintainer: DarkFeather <ircs://aninix.net:6697/darkfeather>
depends=('python' 'python-yaml' 'python-flask' 'bash' 'nmap>=7.91-1') depends=('python' 'python-yaml' 'python-flask' 'bash' 'nmap>=7.91-1' 'TheRaven')
makedepends=('make>=4.2' 'Uniglot') makedepends=('make>=4.2' 'Uniglot')
checkdepends=() checkdepends=()
optdepends=() optdepends=()
@@ -17,7 +17,7 @@ license=('custom')
groups=() groups=()
provides=("${pkgname}") provides=("${pkgname}")
conflicts=() conflicts=()
replaces=("${pkgname,,}", "aninix-${pkgname,,}") replaces=("${pkgname,,}" "aninix-${pkgname,,}")
backup=() backup=()
options=() options=()
install= install=

View File

@@ -28,7 +28,7 @@ function getAPIConfigValue() {
# Get the api config value # Get the api config value
# param attr: the attribute to look for # param attr: the attribute to look for
# returns: the attribute's value # returns: the attribute's value
egrep -A 10 '^\[ API \]$' "$file" | egrep -m 1 '^'"$1"'=' | sed 's/^'"$1"'=//' grep -A 10 -E '^\[ API \]$' "$file" | grep -m 1 -E '^'"$1"'=' | sed 's/^'"$1"'=//'
} }
# Parse arguments # Parse arguments

View File

@@ -22,15 +22,13 @@ configvars = []
def hello(): def hello():
data = request.json data = request.json
print(data["event"]["message"] + ' at ' + data["event"]["timestamp"]) notification = data["event"]["message"] + ' at ' + data["event"]["timestamp"] + ' -- ' + data["event"]["key"]
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try: try:
s.connect((configvars["server"],int(configvars["port"]))) s.connect((configvars["server"],int(configvars["port"])))
s.settimeout(1) s.settimeout(1)
mesg = configvars["password"] + ' #' + configvars["channel"] + ' ' + data["event"]["message"] + ' at ' + data["event"]["timestamp"] mesg = configvars["password"] + ' #' + configvars["channel"] + ' ' + notification
print(mesg)
s.send(mesg.encode()) s.send(mesg.encode())
print('Sent to TheRaven')
except: except:
print('Could not send to TheRaven') print('Could not send to TheRaven')
return data return data

View File

@@ -1,6 +1,6 @@
[Unit] [Unit]
Description=AniNIX/ravensend Daemon Description=AniNIX/ravensend Daemon
After=network.target After=network.target raven.service
[Service] [Service]
ExecStart=/usr/local/bin/ravensend-daemon ExecStart=/usr/local/bin/ravensend-daemon