XRpi interfacing with LinFBB

Software is available on this link

Wow, found great software. Yes I know, it has been around for a while. I thought it would be nice to keep me busy on a rainy Saturday. So let’s interface it with LinFBB.

It actually works a bit like BPQ32 and LinFBB with WA8DED emulation. But for XRouter and LinFBB we need a virtual comport. We can make these easily with socat.

sudo apt install socat

Now lets create some comports

# Create pty pair
socat -d -d -ly PTY,link=/home/pi/xrpi/ttyq1 PTY,link=/home/pi/xrpi/ptyq1 &
sleep 2

I have chosen to create this as a normal user and put it in the directory /home/pi/xrpi/. Now as a normal user I can access and use them. I am never much of a fan of doing everything as a Root user.

Now lets configure XRouter.

INTERFACE=5
	TYPE=ASYNC
	COM=/home/pi/xrpi/ttyq1
	PROTOCOL=DEDHOST
	APPLNUM=1
	CHANNELS=4
	SPEED=57600
	FLOW=0
	MTU=256
ENDINTERFACE

APPL=1
	APPLNAME=FBB
	APPLCALL=PI8LAP-1
	APPLALIAS=LAPFBB
	APPLQUAL=254
	APPLFLAGS=4
ENDAPPL

Next is LinFBB… port.sys

# FBB7.0.8-beta8
#
#Ports TNCs
 1     1
#
#Com Interface Adress (Hex)       Baud
1  	 9        /home/pi/xrpi/ptyq1    57600
 
#TNC NbCh Com MultCh Pacln Maxfr NbFwd MxBloc M/P-Fwd Mode  Freq
 0   0    0   0      0     0     0     0      00/01   ----  File-fwd.
1   4    1   1      236   4     1     10     00/15 DUWYL XRpi

Now fist create a start file for XRpi

# First kill running process of socat
sudo kill $(ps aux | grep '[s]ocat' | awk '{print $2}')
# Create pty pair
socat -d -d -ly PTY,link=/home/pi/xrpi/ttyq1 PTY,link=/home/pi/xrpi/ptyq1 &
sleep 2
# Start XRpi(1)
sudo setcap cap_net_raw,cap_net_bind_service=pe xrpi
./xrpi

1. As Normal user, it will need CAP_NET_RAW capability in order to use TCP/IP via the LAN, WiFi or localhost. And it will need CAP_NET_BIND_SERVICE if you wish to open any “service ports” on the linux TCP/IP stack whose numbers are below 1024.

First we have to start XRpi because of course the virtual comports have to be created. After this it is LinFBB’s turn. Now is the time to test.

The link with BPQ32 is also online. Also with virtual comports.

And yes, there is the old trusted LinFBB.

The possibilities are endless with this software. So there goes me free Saturday again.

MHSave and Python

Today I am playing with Python and Matplotlib. In BPQ32 you have the option to save the Most Heard list (MH) when you close BPQ32. This contains a lot of data that you can use. Above I made a plot of the received stations and the number of packets I received at 14.1022Mhz + 1000Hz at 300Baud. Now I am not a world programmer, so this could probably be easier or different. Below the script I have written and used.

#!/usr/bin/python3
import re, csv, zlib
import matplotlib.pyplot as plt
import numpy as np

#First get the data form the right port. 14.1022Mhz 300 Baud HF Packet

port4 = []

with open("MHSave.txt") as f:
        found_port4 = False

        for line in f:
                if line.startswith("Port:4"):

                        found_port4 = True

                if found_port4:
                        if line.startswith("Port:5"):
                                break
                        else:
                                mod_string = line.replace('||', '')
                                mod_strings = re.sub("via.*$", "", mod_string)
                                port4.append(mod_strings.rstrip('\n'))

with open('port4.txt', 'w') as fout:
        fout.writelines("\n".join(port4[1:]))

#print("\n".join(port4))

# Convert it to a csv file
with open('port4.txt', 'r') as in_file:
    lines = in_file.read().splitlines()
    stripped = [line.replace(","," ").split() for line in lines]
    grouped = zip(*[stripped]*1)
    with open('port4.csv', 'w') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('Epoch', 'Pack-rev', 'Call', 'Month', 'Day', 'Time'))
        for group in grouped:
            writer.writerows(group) 

# Matplotlib create a nice Plot of the received calls

filename = 'port4.csv'
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    #Get Packets and Calls received
    packs, calls = [], []
    for row in reader:
        pack = int(row[1])
        call = str(row[2])
        packs.append(pack)
        calls.append(call)

x = np.arange(len(calls))

fig, ax = plt.subplots()

ax.barh(x, packs, align='center')
ax.set_title("Call and Packets received on PI1LAP")
ax.set_xlabel('Received Packets')
ax.set_ylabel('Station Callsigns')
ax.set_xticks(packs, minor=True)
ax.set_yticks(x)
ax.set_yticklabels(calls)
plt.tight_layout()
plt.show()

Bpq32 with QtSoundModem and Hamlib

