Projet

Général

Profil

Netconsole » Historique » Version 14

Version 13 (Laurent GUERBY, 12/08/2017 09:29) → Version 14/17 (Laurent GUERBY, 12/08/2017 09:29)

{{>toc}}

h1. Netconsole

h2. Setup

h3. modprobe client

<pre>
# if needed to remove old netconsole setup
echo 0 > /sys/kernel/config/netconsole/nagios/enabled
rmdir /sys/kernel/config/netconsole/nagios/
rmmod netconsole

#h8
modprobe netconsole netconsole=+@192.168.128.53/eth0,6666@192.168.128.248/b8:ae:ed:70:8b:80
#gcc67
modprobe netconsole netconsole=+@91.224.148.12/enp10s0,6666@89.234.156.171/b8:ae:ed:70:8b:80
#gcc68
modprobe netconsole netconsole=+@91.224.148.13/enp10s0,6666@89.234.156.171/b8:ae:ed:70:8b:80
#gcc68 ipv6 link local
modprobe netconsole netconsole=+@fe80::7285:c2ff:fe3a:167e/enp10s0,6666@fe80::baae:edff:fe70:8b80/b8:ae:ed:70:8b:80
</pre>

h3. TODO

TODO early boot le meme format dans grub https://www.kernel.org/doc/Documentation/networking/netconsole.txt

h3.
nagios asyncio

<pre>
root@nucnagios:~/netconsole# cat asyncio-udp-logger.py
#!/usr/bin/python3

import asyncio
import datetime
import signal
import sys

class NetConsole:
def log(self, *args, **kwargs):
print(sys._getframe().f_code.co_name, args, kwargs)

connection_made = log
error_received = log
connection_lost = log

def datagram_received(self, data, addr):
logfile = "/root/netconsole/" + "-".join([str(s) for s in addr])
with open(logfile, "a") as f:
f.write(datetime.datetime.utcnow().isoformat()+' '+data.decode())

@classmethod
def listen(cls, loop, **kwargs):
return loop.run_until_complete(asyncio.Task(
loop.create_datagram_endpoint(cls, **kwargs)
))

if __name__ == '__main__':

loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGINT, loop.stop)

transportv4, _ = NetConsole.listen(loop, local_addr=("::", 6666))
transportv6, _ = NetConsole.listen(loop, local_addr=("0.0.0.0", 6666))

try:
loop.run_forever()
finally:
transportv4.close()
transportv6.close()
loop.stop()
</pre>

h3. nagios selectors

<pre>
root@nucnagios:~/netconsole# cat selectors-udp-logger.py
#!/usr/bin/python3

import selectors
import socket
import time

DIR="/root/netconsole/"
PORT=6665

sock4 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock4.bind(('0.0.0.0',PORT))

sock6 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock6.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
sock6.bind(('::',PORT))

sel=selectors.DefaultSelector()
sel.register(sock4,selectors.EVENT_READ)
sel.register(sock6,selectors.EVENT_READ)

while True:
events = sel.select()
for key,mask in events:
data, address = key.fileobj.recvfrom(4096)
if len(data)>0 and data[-1]!=10: data+=bytearray([10])
with open(DIR + "-".join([str(PORT)]+[str(s) for s in address]), "a") as f:
try:
f.write(time.strftime("%Y%m%dT%H%M%S")+':'+data.decode())
except Exception as e:
print("Unexpected error:" + str(e))
</pre>

h3. nagios dual

<pre>
# if not managed by supervisord see root@nucnagios:/etc/supervisor/conf.d/*
root@nucnagios:~/netconsole# nohup python3 pyudplogger.py >& log.txt < /dev/null &
root@nucnagios:~/netconsole# nohup python3 pyudplogger6.py >& log6.txt < /dev/null &
</pre>

Source code :

<pre>
root@nucnagios:~/netconsole# cat pyudplogger.py
#!/usr/bin/python3

import socket
import time
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('',6666))
while True:
data, address = sock.recvfrom(4096)
if len(data)>0 and data[-1]!=10: data+=bytearray([10])
ip, port = address
with open("/root/netconsole/" + ip + '-' + str(port), "a") as f:
try:
f.write(time.strftime("%Y%m%dT%H%M%S")+':'+data.decode())
except Exception as e:
print("Unexpected error:" + str(e))
root@nucnagios:~/netconsole# cat pyudplogger6.py
#!/usr/bin/python3

import socket
import time
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
sock.bind(('::',6666))
while True:
data, address = sock.recvfrom(4096)
if len(data)>0 and data[-1]!=10: data+=bytearray([10]) # broken by python2
ip, port, flowinfo, scopeid = address
with open("/root/netconsole/" + ip + '-' + str(port) + '-' + str(flowinfo) + '-' + str(scopeid),"a") as f:
try:
f.write(time.strftime("%Y%m%dT%H%M%S")+':'+data.decode())
except Exception as e:
print("Unexpected error:" + str(e))

</pre>



h3. Client

<pre>
# if needed to remove old netconsole setup
echo 0 > /sys/kernel/config/netconsole/nagios/enabled
rmdir /sys/kernel/config/netconsole/nagios/
rmmod netconsole

