Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
8d4bbda945 |
20 changed files with 300 additions and 715 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*.local
|
|
@ -1,9 +0,0 @@
|
|||
[Unit]
|
||||
Description=Autorun service
|
||||
|
||||
[Service]
|
||||
ExecStart=/autorun
|
||||
Restart=Always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
37
init.sh
Normal file
37
init.sh
Normal file
|
@ -0,0 +1,37 @@
|
|||
#!/bin/sh
|
||||
|
||||
echo "> Importing signer"
|
||||
gpg --import signer.pub
|
||||
gpg --edit-key tudbut@tudbut.de "trust" "quit"
|
||||
echo done
|
||||
|
||||
echo "> Setting up peers"
|
||||
echo -n "This node: TudbuT.infra."
|
||||
read name
|
||||
echo "TudbuT.infra.$name" > name.local
|
||||
echo -n "Router is TudbuT.infra.router.main? [Y/n] "
|
||||
read yn
|
||||
if [ "$yn" != "n" ] ; then
|
||||
echo "TudbuT.infra.router.main" > router.local
|
||||
else
|
||||
echo -n "Router: TudbuT.infra."
|
||||
read router
|
||||
echo "TudbuT.infra.$router" > router.local
|
||||
fi
|
||||
echo -n "Router lives at domain: "
|
||||
read domain
|
||||
echo "$domain" > router.ip.local
|
||||
echo "All set."
|
||||
|
||||
echo "> Setting up GPG"
|
||||
gpg --gen-key
|
||||
echo "Please sign:"
|
||||
gpg --export -a "TudbuT.infra.$name"
|
||||
echo -n "Enter to confirm"
|
||||
read
|
||||
echo "Please give me the signed key:"
|
||||
gpg --import
|
||||
echo "Thank you!"
|
||||
|
||||
echo "> Done."
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
# pi-Purple
|
||||
|
||||
This is the host for the following services:
|
||||
- forge (port 200:http and 222:ssh)
|
||||
- fedi (port 4000:http->44404)
|
||||
- matrix (port 6167)
|
||||
- pad (port 1942)
|
||||
|
||||
## Iterations
|
||||
|
||||
1. Pi 5 with Raspbian, SD card
|
||||
2. Pi 5 with Archlinuxarm, NVME drive (current)
|
||||
|
||||
## Users
|
||||
|
||||
- root -> no services
|
||||
- tudbut -> ssh login
|
||||
- git -> forgejo
|
||||
- git-run -> forgejo-runner
|
||||
- akkoma -> akkoma
|
||||
- conduit -> matrix-conduit
|
||||
- pad -> hedgedoc
|
|
@ -1,16 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# revpfw3 thread
|
||||
(
|
||||
while true; do revpfw3 client tudbut.de 222 localhost 22 _____ ; sleep 5 ; done & disown
|
||||
while true; do revpfw3 client tudbut.de 200 localhost 8200 _____ ; sleep 5 ; done & disown
|
||||
while true; do revpfw3 client tudbut.de 6167 localhost 6167 _____ ; sleep 5 ; done & disown
|
||||
while true; do revpfw3 client tudbut.de 44404 localhost 4000 _____ ; sleep 5 ; done & disown
|
||||
) > /var/log/autorun.revpfw3.log 2>&1 & disown
|
||||
|
||||
sudo chmod a+rw /var/run/docker.sock
|
||||
for dir in /home/git-run/*/ ; do
|
||||
sudo -u git-run bash -c "cd $dir; while true ; do forgejo-runner daemon > log 2>&1 ; done" & disown
|
||||
done
|
||||
|
||||
while true; do sleep 60; done
|
18
pi/README.md
18
pi/README.md
|
@ -1,18 +0,0 @@
|
|||
# TudbuT-Pi
|
||||
|
||||
This is the host for the following services:
|
||||
- data.tudbut.de (port 80:http->81)
|
||||
- irc (port 6667:irc)
|
||||
- irc bot (no ports)
|
||||
|
||||
## Iterations
|
||||
|
||||
1. Pi 3 B+ with Raspbian (wifi.service) ??
|
||||
2. Pi 3 B with Raspbian (wifi.service)
|
||||
2. (PLANNED) Pi 3 B with Archlinuxarm (autorun.service)
|
||||
|
||||
## Users
|
||||
|
||||
- root -> ssh login, irc bot
|
||||
- www-data -> nginx for data.tudbut.de
|
||||
- ircd -> inspircd
|
|
@ -1,55 +0,0 @@
|
|||
"#time.spl" import
|
||||
|
||||
"home node management" =program-name
|
||||
|
||||
def remote, revpfwkey
|
||||
|
||||
"revpfw.spl" import
|
||||
"network.spl" import
|
||||
|
||||
"tudbut.de" =remote
|
||||
"REVPFWKEY" env:get =revpfwkey
|
||||
|
||||
func panic-handler { |
|
||||
|
||||
}
|
||||
|
||||
func main { exitcode | with args ;
|
||||
"management system starting up." println
|
||||
"init revpfw subsystem" println
|
||||
&revpfw-watcher fork
|
||||
1000 time:sleep;
|
||||
"init ircbot subsystem" println
|
||||
&ircbot-watcher fork
|
||||
1000 time:sleep;
|
||||
"init network monitor subsystem" println
|
||||
&network-monitor fork
|
||||
1000 time:sleep;
|
||||
}
|
||||
|
||||
func watcher { | with statevar update delay ;
|
||||
while { statevar call =>? [ ^ok &pop ] } {
|
||||
def sa time:unixms =sa
|
||||
update call
|
||||
delay (time:unixms sa -) - dup 0 lt if { pop 0 } time:sleep;
|
||||
}
|
||||
:sjson<0> panic
|
||||
}
|
||||
|
||||
func revpfw-watcher { |
|
||||
[ ^ok ^down ] =revpfw-state
|
||||
&revpfw-state &revpfw-update watcher<1000>
|
||||
}
|
||||
|
||||
func ircbot-watcher { |
|
||||
"ircbot -> service disabled" println
|
||||
1 stop
|
||||
|
||||
[ ^ok ^down ] =ircbot-state
|
||||
&ircbot-state &ircbot-update watcher<1000>
|
||||
}
|
||||
|
||||
func network-monitor { |
|
||||
[ ^ok ^up ] =network-state
|
||||
&network-state &network-update watcher<30000>
|
||||
}
|
98
pi/tbot.sh
98
pi/tbot.sh
|
@ -1,98 +0,0 @@
|
|||
bgpids="$$"
|
||||
|
||||
function msg() {
|
||||
echo "PRIVMSG $@" >> /tmp/$pid.in
|
||||
}
|
||||
|
||||
pid=$$
|
||||
rm /tmp/$pid.in /tmp/$pid.out
|
||||
touch /tmp/$pid.in /tmp/$pid.out
|
||||
tail -f /tmp/$pid.in | telnet $@ 6667 > /tmp/$pid.out &
|
||||
tnpid=$!
|
||||
bgpids="$bgpids $!"
|
||||
tail -f /tmp/$pid.out | (
|
||||
# Receiver
|
||||
while true; do
|
||||
read -r line
|
||||
line=$(tr -d "*" <<< "$line")
|
||||
echo "$line"
|
||||
IFS=' ' read -ra split <<< "$line"
|
||||
msg=""
|
||||
for ((i=3; i<${#split[@]}; i++)) ; do
|
||||
msg="$msg ${split[$i]}"
|
||||
done
|
||||
msg="${msg:2}"
|
||||
channel="${split[2]}"
|
||||
echo GOT MSG "$msg" in "$channel"
|
||||
read -ra cmd <<< "$msg"
|
||||
|
||||
for arg in ${cmd[@]} ; do
|
||||
case "$arg" in http*)
|
||||
url=$(curl -H 'Content-Type: application/json' -H 'Authorization: Bearer 801fae8344e9c65b112a2acef9bdeeec9335b297' -X POST -d "{\"long_url\":\"$arg\"}" https://api-ssl.bitly.com/v4/shorten)
|
||||
url=$(sed -E "s/^.*\"link\":\"//" <<< $url | sed -E "s/\".*$//g")
|
||||
msg $channel ":I shortened that URL for you: $url"
|
||||
;; esac
|
||||
done
|
||||
|
||||
case "$msg" in
|
||||
"Nickname is already in use.")
|
||||
if [ $channel = "URLBot" ] ; then
|
||||
echo "QUIT :Stopping." >> /tmp/$pid.in
|
||||
sleep 1
|
||||
kill $(cat /tmp/$pid.pids) >& /dev/null &
|
||||
exit 0
|
||||
fi
|
||||
;;
|
||||
"-disconnect")
|
||||
#echo "QUIT :Stopping." >> /tmp/$pid.in
|
||||
#sleep 1
|
||||
#kill $(cat /tmp/$pid.pids) >& /dev/null &
|
||||
#exit 0
|
||||
;;
|
||||
-join\ *)
|
||||
msg $channel :Joining "${cmd[1]}"
|
||||
echo "JOIN ${cmd[1]}" >> /tmp/$pid.in
|
||||
msg "${cmd[1]}" ":This is a bot to shorten URLs on IRC so console users who can't copy/paste can easily access URLs. You can make it leave using -leave, and you can make it rejoin by going to ###urlbot and typing -join #channel."
|
||||
;;
|
||||
"-test")
|
||||
msg $channel 'OK!'
|
||||
;;
|
||||
"-sandwich")
|
||||
msg $channel 'Spaghetti'
|
||||
;;
|
||||
"-leave")
|
||||
if [ "$channel" = '###urlbot' ]; then
|
||||
msg $channel ':I will not leave the ###urlbot channel.'
|
||||
else
|
||||
msg $channel ':Goodbye.'
|
||||
echo "PART $channel" >> /tmp/$pid.in
|
||||
fi
|
||||
;;
|
||||
"URLBot")
|
||||
msg $channel ":URLBot commands - They also work in /msg, but the bot won't respond that way."
|
||||
msg $channel ':-join <channel> : Makes the bot join a channel'
|
||||
msg $channel ':-test : Makes the bot reply "OK!"'
|
||||
msg $channel ':-leave : Makes the bot leave this channel'
|
||||
;;
|
||||
esac
|
||||
done
|
||||
) &
|
||||
bgpids="$bgpids $!"
|
||||
(
|
||||
while kill -0 $pid $tnpid >& /dev/null; do
|
||||
sleep 20
|
||||
echo "PONG $@" >> /tmp/$pid.in
|
||||
done
|
||||
echo "QUIT Stopping." >> /tmp/$pid.in
|
||||
sleep 1
|
||||
kill $(cat /tmp/$pid.pids) >& /dev/null &
|
||||
exit 0
|
||||
) &
|
||||
bgpids="$bgpids $!"
|
||||
echo "$bgpids" > /tmp/$pid.pids
|
||||
sleep 2
|
||||
echo "USER URLBot * * ." >> /tmp/$pid.in
|
||||
echo "NICK URLBot" >> /tmp/$pid.in
|
||||
sleep 2
|
||||
echo "JOIN ###urlbot" >> /tmp/$pid.in
|
||||
while true; do sleep 1; done
|
124
pi/wifi
124
pi/wifi
|
@ -1,124 +0,0 @@
|
|||
#!/bin/bash
|
||||
### BEGIN INIT INFO
|
||||
# Provides: wificonn
|
||||
# Required-Start: wpa_supplicant dhclient
|
||||
# Required-Stop: wpa_supplicant dhclient
|
||||
# Default-Start: 0 1 2 3 4 5 6
|
||||
# Default-Stop:
|
||||
# Short-Description: Start wificonn
|
||||
# Description: Start wificonn
|
||||
### END INIT INFO
|
||||
|
||||
# -> /etc/init.d/wifi
|
||||
# to be replaced by architecture similar to pi-purple
|
||||
|
||||
|
||||
# wificonn STARTER
|
||||
|
||||
case "$1" in
|
||||
"start")
|
||||
# Ensure junk from previous instances is gone!
|
||||
sleep 10
|
||||
killall revpfw3 ssh
|
||||
kill -0 $(cat /etc/serverpid) && sleep 60 && exit 20
|
||||
echo -n "$$" > /etc/serverpid
|
||||
|
||||
# Start a thread to make sure the internet connectivity is NEVER lost!
|
||||
(
|
||||
OFF=0
|
||||
while true; do
|
||||
# Wait 0.5 minutes
|
||||
sleep 300
|
||||
if killall -0 revpfw3 > /dev/null 2>&1 ; then
|
||||
OFF=0
|
||||
else
|
||||
if [[ $OFF = 1 ]] ; then
|
||||
reboot
|
||||
fi
|
||||
#OFF=1
|
||||
fi
|
||||
done
|
||||
) &
|
||||
echo -n " $!" >> /etc/serverpid
|
||||
(
|
||||
OFF=0
|
||||
while true; do
|
||||
# Wait 0.5 minutes
|
||||
sleep 300
|
||||
if ping -c 1 tudbut.de > /dev/null 2>&1 ; then
|
||||
OFF=0
|
||||
else
|
||||
if [[ $OFF = 1 ]] ; then
|
||||
reboot
|
||||
fi
|
||||
OFF=1
|
||||
fi
|
||||
done
|
||||
) &
|
||||
echo -n " $!" >> /etc/serverpid
|
||||
|
||||
# no dont do that
|
||||
## # Start wificonn service
|
||||
## /bin/wificonn
|
||||
# start dhclient instead
|
||||
#(cd $(cat /etc/server_dir); while true; do java -jar $(cat /etc/server_jar); done) &
|
||||
# Wait 5 seconds
|
||||
sleep 5
|
||||
# Start a thread to make sure the important portfws are running
|
||||
(
|
||||
while true ; do
|
||||
echo Starting remote revpfw
|
||||
echo "echo STARTING; killall revpfw3 && echo KILLED; sleep 2" | ssh -o StrictHostKeyChecking=no root@tudbut.de
|
||||
#echo "cd server ; revpfw3 server 25565 _____ & echo STARTED MCS" | ssh -o StrictHostKeyChecking=no root@tudbut.de &
|
||||
echo "cd server ; revpfw3 server 23 _____ & echo STARTED SSH" | ssh -o StrictHostKeyChecking=no root@tudbut.de &
|
||||
echo "cd server ; revpfw3 server 81 _____ & echo STARTED WEB" | ssh -o StrictHostKeyChecking=no root@tudbut.de &
|
||||
echo "cd server ; revpfw3 server 6667 _____ & echo STARTED IRC" | ssh -o StrictHostKeyChecking=no root@tudbut.de &
|
||||
echo Wait 5 seconds for the portfw servers to start up
|
||||
sleep 5
|
||||
|
||||
echo Connect to portfw servers
|
||||
#revpfw3 client tudbut.de 25565 localhost 25565 _____ &
|
||||
#PID1="$!"
|
||||
PID1=1
|
||||
revpfw3 client tudbut.de 23 localhost 22 _____ &
|
||||
PID2="$!"
|
||||
revpfw3 client tudbut.de 81 localhost 80 _____ &
|
||||
PID3="$!"
|
||||
revpfw3 client tudbut.de 6667 localhost 6667 _____ &
|
||||
PID4="$!"
|
||||
echo Wait 3 seconds for the connections to form
|
||||
sleep 3
|
||||
|
||||
echo Start the IRC bots
|
||||
ircbots
|
||||
echo Wait 0.5 seconds for the IRC bots to start up
|
||||
sleep 0.5
|
||||
|
||||
# Ensure all services are running
|
||||
while kill -0 $PID1 && kill -0 $PID2 && kill -0 $PID3 && kill -0 $PID4 ; do
|
||||
# Wait 1 second to not stress CPU too much
|
||||
sleep 1
|
||||
done
|
||||
# Wait 1 second
|
||||
sleep 1
|
||||
kill $PID2 $PID3 $PID4 # $PID1
|
||||
done
|
||||
) &
|
||||
echo -n " $!" >> /etc/serverpid
|
||||
# bash -c 'cd ~www/cooking && python3 -m http.server 6003' &
|
||||
# while true; do revpfw3 client 8b8t.xyz 6003 localhost 6003 _____ ; sleep 3 ; done &
|
||||
#sleep 30
|
||||
#discordirc
|
||||
while true; do sleep 10; done
|
||||
;;
|
||||
"stop")
|
||||
killall revpfw3
|
||||
# Wait 2 seconds
|
||||
sleep 1
|
||||
kill $(cat /etc/serverpid)
|
||||
sleep 5
|
||||
killall -9 revpfw3
|
||||
kill -9 $(cat /etc/serverpid)
|
||||
killall /etc/init.d/wifi
|
||||
;;
|
||||
esac & disown
|
5
pushkey.sh
Normal file
5
pushkey.sh
Normal file
|
@ -0,0 +1,5 @@
|
|||
#!/bin/sh
|
||||
name=$(cat name.local)
|
||||
|
||||
echo key
|
||||
gpg --export -a "$name"
|
20
read-msg.sh
Normal file
20
read-msg.sh
Normal file
|
@ -0,0 +1,20 @@
|
|||
#!/bin/sh
|
||||
|
||||
read todo
|
||||
|
||||
if [ "$todo" = "" ] ; then
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ "$todo" = "push" ] ; then
|
||||
read filename
|
||||
cat > "$filename"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ "$todo" = "exec" ] ; then
|
||||
read command
|
||||
exec bash -c "$command"
|
||||
fi
|
||||
|
||||
echo "invalid command: $todo"
|
6
recv-msg.sh
Normal file
6
recv-msg.sh
Normal file
|
@ -0,0 +1,6 @@
|
|||
#!/bin/bash
|
||||
|
||||
data="$(bash verify.sh)"
|
||||
c=$?
|
||||
if [ $c != 0 ] ; then exit $c ; fi
|
||||
bash read-msg.sh <<< "$data" || exit 1
|
5
sign.sh
Normal file
5
sign.sh
Normal file
|
@ -0,0 +1,5 @@
|
|||
#!/bin/sh
|
||||
name=$(cat name.local)
|
||||
|
||||
echo data
|
||||
gpg --local-user "$name" --sign -a
|
195
signer.pub
Normal file
195
signer.pub
Normal file
|
@ -0,0 +1,195 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
=/9qg
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
@ -1,21 +0,0 @@
|
|||
"#httpserver/base.spl" import
|
||||
|
||||
func main { exitcode | with args ;
|
||||
def server
|
||||
net:http:Server:new<"::0" 4000> =server
|
||||
"Started listening on ::0:4000" println
|
||||
"ip a:" println
|
||||
|
||||
[ "ip" "a" ] command-wait;
|
||||
|
||||
while { 1 } {
|
||||
server:accept
|
||||
dup :read
|
||||
dup :path println
|
||||
dup :body _str println
|
||||
:write-ok:write-str-body<"">:finish;
|
||||
|
||||
}
|
||||
|
||||
0
|
||||
}
|
|
@ -1,194 +0,0 @@
|
|||
|
||||
"#stream.spl" import
|
||||
"#time.spl" import
|
||||
"#json.spl" import
|
||||
|
||||
def state, network, connections
|
||||
|
||||
[ ^bring-up ] =state
|
||||
"johlg" =network
|
||||
6 =connections
|
||||
|
||||
include json:_StringyJSON in array
|
||||
|
||||
func panic-handler { |
|
||||
catch IO {
|
||||
"status" StreamTypes:file:create<1>
|
||||
dup :write-exact<[ ^dead [ ^panic ] ] :sjson<0> "\n" concat :to-bytes>
|
||||
:close;
|
||||
} { with e ;
|
||||
"fuck.";
|
||||
}
|
||||
}
|
||||
|
||||
func main { exitcode | with args ;
|
||||
start-timer =>? ^ok not if {
|
||||
"error " print :sjson<0> print " in state: " state:sjson<0> concat println
|
||||
"error in timers" panic
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
func start-timer { result |
|
||||
def sa time:unixms =sa
|
||||
1 while { } {
|
||||
1000 time:unixms sa - - dup 0 lt if { pop 0 } time:sleep;
|
||||
time:unixms =sa
|
||||
|
||||
def v
|
||||
timer-run
|
||||
dup :sjson<0>
|
||||
dup println
|
||||
=v
|
||||
catch IO {
|
||||
"status" StreamTypes:file:create<1>
|
||||
dup :write-exact<v "\n" concat :to-bytes>
|
||||
:close;
|
||||
} {
|
||||
[ ^err "no fs access" "status" ] 3 stop
|
||||
}
|
||||
dup => [ ^reboot &=v ] if {
|
||||
"" println
|
||||
"reboot requested because " v concat "." concat println
|
||||
catch IO {
|
||||
"deny-reboot" read-file "no" eq not if {
|
||||
"reboot denied because deny-reboot is set. need manual help"
|
||||
pop [ ^err "reboot denied" ] 3 stop
|
||||
}
|
||||
} { pop }
|
||||
catch IO {
|
||||
"deny-reboot" StreamTypes:file:create<1>
|
||||
dup :write-exact<"yes" :to-bytes>
|
||||
:close;
|
||||
} {
|
||||
[ ^err "no fs access" "deny-reboot" ] 3 stop
|
||||
}
|
||||
while { 1 } {
|
||||
fork<|
|
||||
"status" StreamTypes:file:create<1>
|
||||
dup :write-exact<[ ^dead v ] :sjson<0> "\n" concat :to-bytes>
|
||||
:close;
|
||||
catch {
|
||||
[ "sudo" "reboot" ] command-wait;
|
||||
} { pop }
|
||||
>
|
||||
5000 time:sleep;
|
||||
}
|
||||
}
|
||||
=>? [ ^ok &pop ]
|
||||
}
|
||||
}
|
||||
|
||||
func timer-run { result |
|
||||
def wait-time
|
||||
|
||||
device-present not if {
|
||||
[ ^reboot "device not present" ]
|
||||
2 stop
|
||||
}
|
||||
|
||||
state => [ ^fix-device ] if {
|
||||
fix-device
|
||||
2 stop
|
||||
}
|
||||
|
||||
state => [ ^bring-up ] if {
|
||||
switch-networks =>? [ ^err "nmcli failed" ] if {
|
||||
[ ^fix-device ] =state
|
||||
[ ^ok state ] 3 stop
|
||||
} dup => [ ^ok &pop ] if {
|
||||
3 stop
|
||||
}
|
||||
}
|
||||
|
||||
is-network-up not if {
|
||||
[ ^bring-up ] =state
|
||||
[ ^ok state ] 2 stop
|
||||
}
|
||||
|
||||
state => [ ^waiting &=wait-time ] if {
|
||||
wait-time 0 eq if {
|
||||
[ ^bring-up ] =state
|
||||
[ ^ok state ] 3 stop
|
||||
}
|
||||
[ ^waiting wait-time 1 - ] =state
|
||||
[ ^ok state ] 2 stop
|
||||
}
|
||||
|
||||
state => [ ^connecting &=wait-time ] if {
|
||||
is-network-up if {
|
||||
[ ^waiting 60 20 * ] =state
|
||||
catch IO {
|
||||
"deny-reboot" StreamTypes:file:create<1>
|
||||
dup :write-exact<"no" :to-bytes>
|
||||
:close;
|
||||
} {
|
||||
[ ^err "no fs access" "deny-reboot" ] 4 stop
|
||||
}
|
||||
[ ^ok ^connected ] 3 stop
|
||||
}
|
||||
wait-time 0 eq if {
|
||||
[ ^bring-up ] =state
|
||||
[ ^ok state ] 3 stop
|
||||
}
|
||||
[ ^connecting wait-time -- ] =state
|
||||
[ ^ok state ] 2 stop
|
||||
}
|
||||
|
||||
[ ^err "unknown state" state ]
|
||||
}
|
||||
|
||||
func switch-networks { result |
|
||||
[ ^connecting 10 ] =state
|
||||
|
||||
def b
|
||||
random-byte =>? [ ^ok &=b ] not if { 2 stop }
|
||||
|
||||
b connections % =b
|
||||
|
||||
def conn, hostname
|
||||
network b _str concat =conn
|
||||
conn "-hostname" concat read-file :replace<"\n" ""> =hostname
|
||||
|
||||
"connecting to " conn concat " with hostname " concat hostname concat println
|
||||
|
||||
[ "sudo" "hostnamectl" "set-hostname" hostname ] command-wait
|
||||
[ "sudo" "nmcli" "c" "up" conn ] command-wait or
|
||||
if {
|
||||
[ ^err "nmcli failed" ] 2 stop
|
||||
}
|
||||
|
||||
[ ^ok ^connected ]
|
||||
}
|
||||
|
||||
func device-present { bool |
|
||||
[ "lsusb" ] StreamTypes:cmd:create
|
||||
dup :read-to-end<1024>:to-str
|
||||
dup :contains<"0bda:c811"> swap:contains<"0bda:1a2b"> or swap
|
||||
:close
|
||||
}
|
||||
|
||||
func fix-device { result |
|
||||
[ ^bring-up ] =state
|
||||
[ "sudo" "usb_modeswitch" "-v" "0bda" "-p" "1a2b" "-K" ] command-wait;
|
||||
[ ^ok ^fixing-device ]
|
||||
}
|
||||
|
||||
func is-network-up { |
|
||||
def done 0 =done
|
||||
fork<| 1000 time:sleep; done not if { "ping unsuccessful" println [ "killall" "ping" ] command-wait; } >
|
||||
[ "ping" "-c" "1" "1.1.1.1" ] command-wait 0 _int eq
|
||||
1 =done
|
||||
}
|
||||
|
||||
func random-byte { [result,byte] |
|
||||
catch IO {
|
||||
def b
|
||||
"/dev/urandom" StreamTypes:file:create<0>
|
||||
dup :read-one =b
|
||||
:close;
|
||||
[ ^ok b ]
|
||||
} { with err ;
|
||||
[ ^err err ]
|
||||
}
|
||||
}
|
|
@ -1,107 +0,0 @@
|
|||
"#time.spl" import
|
||||
"#stream.spl" import
|
||||
"#json.spl" import
|
||||
|
||||
include json:_StringyJSON in array
|
||||
include json:_StringyJSON in str
|
||||
|
||||
func main { exitcode | with args ;
|
||||
"scanning network " print args:2 println
|
||||
def nmap
|
||||
[ "sudo" "masscan" "--rate" "1000" "--ping" "--wait" "2" args:2 ] StreamTypes:cmd:create =nmap
|
||||
nmap:read-to-end<1024> _str =nmap
|
||||
|
||||
nmap:split<"\n">:iter =nmap
|
||||
def records, line
|
||||
[ ] =records
|
||||
while { nmap:next dup =line } {
|
||||
line:readf1<"Discovered open port 0/icmp on {} {}"> => &=line if {
|
||||
line awrap records swap aadd =records
|
||||
2 stop
|
||||
}
|
||||
} pop
|
||||
|
||||
"IPs: " println
|
||||
records:foreach<| ("IP: " print) :sjson println>
|
||||
|
||||
"waiting..." println
|
||||
3000 time:sleep;
|
||||
|
||||
"grabbing MACs+Hostnames" println
|
||||
def i 0 =i
|
||||
def newrecords
|
||||
[ ] =newrecords
|
||||
def running [ 0 0 0 0 0 ] =running
|
||||
while { i records:len lt } {
|
||||
"task " print i println
|
||||
while { running:contains<0> not } {
|
||||
500 time:sleep;
|
||||
}
|
||||
running:find<0 awrap> i fork<| with id i ;
|
||||
|
||||
1 id running:set;
|
||||
|
||||
def done [ ] =done
|
||||
def nmap, out, line, ip, hostname
|
||||
[ "sudo" "nmap" "-T4" "-sn" records:get<i> ] StreamTypes:cmd:create =nmap
|
||||
nmap:read-to-end<1024> _str =out
|
||||
[ "sudo" "nmap" "-sn" "-Pn" records:get<i> ] StreamTypes:cmd:create =nmap
|
||||
out nmap:read-to-end<1024> _str concat =nmap
|
||||
|
||||
func submit { | with mac ;
|
||||
0 done:foreach<| ip eq if { pop 1 }> not if {
|
||||
done ip awrap aadd =done
|
||||
newrecords [ ip hostname mac ] awrap aadd =newrecords
|
||||
}
|
||||
null =ip
|
||||
}
|
||||
|
||||
nmap:split<"\n">:iter =nmap
|
||||
while { nmap:next dup =line } {
|
||||
line:readf<"Nmap scan report for {} ({})"> => &=line if {
|
||||
ip null eq not if {
|
||||
"?" submit
|
||||
}
|
||||
line:0 =hostname
|
||||
line:1 =ip
|
||||
2 stop
|
||||
}
|
||||
line:readf1<"Nmap scan report for {}"> => &=ip if {
|
||||
"?" =hostname
|
||||
2 stop
|
||||
}
|
||||
line:readf1<"MAC Address: {} ({})"> => &=line if {
|
||||
line submit
|
||||
2 stop
|
||||
}
|
||||
} pop
|
||||
|
||||
ip null eq not hostname "?" eq not and if {
|
||||
"?" submit
|
||||
}
|
||||
|
||||
0 id running:set;
|
||||
|
||||
> pop pop
|
||||
|
||||
100 time:sleep;
|
||||
|
||||
i ++ =i
|
||||
}
|
||||
while { running:contains<1> } {
|
||||
500 time:sleep;
|
||||
}
|
||||
|
||||
newrecords:foreach<| ("Record: " print) :sjson println>
|
||||
|
||||
"Success rate: " print newrecords:len _float records:len _float / 100 _float * print "%" println
|
||||
|
||||
0
|
||||
}
|
||||
|
||||
func min { min(a,b) | with a b ;
|
||||
a
|
||||
a b gt if {
|
||||
pop b
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
"#stream.spl" import
|
||||
"#json.spl" import
|
||||
|
||||
include json:_StringyJSON in array
|
||||
|
||||
func main { exitcode | with args ;
|
||||
"scanning network " print args:2 println
|
||||
def nmap
|
||||
[ "sudo" "nmap" "-T5" "-sn" args:2 ] StreamTypes:cmd:create =nmap
|
||||
nmap:read-to-end<1024> _str =nmap
|
||||
|
||||
nmap:split<"\n">:iter =nmap
|
||||
def records, hostname, ip, line
|
||||
[ ] =records
|
||||
while { nmap:next dup =line } {
|
||||
line:readf<"Nmap scan report for {} ({})"> => [ &=hostname &=ip ] if {
|
||||
2 stop
|
||||
} pop
|
||||
line:readf1<"Nmap scan report for {}"> => &=ip if {
|
||||
"?" =hostname
|
||||
2 stop
|
||||
} pop
|
||||
line:readf1<"MAC Address: {} ({})"> => &=line if {
|
||||
records [ ip hostname line ] awrap aadd =records
|
||||
2 stop
|
||||
} pop
|
||||
} pop
|
||||
|
||||
records:foreach<| :sjson println>
|
||||
|
||||
0
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
# tudbutde
|
||||
|
||||
This is the host for the following services:
|
||||
- baseband-J
|
||||
- baseband-SPL (download.baseband.com.de)
|
||||
- baseband-website (baseband.com.de)
|
||||
- web-Tryumph (tudbut.de)
|
||||
- TudbuTAPIv3 (????)
|
||||
- qft helper
|
||||
- caddy
|
||||
|
||||
## Iterations
|
||||
|
||||
1. IONOS VPS S (10GB disk) with ubuntu
|
||||
2. IONOS VPS S+ (20GB disk) with ubuntu
|
||||
|
||||
## Users
|
||||
|
||||
- root -> all services
|
31
verify.sh
Normal file
31
verify.sh
Normal file
|
@ -0,0 +1,31 @@
|
|||
#!/bin/sh
|
||||
|
||||
read mode
|
||||
|
||||
|
||||
if [ "$mode" = "key" ] ; then
|
||||
output="$( (exec gpg --import > /dev/null) 2>&1 )"
|
||||
if [ "$?" = 0 ] ; then
|
||||
echo recv ok > /dev/stderr
|
||||
else
|
||||
echo recv bad > /dev/stderr
|
||||
exit 1
|
||||
fi
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ "$mode" = "data" ] ; then
|
||||
|
||||
id=$!
|
||||
stderr="$( (exec gpg -d > /tmp/$id.msg) 2>&1 )"
|
||||
if [ $? = 0 ] && ! grep "WARNING" <<< "$stderr" > /dev/null ; then
|
||||
echo recv sig ok > /dev/stderr
|
||||
else
|
||||
echo recv sig bad > /dev/stderr
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat /tmp/$id.msg
|
||||
|
||||
exit
|
||||
fi
|
Loading…
Add table
Reference in a new issue