Yesterday I added 2 HF ports to my Bpq32 Node / BBS. I have chosen to use QtSoundModem and Hamlib. QtSoundModem is a Linux port or Soundmodem from UZ7HO. I use Hamlib/rigctld to take control of the Tranceiver. QtSoundmodem and Hamlib run on a different Raspberry than the BBS and Node.

After some testing I found out that I need Hamlib version 3.3 to control the icom 7300. The versions 4.0 and 4.1 do not work for me. Apparently the icom 7300 is not being initialized. Can’t actually find out why this is. With the command “rigctld -l” you get a list of which tranceivers are supported.

So I need number 373 for the Icom 7300.

/usr/local/bin/rigctld -m 373 -r /dev/ttyUSB0 -s 19200 -T 44.137.31.76 -t 4532 &

In the QtSoundModem.ini I have in the [Init] section.

HamLibHost=44.137.31.76
HamLibPort=4532
PTT=HAMLIB
PTTBAUD=19200
PTTMode=17

Now the bpq32.cfg

PORT
 PORTNUM=4
 ID=14.1022 +1100Hz
 DRIVER=UZ7HO
 CHANNEL=A
 PACLEN=80
 CONFIG
  ADDR 44.137.31.76 8101 ; AGW port of QtSoundModem
  BEACONAFTERSESSION
  MAXSESSIONS=5
ENDPORT

PORT
 PORTNUM=5
 ID=14.1022 +2000Hz
 DRIVER=UZ7HO
 CHANNEL=B
 PACLEN=80
 CONFIG
  ADDR 44.137.31.76 8101 ; AGW port of QtSoundModem
  BEACONAFTERSESSION
  MAXSESSIONS=5
ENDPORT

With Hamlib it is also possible to control the TRX from Bpq32. I immediately added a Robust 300 packet port to Bpq32 with rig control. Here is an example.

PORT
 PORTNUM=3
 ID=Robust 300 ;(RPR Packet)
 TYPE=EXTERNAL 
 COMPORT=/dev/ttyUSB0
 SPEED=38400
 DRIVER=SCSTracker
 INTERLOCK=3
 CONFIG
 RIGCONTROL
HAMLIB 44.137.31.76:4532
15,14.1022,USB,F1,R1,H1
15,7.04510,USB,F1,R1,H1
****
WL2KREPORT PUBLIC, api.winlink.org, 80, PI8LAP-10, JO11VN, 00-23, 14102200, ROBUST, 25, 35, 3
WL2KREPORT PUBLIC, api.winlink.org, 80, PI8LAP-10, JO11VN, 00-23, 14102200, PKT300, 25, 35, 3
WL2KREPORT PUBLIC, api.winlink.org, 80, PI8LAP-10, JO11VN, 00-23, 144850000, PKT1200, 10, 20, 5, 0
WL2KREPORT PUBLIC, api.winlink.org, 80, PI8LAP-10, JO11VN, 00-23, 430950000, PKT9600, 10, 20, 5, 0
;#
  M UISC
  O 4                   ; MAXFRAME
  F 190                 ; FRACK
  T 8                   ; TX Delay
  FORCE ROBUST
  USEAPPLCALLS          ; Accept connects to all APPLCALLS
  BEACONAFTERSESSION    ; Beacon after session
  %L 1500               ; Centre Freq for Normal Packet (Default is 1500)
  @I 64                 ; Paclen = 60
  %T 1                  ; TX Autotracking 1 = on
  %N 10
  %B 300
ENDPORT

/var/log/syslog

Apr  4 16:34:41 pi1lap : Initialising Port 01     TCPKISS IP 127.0.0.1 Port 8001 Chan A
Apr  4 16:34:41 pi1lap : Initialising Port 02     TCPKISS IP 127.0.0.1 Port 8001 Chan B
Apr  4 16:34:41 pi1lap : Initialising Port 03     SCSTRK /dev/ttyUSB0
Apr  4 16:34:41 pi1lap : Initialising Port 04     UZ7HO Host 44.137.31.76 Port 8101 Chan A
Apr  4 16:34:41 pi1lap : Initialising Port 05     UZ7HO Host 44.137.31.76 Port 8101 Chan B
Apr  4 16:34:41 pi1lap : Initialising Port 06     ASYNC /dev/ttyUSB1 Chan A

 

Dx Cluster PI1LAP-1

PI1LAP is Running DXSpider as Cluster Software. With Postgresql as database backend for Web Cluster http://dx.packet-radio.nl

PI1LAP is also connected to the Reverse Beacon Network (RBN). Now it is possible to see (Live) Spots from CW, BEACON, RTTY, PSK, FT8 and FT4.
Connect to PI1LAP-1 (telnet dx.packet-radio.nl 7300) and give the command “help set/skimmer” to get help about the skimmer feed.

The skimmer feed from CW and FT8 / FT4 can be overwhelming. Now there are all kinds of possibilities to filter this to specific spots. Filter help use the command “help filter” on the cluster.