#h8
modprobe netconsole netconsole=+@192.168.128.53/eth0,6666@192.168.128.248/b8:ae:ed:70:8b:80
#gcc67
modprobe netconsole netconsole=+@91.224.148.12/enp10s0,6666@89.234.156.171/b8:ae:ed:70:8b:80
#gcc68
modprobe netconsole netconsole=+@91.224.148.13/enp10s0,6666@89.234.156.171/b8:ae:ed:70:8b:80
#gcc68 ipv6 link local
modprobe netconsole netconsole=+@fe80::7285:c2ff:fe3a:167e/enp10s0,6666@fe80::baae:edff:fe70:8b80/b8:ae:ed:70:8b:80
</pre>

h3. TODO

TODO early boot le meme format dans grub https://www.kernel.org/doc/Documentation/networking/netconsole.txt

h2. Old setup

h3. nagios netcat

<pre>
root@nucnagios:~/netconsole# more setup-console.sh
#!/bin/bash

here=$(dirname $(readlink -f $0))
cleanup(){
kill $(jobs -p)
exit 0
}

trap cleanup EXIT

nc -u -l -p 6600 > $here/stri.dmesg 2>&1 &
nc -u -l -p 6601 > $here/g1.dmesg 2>&1 &
nc -u -l -p 6602 > $here/g2.dmesg 2>&1 &
nc -u -l -p 6603 > $here/g3.dmesg 2>&1 &
nc -u -l -p 6604 > $here/g4.dmesg 2>&1 &
nc -u -l -p 6605 > $here/g5.dmesg 2>&1 &
nc -u -l -p 6606 > $here/g6.dmesg 2>&1 &
nc -u -l -p 6607 > $here/n7.dmesg 2>&1 &
nc -u -l -p 6608 > $here/g8.dmesg 2>&1 &
nc -u -l -p 6609 > $here/g9.dmesg 2>&1 &
nc -u -l -p 6610 > $here/g10.dmesg 2>&1 &
nc -u -l -p 6611 > $here/g11.dmesg 2>&1 &
nc -u -l -p 6612 > $here/g12.dmesg 2>&1 &
nc -u -l -p 6613 > $here/g13.dmesg 2>&1 &
nc -u -l -p 6614 > $here/g14.dmesg 2>&1 &
nc -u -l -p 6615 > $here/g15.dmesg 2>&1 &
nc -u -l -p 6616 > $here/g16.dmesg 2>&1 &

echo "netconsole listener running"
wait

root@nucnagios:~/netconsole# nohup ./setup-console.sh >& /dev/null < /dev/null &
</pre>

h3. old g1

<pre>
root@g1:~# more /etc/rc.local

declare -A netconsole_cfg

netconsole_cfg["g1"]="192.168.128.201:6601"

# Setup some helper vars
h=$(hostname -s)
netconsole_path=/sys/kernel/config/netconsole/nagios
netconsole_ip=$(echo ${netconsole_cfg[$h]} | awk -F: '{print $1}')
netconsole_port=$(echo ${netconsole_cfg[$h]} | awk -F: '{print $2}')
netconsole_int=$(echo ${netconsole_cfg[$h]} | awk -F: '{print $3}')
netconsole_int=${netconsole_int:-eth2}

# NETCONSOLE interface
[ "${netconsole_cfg[$h]}" ] && ip a a $netconsole_ip/24 dev $netconsole_int

# Setup netconsole
modprobe configfs
modprobe netconsole
mount | grep -q configfs || mount none -t configfs /sys/kernel/config
mkdir -p $netconsole_path
if [ "${netconsole_cfg[$h]}" ]; then
echo 0 > $netconsole_path/enabled
echo $netconsole_int > $netconsole_path/dev_name
echo $netconsole_ip > $netconsole_path/local_ip
echo $netconsole_port > $netconsole_path/local_port
echo "192.168.128.248" > $netconsole_path/remote_ip
echo "b8:ae:ed:70:8b:80" > $netconsole_path/remote_mac
echo 1 > $netconsole_path/enabled
sleep 1
echo m > /proc/sysrq-trigger # test-it
fi
</pre>

h3. old gcc67

<pre>
modprobe configfs
modprobe netconsole
#mount none -t configfs /sys/kernel/config
netconsole_path=/sys/kernel/config/netconsole/nagios
mkdir -p $netconsole_path
echo 0 > $netconsole_path/enabled
echo enp10s0 > $netconsole_path/dev_name
echo 91.224.148.12 > $netconsole_path/local_ip
echo 6615 > $netconsole_path/local_port
echo 6615 > $netconsole_path/remote_port
echo "89.234.156.171" > $netconsole_path/remote_ip
echo "b8:ae:ed:70:8b:80" > $netconsole_path/remote_mac
echo 1 > $netconsole_path/enabled
sleep 1
echo m > /proc/sysrq-trigger # test-it
</pre>

h3. old gcc68

<pre>
modprobe configfs
modprobe netconsole
mount none -t configfs /sys/kernel/config
netconsole_path=/sys/kernel/config/netconsole/nagios
mkdir -p $netconsole_path
echo 0 > $netconsole_path/enabled
echo enp10s0 > $netconsole_path/dev_name
echo 91.224.148.13 > $netconsole_path/local_ip
echo 6616 > $netconsole_path/local_port
echo 6616 > $netconsole_path/remote_port
echo "89.234.156.171" > $netconsole_path/remote_ip
echo "b8:ae:ed:70:8b:80" > $netconsole_path/remote_mac
echo 1 > $netconsole_path/enabled
sleep 1
echo m > /proc/sysrq-trigger # test-it
</pre>