# Possible Filter
To only allow FT4 spots you can use a filter
set/skimmer ft
reject/rbn 1 info ft8
show/filter # Show the rules in the filter
clear/rbn 1 or all # Delete filter rule

If you like Dx spots (just like me) you can go to “telnet dx.packet-radio.nl 7300

See ya on the Cluster.

Website DxSpider http://www.dxcluster.org/

Lcd Display on a PI

After a busy period, I finally have a bit  “Me Time” again.

David KI6ZHD (drache), has written a fantastic article about setting up and configuring a RaspBerry PI. This article also contains a piece about setting up an LCD display at the GPIO port of the Raspberry PI.

This can be read here.
http://www.trinityos.com/HAM/CentosDigitalModes/RPi/rpi2-setup.html#60a.appendix-i2c-lcd

I have ordered a 20×4 LCD display and an I2C LCD interface on the internet.The price was $ 14.96 including shipping costs. Nice.

Take the time to read this good article.

http://www.trinityos.com/HAM/CentosDigitalModes/RPi/rpi2-setup.html

Raspberry PI 3 model A+

Came across the new Raspberry PI 3 Model A +
Look very nice

Specificaties

  • Processor: Broadcom BCM2837B0, Cortex-A53 64-bit SoC @ 1.4GHz
  • Geheugen: 512MB LPDDR2 SDRAM
  • Connectiviteit:
    • 2.4GHz en 5GHz 802.11b/g/n/ac WiFi
    • Bluetooth 4.2 / BLE
    • 1x USB 2.0 poort
  • Uitbreiding: 40-pin GPIO header
  • Video & Geluid:
    • 1x full-size HDMI
    • DSI display poort
    • DSI camera poort
    • 4-polige 3.5mm jack voor stereo audio en composiet video
  • Multimedia: H.264, MPEG-4 decode (1080p30); H.264 encode (1080p30); OpenGL ES 1.1, 2.0 graphics
  • Stroomvoorziening:
    • 5V / 2.5A DC via microUSB
    • 5V DC via GPIO header
  • Afmetingen: 65x56x8.5mm
  • Gewicht: 29g

https://www.raspberrypi.org/blog/new-product-raspberry-pi-3-model-a/

Update start script

I have update the start script for pi1lap/pi8lap. I have add start/stop/restart/status in it.
The disadvantage of this script is if you for example make an adjustment in axport you have to stop and restart the whole system. Maybe divide into smaller parts.

Ok lets check the status.

root@linux:/etc/ax25# ./ax-start status
Checking for fbb daemon: No, fbb is down :(
Checking for ax25d daemon: No, ax25d is down :(
Checking for netromd daemon: No, netromd is down :(
Checking for ax25rtd daemon: No, ax25rtd is down :(
Checking for flexd daemon: No, flexd is down :(
Checking for mheardd daemon: No, mheardd is down :(
Checking for ax25ipd daemon: No, ax25ipd is down :(
Checking for ax25udp daemon: No, ax25udp is down :(
Checking for linuxnet node: No, linuxnet node is down :(
Checking for jnos bbs: No, jnos is down :(
Checking for kissattach: No, kissattach is down :(
Checking for slattach: No, slattach is down :(
Checking for kissnetd: No, kissnetd is down :(
Checking for mkiss: No, mkiss is down :(
Checking for socat: No, socat is down :(
Checking for rstatrxd: No, rstatrxd is down :(
root@linux:/etc/ax25#

Now let start the system.

root@linux:/etc/ax25# ./ax-start start
Starting ax0
ax0     PI1LAP-1        9600    128     4       144.850Mhz 1k2
AX.25 port ax0 bound to device ax0
start Done
Starting ax1
ax1     PI1LAP-2        9600    128     4       430.950Mhz 9k6
AX.25 port ax1 bound to device ax1
start Done
Starting ax2
ax2     PI1LAP-3        19200   128     4       Link local BBS pi8lap
AX.25 port ax2 bound to device ax2
start Done
Starting ax3
ax3     PI1LAP-6        19200   128     4       Link local Dx pi1lap-4
AX.25 port ax3 bound to device ax3
start Done
Starting ax4
ax4     PI1LAP-8        19200   256     2       AX25/udp via pi1lap-8
AX.25 port ax4 bound to device ax4
start Done
Starting ax5
ax5     PI1LAP-9        19200   256     2       AX25/ip via pi1lap-9
AX.25 port ax5 bound to device ax5
start Done
Starting ax6
ax6     PD9Q-7         19200   256     2       Link local Jnos p9q
AX.25 port ax6 bound to device ax6
start Done
Starting rose0
rose0  2040330113  ROSE port 330113
Rose port rose0 bound to device rose0
start Done
Starting nr0
nr0      PI1LAP-5       LAPURO  236     Uronode PI1LAP-15
NET/ROM port nr0 bound to device nr0
start Done
Starting nr1
nr1      PI8LAP         LAPBBS  236     Fbb BBS PI8LAP
NET/ROM port nr1 bound to device nr1
start Done
Starting nr2
nr2      PI1LAP-4       LAPDX   236     DxSpider PI1LAP-4
NET/ROM port nr2 bound to device nr2
start Done
Starting nr3
nr3      PI1LAP-7       LAPPAC  236     FPAC node PI1LAP-7
NET/ROM port nr3 bound to device nr3
start Done
Starting ax25d daemon
start Done
Starting mheardd daemon
start Done
Starting ax25rtd daemon
start Done
Starting flexd daemon
FlexD started.
start Done
Starting netromd daemon
start Done
Starting FBB daemon
Checking fbb tree.... Ok
Checking fbb configuration :
FBB options : -s -a
Running XFBB in background mode ^C to abort
Starting XFBB (pwd = /usr/local/var/ax25/fbb)...

Now look at the status

root@linux:/etc/ax25# ./ax-start status
Checking for fbb daemon: Yes, fbb is up :)
Checking for ax25d daemon: Yes, ax25d is up :)
Checking for netromd daemon: Yes, netromd is up :)
Checking for ax25rtd daemon: Yes, ax25rtd is up :)
Checking for flexd daemon: Yes, flexd is up :)
Checking for mheardd daemon: Yes, mheardd is up :)
Checking for ax25ipd daemon: Yes, ax25ipd is up :)
Checking for ax25udp daemon: Yes, ax25udp is up :)
Checking for linuxnet node: Yes, linuxnet is up :)
Checking for jnos bbs: Yes, jnos is up :)
Checking for kissattach: Yes, kissattach is up :)
Checking for slattach: Yes, slattach is up :)
Checking for kissnetd: Yes, kissnetd is up :)
Checking for mkiss: No, mkiss is down :(
Checking for socat: Yes, socat is up :)
Checking for rstatrxd: Yes, rstatrxd is up :)

Here you see that “mkiss” is down. That is because I do not use “mkiss” at the moment.

Ok, now we will stop the system

root@linux:/etc/ax25# ./ax-start stop
Shutting down jnos bbs
Shutting down FBB script
Shutting down FBB daemon
Shutting down mheardd daemon
Shutting down netromd daemon
Shutting down ax25d daemon
Shutting down ax25ipd daemon
Shutting down ax25upd daemon
Shutting down rstatrxd daemon
Shutting down ax25rtd daemon
Shutting down mkiss daemon
mkiss: no process found
Shutting down kissattach daemon
Shutting down kissnetd daemon
Shutting down slattach daemon
Shutting down socat daemon
Shutting down beacon daemon
Shutting down flexd daemon
Shutting down netrom ports
Shutting down ax ports
Shutting down rose ports
stop Failed

Here you see that stopping has failed, this is because “mkiss” can not be stopped.

Here is the start script

#!/bin/bash
# Start AX25/Netrom networking daemons.
# Script written and modified by Niels pd9q
# Date of last modification: 11-14-2018

### BEGIN INIT INFO
# Provides:       ax25
# Required-Start: $network $remote_fs $syslog
# Required-Stop:  $network $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Description:    AX25 server
### END INIT INFO
# Add some color
green='\e[0;32m'
red='\e[0;31m'
reset='\e[0m'

set +e   # Don't exit on error status

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/xnet:/usr/local/etc/ax25:/home/pd2lt/jnos

DESC="AX25 server"

ENABLED=1

base=${0##*/}
link=${base#*[SK][0-9][0-9]}

test $link = $base && AX_START=yes
test "$AX_START" = yes || exit 0
test -x /usr/local/etc/ax25/ax-start || exit 0

return="Done"
case "$1" in
  start)
        modprobe mkiss
        modprobe ax25
        modprobe netrom
	modprobe rose


	# Dual port TNC KPC-9612
	#mkiss -s 9600 -x 2 /dev/ttyUSB0 > /tmp/unix98
	#export PTS0=`more /tmp/unix98 | grep -w /dev | cut -b -11`
	#export PTS1=`more /tmp/unix98 | grep -w /dev | cut -b 12-`
	#sleep 1
	# Port 1k2 144.850Mhz
	echo "Starting ax0 "
        if grep ax0 /etc/ax25/axports ; then
                kissattach /dev/ttyUSB0 ax0 || return=$rc_failed

        	ifconfig ax0 44.137.31.73 netmask 255.255.255.224
       		sleep 2
        else
                echo  "Error ax0 not found in the file axports"
                return="Failed"
        fi
        echo "$1 $return"

	# Port 9k6 430.950Mhz
	echo "Starting ax1 "
        if grep ax1 /etc/ax25/axports ; then
                kissattach /dev/ttyUSB1 ax1 || return=$rc_failed

                ifconfig ax1 44.137.31.73 netmask 255.255.255.224
                sleep 2
        else
                echo  "Error ax1 not found in the file axports"
                return="Failed"
        fi
        echo "$1 $return"

	# link local pi8lap (xnet)
	echo "Starting ax2 "
	if grep ax2 /etc/ax25/axports ; then
	tmpfile="/tmp/$$.startax2.pts"
	kissnetd -p 2 > "$tmpfile" &
	sleep 2
	attachthem () {
		read PTS1 PTS2
        	kissattach -l $PTS1 ax2 44.137.31.73 || return=$rc_failed
		ifconfig ax2 44.137.31.73 netmask 255.255.255.224 up
        	sleep 1
        	sed -i "s,attach sdev3 kiss 3 1 19200 /dev/.*$,attach sdev3 kiss 3 1 19200 $PTS2," /usr/local/xnet/AUTOBOOT.NET
	}

	tail -n 1 $tmpfile | attachthem
	rm $tmpfile
	sleep 3
	else
                echo  "Error ax2 not found in the file axports"
                return="Failed"
        fi
        echo "$1 $return"

	# Link local pi1lap-4 (xnet)
	echo "Starting ax3 "
        if grep ax3 /etc/ax25/axports ; then
	tmpfile="/tmp/$$.startax3.pts"
	kissnetd -p 2 > "$tmpfile" &
	sleep 2
	attachthem () {
        	read PTS1 PTS2
        	kissattach -l $PTS1 ax3 44.137.31.73 || return=$rc_failed
		ifconfig ax3 44.137.31.73 netmask 255.255.255.224 up
        	sleep 1
        	sed -i "s,attach sdev4 kiss 4 1 19200 /dev/.*$,attach sdev4 kiss 4 1 19200 $PTS2," /usr/local/xnet/AUTOBOOT.NET
	}

	tail -n 1 $tmpfile | attachthem
	rm $tmpfile
	sleep 3
	else
                echo  "Error ax3 not found in the file axports"
                return="Failed"
        fi
        echo "$1 $return"

	# create slip link Linux <-> Xnet
	socat -d -d -ly PTY,link=/dev/ttyq1 PTY,link=/dev/ptyq1 &
	sleep 2
		slattach -s 38400 -p slip /dev/ptyq1 &
        	sleep 1
        	ifconfig sl0 44.137.31.69 netmask 255.255.255.255 pointopoint 44.137.31.70 mtu 236 up
        	sleep 1

	# create axudp device
	socat -d -d -ly PTY,link=/dev/ttyq2 PTY,link=/dev/ptyq2 &
	sleep 2
	echo "Starting ax4 "
        if grep ax4 /etc/ax25/axports ; then
		kissattach -m 256 /dev/ptyq2 ax4 44.137.31.73 || return=$rc_failed
		ax25udp -c /etc/ax25/ax25ipd-10093.conf > /tmp/axudp
		ifconfig ax4 44.137.31.73 netmask 255.255.255.224 up
	sleep 1
	else
                echo  "Error ax4 not found in the file axports"
                return="Failed"
        fi
        echo "$1 $return"

	# create axip device
        socat -d -d -ly PTY,link=/dev/ttyq3 PTY,link=/dev/ptyq3 &
        sleep 2
	echo "Starting ax5 "
        if grep ax5 /etc/ax25/axports ; then
        	kissattach -m 256 /dev/ptyq3 ax5 44.137.31.73 || return=$rc_failed
        	ax25ipd -c /etc/ax25/ax25ipd-axip.conf > /tmp/axip
        	ifconfig ax5 44.137.31.73 netmask 255.255.255.224 up
	sleep 1
	else
                echo  "Error ax5 not found in the file axports"
                return="Failed"
        fi
        echo "$1 $return"

	# create socat device (jnos-uro)
        socat -d -d -ly PTY,link=/dev/ttyq4 PTY,link=/dev/ptyq4 &
	sleep 2
	echo "Starting ax6 "
        if grep ax6 /etc/ax25/axports ; then
		kissattach -m 256 /dev/ptyq4 ax6 44.137.31.73 || return=$rc_failed
                ifconfig ax6 44.137.31.73 netmask 255.255.255.224 up
	sleep 1
	else
                echo  "Error ax6 not found in the file axports"
                return="Failed"
        fi
        echo "$1 $return"

	# attach rose port
	echo "Starting rose0 "
        if grep rose0 /etc/ax25/rsports ; then
        	rsattach rose0 || return=$rc_failed
        	ifconfig rose0 44.137.31.73 netmask 255.255.255.224
        	rsparms -call PI1LAP-10
	else
                echo  "Error rose0 not found in the file rsports"
                return="Failed"
        fi
        echo "$1 $return"

	# MFnos running in DOSEmu
	# Set the comport in de file /etc/dosemu/dosemu.comf $_com1 = "dev/ttyq5"
	#socat -d -d -ly PTY,link=/dev/ttyq5 PTY,link=/dev/ptyq5 &
	#	slattach -n -q -p slip -s 38400 /dev/ptyq5 &
        #sleep 2
	# KISS inteface for MFnos / slip
        #	kissattach /dev/ptyq5 ax6 44.137.31.73
        #	kissparms -p ax6 -c 1 -f y -t 10 -s 100 -r 255
        #	axparms -setcall ax6 pi1lap-10
	#
        #	ifconfig ax3 44.88.0.9 netmask 255.255.255.224 up
	#sleep 2

	# create nr0 device (lapuro/pi1lap-5) uronode
	echo "Starting nr0 "
        if grep nr0 /etc/ax25/nrports ; then
	        ifconfig nr0 down
        	nrattach -i 44.137.31.73 -m 512 nr0 || return=$rc_failed
        	ifconfig nr0 44.137.31.73 netmask 255.255.255.224 hw netrom PI1LAP-5 up
	else
                echo  "Error nr0 not found in the file nrports"
                return="Failed"
        fi
        echo "$1 $return"

	# create nr1 device (lapbbs/pi8lap) f6fbb
        echo "Starting nr1 "
        if grep nr1 /etc/ax25/nrports ; then
		ifconfig nr1 down
        	nrattach -i 44.137.31.73 -m 512 nr1 || return=$rc_failed
        	ifconfig nr1 44.137.31.73 netmask 255.255.255.224 hw netrom PI8LAP up
	else
                echo  "Error nr1 not found in the file nrports"
                return="Failed"
        fi
        echo "$1 $return"

	# create nr2 device (lapdx/pi1lap-4) dxspider
        echo "Starting nr2 "
        if grep nr2 /etc/ax25/nrports ; then
		ifconfig nr2 down
        	nrattach -i 44.137.31.73 -m 512 nr2 || return=$rc_failed
        	ifconfig nr2 44.137.31.73 netmask 255.255.255.224 hw netrom PI1LAP-4 up
	else
                echo  "Error nr2 not found in the file nrports"
                return="Failed"
        fi
        echo "$1 $return"

	# create nr3 device (lappac/pi1lap-7) fpac
        echo "Starting nr3 "
        if grep nr3 /etc/ax25/nrports ; then
		ifconfig nr3 down
        	nrattach -i 44.137.31.73 -m 512 nr3 || return=$rc_failed
        	ifconfig nr3 44.137.31.73 netmask 255.255.255.224 hw netrom PI1LAP-7 up
	else
                echo  "Error nr3 not found in the file nrports"
                return="Failed"
        fi
        echo "$1 $return"

	# start xnet
	cd /usr/local/xnet
	rm *.CFG &> /dev/null
	sleep 2
	./linuxnet < /dev/tty2 > /dev/tty2 2>&1 &
	./rstatrxd /var/www/cgi-bin/postat/ &> /dev/null &
	sleep 2

	# start jnos
	cd /home/pd9q/jnos
	./startnos </dev/tty3>/dev/tty3 2>&1 &
	sleep 3

	# route
	# Xnet route
	ip route add 44.137.31.70 dev sl0 table 44 src 44.137.31.69
	# Mfnos route to 192.168.1.110
	#route add 44.137.31.75 gw 192.168.1.112

	# beacons
		beacon -c PI1LAP-15 -t 10 -d  ID ax0 "Network node PI1LAP-15 Zeeland, JO11VN" &
        beacon -c PI1LAP-15 -t 10 -d  ID ax1 "Network node PI1LAP-15 Zeeland, JO11VN" &
        beacon -c PI1LAP-15 -t 10 -d  ID ax2 "Network node PI1LAP-15 Zeeland, JO11VN" &
        beacon -c PI1LAP-15 -t 10 -d  ID ax3 "Network node PI1LAP-15 Zeeland, JO11VN" &

	# start ax25 deamons
	echo "Starting ax25d daemon "
        if [ -f /usr/local/etc/ax25/ax25d.conf ] ; then
                /usr/local/sbin/ax25d || return=$rc_failed
        else
                echo  "/usr/local/etc/ax25/ax25d.conf file not found"
                return="Failed"
        fi
        echo "$1 $return"

	echo "Starting mheardd daemon "
        /usr/local/sbin/mheardd
	echo "$1 $return"

	echo "Starting ax25rtd daemon "
        if [ -f /usr/local/etc/ax25/ax25rtd.conf ] ; then
                /usr/local/sbin/ax25rtd || return=$rc_failed
        else
                echo  "/usr/local/etc/ax25/ax25rtd.conf file not found"
                return="Failed"
        fi
        echo "$1 $return"

	echo "Starting flexd daemon "
        if [ -f /usr/local/etc/ax25/flexd.conf ] ; then
                /usr/local/sbin/flexd || return=$rc_failed
        else
                echo  "/usr/local/etc/ax25/flexd.conf file not found"
                return="Failed"
        fi
        echo "$1 $return"

	echo "Starting netromd daemon "
        if [ -f /usr/local/etc/ax25/nrports ] ; then
                /usr/local/sbin/netromd -c -i -p 1 -t 15 || return=$rc_failed
        else
                echo  "/usr/local/etc/ax25/nrports file not found"
                return="Failed"
        fi
        echo "$1 $return"

	echo "Starting FBB daemon "
        if [ -f /usr/local/etc/ax25/fbb/fbb.conf ] ; then
                /usr/local/sbin/fbb -s -a -l /etc/ax25/fbb.log || return=$rc_failed
        else
                echo  "/usr/local/etc/ax25/fbb/fbb.conf file not found"
                return="Failed"
        fi
        echo "$1 $return"
        ;;

 stop)
        kill $(ps aux | grep '[l]inuxnet' | awk '{print $2}')
	echo "Shutting down jnos bbs"
        killall -KILL jnos || return="Failed"
	echo "Shutting down FBB script"
        killall -KILL fbb || return="Failed"
        echo "Shutting down FBB daemon"
        killall -KILL xfbbd || return="Failed"
        echo "Shutting down mheardd daemon"
        killall -KILL mheardd || return="Failed"
	echo "Shutting down netromd daemon"
        killall -KILL netromd || return="Failed"
	echo "Shutting down ax25d daemon"
        killall -KILL ax25d || return="Failed"
	echo "Shutting down ax25ipd daemon"
        killall -KILL ax25ipd || return="Failed"
	echo "Shutting down ax25upd daemon"
        killall -KILL ax25udp || return="Failed"
	echo "Shutting down rstatrxd daemon"
        killall -KILL rstatrxd || return="Failed"
	echo "Shutting down ax25rtd daemon"
        killall -KILL ax25rtd || return="Failed"
	echo "Shutting down mkiss daemon"
        killall -KILL mkiss || return="Failed"
	echo "Shutting down kissattach daemon"
        killall -KILL kissattach || return="Failed"
	echo "Shutting down kissnetd daemon"
        killall -KILL kissnetd || return="Failed"
	echo "Shutting down slattach daemon"
        killall -KILL slattach || return="Failed"
	echo "Shutting down socat daemon"
        killall -KILL socat || return="Failed"
	echo "Shutting down beacon daemon"
        killall -KILL beacon || return="Failed"
	echo "Shutting down flexd daemon"
        killall -KILL flexd || return="Failed"
	echo "Shutting down netrom ports"
        ifconfig nr0 down || return="Failed"
        ifconfig nr1 down || return="Failed"
        ifconfig nr2 down || return="Failed"
        ifconfig nr3 down || return="Failed"
	echo "Shutting down ax ports"
        ifconfig ax0 down || return="Failed"
        ifconfig ax1 down || return="Failed"
        ifconfig ax2 down || return="Failed"
        ifconfig ax3 down || return="Failed"
        ifconfig ax4 down || return="Failed"
        ifconfig ax5 down || return="Failed"
	echo "Shutting down rose ports"
	ifconfig rose0 down || return="Failed"
        ifconfig rose1 down || return="Failed"
	sleep 4
        echo "$1 $return"
        ;;
restart|reload)
        $0 stop && $0 start
        ;;
status)
        echo -n "Checking for fbb daemon: "
        PID=`/bin/pidof -x xfbbd`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, fbb is up :)${reset}"
         else
                echo -e "${red}No, fbb is down :(${reset}"
        fi
	echo -n "Checking for ax25d daemon: "
        PID=`/bin/pidof -x ax25d`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, ax25d is up :)${reset}"
         else
                echo -e "${red}No, ax25d is down :(${reset}"
        fi
	echo -n "Checking for netromd daemon: "
        PID=`/bin/pidof -x netromd`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, netromd is up :)${reset}"
         else
                echo -e "${red}No, netromd is down :(${reset}"
        fi
	echo -n "Checking for ax25rtd daemon: "
        PID=`/bin/pidof -x ax25rtd`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, ax25rtd is up :)${reset}"
         else
                echo -e "${red}No, ax25rtd is down :(${reset}"
        fi
	echo -n "Checking for flexd daemon: "
        PID=`/bin/pidof -x flexd`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, flexd is up :)${reset}"
         else
                echo -e "${red}No, flexd is down :(${reset}"
        fi
	echo -n "Checking for mheardd daemon: "
        PID=`/bin/pidof -x mheardd`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, mheardd is up :)${reset}"
         else
                echo -e "${red}No, mheardd is down :(${reset}"
        fi
	echo -n "Checking for ax25ipd daemon: "
        PID=`/bin/pidof -x ax25ipd`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, ax25ipd is up :)${reset}"
         else
                echo -e "${red}No, ax25ipd is down :(${reset}"
        fi
	echo -n "Checking for ax25udp daemon: "
        PID=`/bin/pidof -x ax25udp`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, ax25udp is up :)${reset}"
         else
                echo -e "${red}No, ax25udp is down :(${reset}"
        fi
	echo -n "Checking for linuxnet node: "
        PID=`/bin/pidof -x linuxnet`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, linuxnet is up :)${reset}"
         else
                echo -e "${red}No, linuxnet node is down :(${reset}"
        fi
	echo -n "Checking for jnos bbs: "
        PID=`/bin/pidof -x jnos`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, jnos is up :)${reset}"
         else
                echo -e "${red}No, jnos is down :(${reset}"
        fi
	echo -n "Checking for kissattach: "
        PID=`/bin/pidof -x kissattach`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, kissattach is up :)${reset}"
         else
                echo -e "${red}No, kissattach is down :(${reset}"
        fi
	echo -n "Checking for slattach: "
        PID=`/bin/pidof -x slattach`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, slattach is up :)${reset}"
         else
                echo -e "${red}No, slattach is down :(${reset}"
        fi
	echo -n "Checking for kissnetd: "
        PID=`/bin/pidof -x kissnetd`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, kissnetd is up :)${reset}"
         else
                echo -e "${red}No, kissnetd is down :(${reset}"
        fi
	echo -n "Checking for mkiss: "
        PID=`/bin/pidof -x mkiss`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, mkiss is up :)${reset}"
         else
                echo -e "${red}No, mkiss is down :(${reset}"
        fi
	echo -n "Checking for socat: "
        PID=`/bin/pidof -x socat`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, socat is up :)${reset}"
         else
                echo -e "${red}No, socat is down :(${reset}"
        fi
	echo -n "Checking for rstatrxd: "
        PID=`/bin/pidof -x rstatrxd`
        if [ -n "$PID" ]; then
                echo -e "${green}Yes, rstatrxd is up :)${reset}"
         else
                echo -e "${red}No, rstatrxd is down :(${reset}"
        fi

        ;;
*)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
esac

exit 0

 

Update RMSGateway 2.5.0.0

Finally i found some time to update the RMSGateway to RMS 2.5.0.0 with Winlink V5 CMS Web Services support. I only found the issue that if have to edit the sysop.xml and add the password. I dont have read that anywhere.

Thanks to /Basil n7nix we are good to go again.

More then 50 People of the 72 needs to update there software.

root@gw:/home/pd9q/rmsgw/admin# ./versionlist.sh
Using existing version file, with refresh interval: 10 hours

Below rev: 50, Current: 22, Total: 72 at Nov 13 08:23:24 CET 2018
RMS GW Version file is: 0 hours 0 minute(s), 46 seconds old
root@gw:/home/pd9q/rmsgw/admin#

root@gw:/home/pd9q# git clone https://github.com/nwdigitalradio/rmsgw
Cloning into 'rmsgw'...
remote: Enumerating objects: 272, done.
remote: Counting objects: 100% (272/272), done.
remote: Compressing objects: 100% (162/162), done.
remote: Total 530 (delta 194), reused 186 (delta 110), pack-reused 258
Receiving objects: 100% (530/530), 406.70 KiB | 0 bytes/s, done.
Resolving deltas: 100% (310/310), done.
Checking connectivity... done.

root@gw:/home/pd9q# cd rmsgw/admin
root@gw:/home/pd9q/rmsgw/admin# ./admin-update.sh
Update to V5 Winlink Web Service API
Found file: /etc/rmsgw/sysop.xml
Adding password to /etc/rmsgw/sysop.xml
RMS Gateway files & scripts update completed.

root@gw:/home/pd9q/rmsgw/admin# ./testwlapi.sh
Directory /root/tmp does not exist ... creating
Starting test at Tue Nov 13 05:21:59 CET 2018 ...
test finished at Tue Nov 13 05:22:14 CET 2018 ...

root@gw:/home/pd9q/rmsgw/admin# grep -i error /root/tmp/debuglog.txt
Nov 13 05:19:01 gw rmsgw_aci[32448]: Channel Stats: 2 read, 2 active, 0 down, 0 updated, 0 errors
root@gw:/home/pd9q/rmsgw/admin#

Instructions on how to update RMSGateway

Instructions on how to update to the latest scripts supporting Winlink
V5 CMS Web Services.

You need to complete this update soon as Winlink is switching its Web
Services over to only support their latest version. Note that no C
files changed for this upgrade just python scripts & the
/etc/rmsgw/hosts file.

First check your python version:

python –version

The new scripts have a requirement of python version 2.7.9 or above.
If you are running a Debian distribution then wheezy will not work,
jessie, stretch & sid are OK.

Second check that you have an /etc/rmsgw/sysop.xml file.

If you don’t have a sysop.xml file then read the admin/README.md file
https://github.com/nwdigitalradio/rmsgw/blob/master/admin/README.md

Note that the getsysop.py & mksysop.py scripts currently do not work
for the new Winlink Web Services because the SysopGet web service is
not enabled for our key. This may change in the future. If you do not
have a sysop.xml file you can use mksysop.py BEFORE you do the update.

If your system passed the python version test then you can easily
upgrade like this:

git clone https://github.com/nwdigitalradio/rmsgw
cd rmsgw/admin
# become root & run this command
…/admin-update.sh

Verify that the update is working

# As root run the test script in the admin directory

…/testwlapi.sh

# Search the log file for any errors
# The log file grabs some of the rms.debug log file and you are only
# concerned with errors found after you ran the test script

grep -i error /root/tmp/debuglog.txt

Now go to winlink.org (https://winlink.org/RMSChannels) and look at
the Winlink Packet RMS Map/RMS List/Gateway Versions sections.
Search for your call sign.

For more information read the README.md file in the rmsgw/admin
directory here:
https://github.com/nwdigitalradio/rmsgw/blob/master/admin/README.md

/Basil n7nix