uronode/CHANGES.3

540 lines
27 KiB
Groff
Raw Normal View History

2016-04-01 16:06:32 +01:00
27/03/2016 - v2.5 YO2LOJ reports 2 warnings with regards to system.c and
the date/time stamp function. While I do not get one, I also do not get
one with his supplied patch... so I included it. The patch affects the
differences between 32 and 64 bit OS timestamps. Now the OS bit
shouldn't matter. Thanks Marius! (That's why we have ya on the team)
Ported the calibrate tool from F1OAT to the URONode suite. I could have
rewritten the whole thing from scratch but why the need to reinvent the
wheel? There was some recoding I had to do so that it'd compile under
URONode but that was somewhat minor. Usage is the same:
calibrate -t [ms] interface.
This port is similar in theory to what I did with Craig Small's axdigi package.
Cleaned up routines in Makefile. I'll probably have several and
hopefully they will go unnoticed. One critical thing I did notice and
I'm surprised no one reported this was if flexnet wasn't selected, and
one ran a "make install" or "make upgrade" - it would exit as soon as it
tried to install a non-existant binary (FlexD). This left the axdigi
module to go un-installed/upgraded. This is a very important module to
install as it allows for interface to multi-interface digipeating.
Anyway, I got off my butt and fixed this amongst other things.
Fixed the way the system handled parsing of the info file that carried
the stats for Memory and Swap usage: /proc/meminfo. In some cases, the
node couldn't properly parse the swap statistics in the "Status"
command. Now, regardless of which kernel is being used, the proper stats
will be parsed and the percentage arithmetic will be properly applied to
show final percentage used. An example of the output:
Memory: Available Used Free perc. Used
------------------ ---------- ---------- ---------- ----------
Physical: 4048024 kB 3206552 kB 841472 kB 79 %
Swap: 1881084 kB 0 kB 1881084 kB 0 %
I really don't know why this was such a difficult thing for me to fix
but I got it after months of pondering. This fixes a known non-critial
bug :D After fixing this bug however I created another one that would
cause a divide-by-zero segfault. Someone asked me to configure a box
remotely for them and they didn't add a swap partition at all! Now if
there's none or it's simply not activated, the node's 'STatus' report
will reflect such. Thanks to the NY EOC folks for creating this error so
I could find this bug before relase xD
Fixing texts in gateway.c and mheard.c where it still referenced the
word "port(s)" instead of "interface(s)" as it should. Also cleaned up
some minor error reporting. Also made some changes in how some aborts
are displayed, and also invalid callsign error reporting. For example,
an aborted connect will now show:
c n1uro-3
UNIVLE:N1URO-5} link setup (ax2)...
UNIVLE:N1URO-5} Connection aborted.
The same as with an aborted telnet session.
Pings now will show: ping www.comcast.com
ICMP Echo request sent to: 68.87.29.59
UNIVLE:N1URO-5} Ping aborted.
and a connect attempt that doesn't exist in any tables or links:
c g4apl
UNIVLE:N1URO-5} G4APL not found, please retry your entry.
I'm sure I'll figure out some more as time goes on. Always a little something
to do :)
One thing I noticed was an error in the Ping routine. The "Maximum size"
of a ping was preset to 248 bytes. On an ax25 link, this doesn't even
leave room for the IP headers, nevermind the ax25 headers! In thinking
this over, and not knowing if the IP path would be over vanilla ax25 OR
perhaps via NetRom, I decided to make the Maximum content per ping at
128 bytes. This should also be just large enough to allow ALL ascii
characters a chance to be included in 1 ping frame. Ex:
n1uro-15@n1uro.ampr.org:/uronode$ ping k1yon 129
Maximum size is 128
n1uro-15@n1uro.ampr.org:/uronode$ ping k1yon 128
ICMP Echo request sent to: 44.88.4.1
ICMP Echo reply received from: 44.88.4.1
Ping completed in: 151ms (ttl=63)
n1uro-15@n1uro.ampr.org:/uronode$
While at it, I made changes to the online help file for ping and to
uronode.8 man page.
Also I noticed while working on a new site for EastNet, I somehow omitted an
install line in the Makefile for flexd.8. This not only is fixed but I also
expanded a bit on the limited text that was inside.
Cleaned up a text display bug in the Status report. Swap: was not right
column justified with the rest of the memory stats. This was handled in
command.c
Added a routine in configure to check for "make" as I've seen new
installs where make is not installed but gcc is. Needless to say you
can't "make" a binary if "make" does not exist ;->
Also added a notification in flexd where when started to inform you that
the poll cycle has started. You may see it connect to test the existance
of an ax25 socket for the remote end when you first start flexd. This
starts the timer for your poll sequence in flexd.conf.
While I was at it (and with a decent nudge from Tomasz SP2L) I did some
further digging and found (with the aid of Thomas DL9SAU) that the
getsockopt routine itself was showing failure because the socket wasn't
initially established prior to the polling loop. In adjusting it's
settings this appears to help relieve the initial error getsockopt() was
showing upon start of flexd. Now flexd should login to the remote
immediately upon start and pull down the desti table of the remote node.
Thanks Thomas and Tomasz :)
In digging through the flexd source some more, and enjoying the fact
that the configs can be changed "on the fly" without having to restart
the system in most cases, or disrupt activity that's in session on or
through the node, I added a call to update the destinations upon a
"killall -HUP flexd". This allows the node sysop to change the flex-gate
they wish to poll without having to stop and restart flexd, and grab an
immediate destinations list. Remember to do the following:
- add the route in uronode.routes
- change the flex gateway in flexd.conf
- killall -HUP flexd
... and your new config and destination will instantly be live. Also, you can
-HUP your flexd to force an update as well.
Fixed a non-critical bug in axdigi where killing the daemon would NOT
clear the pidfile in /var/run. Always a stale pidfile was left over, and
as a quick fix I had the daemon delete the pidfile through a system call upon
start. A hack but worked. NOW, the daemon will remove the pidfile upon
exit as it should.
Wrote a set of SystemD files since xinetd/inet will soon be eliminated in
favor of SystemD. I've tested the files on both a Pi running Raspbian
wheezy and on my Fedora testbed. Important Note:
IF you spawn your incoming telnet connects with SystemD, it's very possible
that SystemD *will* convert your incoming IPv4 to internal IPv6 sockets.
You may handle this by forcing IPv4 in your SystemD uronode.socket file.
While as of this version URONode will handle *incoming* IPv6, I haven't
written any outbound routines for IPv6. To my knowledge, there's no need
for it and I don't know if we'll ever have such a need on ham-based
networks for IPv6. URONode *is* the first packet node however, to support
IPv6... a historical milestone I do believe.
While I was testing SystemD and finally realizing that the above IPv6
conversions were true, I created a menu system for IPv6 to make it a lot
cleaner than it already was... actually it had none. Since it's also
spawned by SystemD, I made that the prompt for IPv6...
SystemD - n1uro@fedora.n1uro.ampr.org:
I was going to dupe the IPv4 prompt but decided it should have it's own
to follow with the scope of how I maintain this project. So far everything
in regards to both SystemD and IPv6 seem to be working fine.
31/03/2016 - v2.5.1 (Maintenance release)
Added better error handling output to FlexD and axDigi. Now they tell you
when they've properly received your -HUP, your -TERM or your start. This
should help you all in better debugging your backend engines (FlexD, axDigi,
etc.)
Added a -b flag to the installer routines by suggestion of Marius YO2LOJ
so one with an existing install won't have their files totally overwritten
however they'll be backed up with a *~ flag instead during "make install".
The preferred method for upgrading an existing node as always is by using
"make upgrade" which only copies over the files required for that version.
Once in a while a new field will be added or one deleted from the file
uronode.conf, or one of the others and I've noticed sysops don't pay
any attention to the new field requirements (ex: RoseId is the latest
add). Compare the fields in files before just copying them back over!
Gus I0OJJ and our own Bob VE3TOK reported strangeness in certain ALIAS
commands. I tried like heck to reproduce it here and on machines I take
care of. I knew where the issue layed but not fully being able to get
it to reproduce was a royal "b". After sending Bob code to test, he
was able to get positive results and checked it in for me.
While at it Bob increased the buffer for the reader within FlexD. Seems
Xnet may require a larger buffer than FlexNet for some reason? Bob also
checked that in. Thanks Bob.
2017-01-21 14:34:12 +00:00
18/04/2016 - v2.6
Removed stale and unused axdigi.conf file. Thanks to David KI6ZHD for
pointing this out that I had a stale file in the archive. This file
belonged to another digi daemon I was going to revive instead of Craig
Small's multi-interface crossport digi daemon. I find that especially
with FlexNet, a multi-interface crossport digipeat system not only is
unique to the native linux kernel BUT is also very efficient. If you
have a stale copy of axdigi.conf floating around, please delete this.
Added a question to engage or disengage interactive configure/make mode.
This idea came to me from a query I received by KI6ZHD. If you choose NOT
to use interactive mode, than you must run make/make upgrade/make install
manually. Note: ALL options including rose and flexnet WILL BE COMPILED IN.
Tomasz SP2L was seeing carriage returns when administering his server
remotely and sending SIGHUP to flexd in the terminal messages confirming
the -HUP. Removed.
Added a version output for FlexD and tweeked the one for axdigi. Now both
helper daemons will display its versions based on URONode's version and
some very brief information about themselves. flexd -v or flexd -h
along with axdigi -v or axdigi -h will bring up this information.
Decided that since there's so many commands beginning with M I would move
the MHeard command to a Jheard command. This keeps the commandset more in
line with other systems except for TheNet and X1J-4, and separates that one
command away from the volume of M's. While at it I also made a JL for
Just heard Long. If you specify an interface, Jheard/JLong engages only for
that interface. Note - JLong will say: it may time out HFers. I also had to
modify Makefile and rework the help files to match. While at it I needed to
modify the uronode.8 MAN page.
Gave Makefile a more modernized compile line option. I'm hoping this will
keep URONode one of packet's better robust nodes.
I noticed some sites were violating Software2000's NetRom specifications
by defaulting reconnect on still in their uronode.conf files. I had thought
that I fixed this in an earlier release. Perhaps I did and then migrated
an old .c file back into the mix? (wouldn't be the first time I've done
that by mistake!) Anyway... three key things Software2000 was insistant upon
were NO CTEXT, NO RECONNECT, NO GOODBYE MESSAGES. If you've noticed, I've
taken ALL that out of URONode. These things were done as to not confuse
robot scripts such as PBBS mail forwarding sessions. While other systems
may wish to continue to violate the NetRom protocol (and others) I will
do everything in my power NOT to.
I have made a diff file for JNOS2.0K that makes it a bit more user
compatible with URONode, and other linux-based nodes. For almost 30 years
TCP port 3694 has been used for inbound telnet for linux-based nodes, and
URONode is no exception... just as IP protocol 93 is for axip and UDP
port 93 is for axudp (again other systems love to violate protocols, we
try not to). Besides my little isms that I like in xNOS which I often
contributed to K2MF for MFNOS, I've began to do similar for JNOS. I'm adding
the .diff file in the main code distribution so if you do run JNOS 2.0K as
your PBBS TCP port 3694 is now recognized in JNOS with my patch. I have
as of this writing submitted it to Maiko for considerations, I don't know
if he's going to use it or not. If you do want to patch your JNOS 2.0K
copy it into your jnos source directory and run: patch -p1 -i jnos20k.diff
and you should see about a half dozen files updated. If Maiko doesn't wish
to include this and you want me to keep up to date with it, let me know.
With the recent CVE study on Winlink2000 and plain text passwords exposed, I
went through URONode to insure it wasn't posessing the same issue. By
default URONode doesn't ask for ANY passwords however it's highly suggested
that the sysop require passwords on any internet or amprnet interface. Before
yes, a sysop could require a password on an ax25/NetRom/Rose interface which
would be exposed. Now, if a sysop mistakenly tries to force a password
on RF, it will be ignored by the node so it's not exposed.
2017-08-22 13:54:39 +01:00
25/05/2017 - v2.7
Added an "A"nnouncements command. Sysops can use this to give users a chance
to read any announcements you and/or your club may have. I figured that I
would segment this from the "I"nformation command since a lot of guys tend
to post their system specs in the uronode.info file. If a user is seeking any
news or announcements they won't have to sort through the other information
contained within the system.info file and vice versa. A new file called
uronode.announce now needs to be with your other uronode.* files.
Added a trying state display for telnet where before there was none. Actually
there was a whole bunch of info but I had it commented out. This I did after
a recent user poll was in support of such and other "trying" state messages.
Such messages are still filtered for netrom connects.
Removed uronode.service file from the systemd group. Only uronode.socket and
uronode@service needs to be placed and engaged. This was discovered by SP2L
on his systems and I verified this on my Fedora test system (which is systemd).
Thanks to Tomasz for finding this and pointing it out to me. Without the
uronode@.service file, the uronode.socket file won't properly engage upon
a connection request via IP. Without uronode@.service your systemd will
report an error in loading the uronode.socket file:
root@vbfc25:~# systemctl status uronode.socket
● uronode.socket - URONode Server Activation Socket
Loaded: loaded (/usr/lib/systemd/system/uronode.socket; enabled; vendor preset:
Active: failed (Result: resources) since Sat 2016-12-31 11:30:54 CET; 45s ago
Listen: 0.0.0.0:3694 (Stream)
Accepted: 4; Connected: 0
Dec 31 12:18:11 vbfc25 systemd[1]: Listening on URONode Server Activation Socket.
Dec 31 11:30:54 vbfc25 systemd[1]: uronode.socket: Failed to queue service startup
Dec 31 11:30:54 vbfc25 systemd[1]: uronode.socket: Unit entered failed state.
lines 1-9/9 (END)
Fixed a bug in JHeard and JLong in regards to flagging an interface that
has existed I'll guess since the beginning of time. This bug was found and
reported to me by Han PE1FAM. I was considering removing this feature
however I can understand it's usage in the way Han is using it. In the way
I have it now, the "Hidden" interface now will lock an end user from trying
to attempt connects out an interface a sysop doesn't want users connecting
out from such as an APRS interface. The interface in an "int' will not be
displayed as to be a subtle message that the interface is not usable, however
it will be displayed in a NetRom "Routes" list and in J/JL request.
If an attempt to connect out a "hidden port" is made the user is shown an error:
n1uro-15@n1uro.ampr.org:/uronode$ c ax1 foo
Not a user interface.
The reason I did this was so that you may see propagation in a heard list
in the event of ducting for some VHF/UHF "dx"ing so to speak.
**Note: do NOT flag a L4 protocol interface such as a NetRom interface
as a locked interface or the node will not deliberately load.
Thanks to Han for reporting this.
While working on new node W1WCG, I noticed some code clean up in node.c
There's still a lot more to do especially with ANSI.
2017-11-24 18:00:45 +00:00
15/06/2017 - v2.8
2018-01-20 11:59:47 +00:00
2017-11-24 18:00:45 +00:00
In gateway.c I cleaned up the do_ping routing slightly. I was going to add
a default timer but instead decided to let the user hit enter for their own
"timer" of sorts. Users are also now instructed on the node to hit enter
in order to abort a ping.
Cleaned up do_nodes so now if there's a slime trail node, rather than prefix
it with a colon ":", now it will display ##TEMP: instead. This was sorta
bugging me on just how to handle these. While I was at it, I made a
modification to gateway.c so if a user tried to "C ##TEMP" it instructs the
end user to use the callsign-ssid. I can't think of any other node that does
this.
Thanks to Dave Hibbard (at Debian) for pointing out a dropped "t" in the word
"software" in flexd.c when the -v switch is used.
Cleaned up some prompt routines including the ipv4/ipv6 login sequences.
Before (especially with ipv6) if a callsign had no permissions to login via
the internet they were never informed how to gain access - they were simply
denied. I found this to somewhat make the node a bit unfriendly. Fixed.
With all the chatter on the 44-net list about IPv6, I've decided to get my
block active for further testing. In doing so, I noticed that if a user
telnetted in via IPv6 and made a NetRom connect out, the node failed to
inform them that they were connected... fixed.
As of this writing there's no outboud telnet or dns functions for IPv6
but that's not to say it's not in the works. Personally, I don't see a
true need for IPv6 outbound for amateur radio as the amprnet is going
quite strong however that's not to say things may not change either. If
anything, IPv6 through an HE.net tunnel works as slick as the amprnet
does with the exception of how it handles dynamic clients. Other than
that, it does appear to tunnel through your ISP filters as amprnet
does which is a plus.
2018-01-20 11:59:47 +00:00
12/07/2017 v2.8.1
Spotted and fixed an issue in the D command within router.c that I somehow
introduced in regards to columns not equalling a full 4x4. Locally it didn't
show but remotely it did. When one ran a D command and there were less than
4 columns a carriage return/new line was not sent making the user's screen
look "stuck" when in fact it was not. Fixed!.. before bugs were reported :)
Note: this *only* affected an incoming NetRom connection.
Changed this file and node.h to reflect 2.8.1.
2018-12-27 15:51:07 +00:00
27/05/2018 v2.9
Changed the abort message from "Connection Aborted" to just "Aborted".
The madness in the logic is that FBB and other PBBS scripts may only
read "Connect" and send their next command in their sequence and thus
causing a bit of a loop.
Changed version number in node.h
Changed this file.
I noticed that an IPv6 connection did NOT offer EXit as a command. Fixed.
I also noticed that for an IPv6 connection, when running an external command
it did not inform the user that they were being returned to the node which
may hint that the plug-in is not returning to the node properly, or is
exiting/forking prior to it's close. This is now fixed.
Mainly for sysop debugging purposes but also for end users, when executing a
plugin such as NS or tracer, it'll still open with "Executing command" but now
it will return back to the node prompt with "Command ended.". This lets both
the sysop and end user know the command exited properly, like with a
"return 0"
I decided that just having IPv6 as a trailer for IPv6 connects at the prompt
to be a bit vague in display so to keep it a bit more consistant with IPv4
it now will show ...:/uronode6 instead.
Fixed the "Sockets:" line in the Status command display. The word "Sessions"
was off by one space throwing all the following column headers off by 1 space.
2019-08-17 22:35:50 +01:00
17/10/2018 v2.10
Edited node.h to reflect this version.
Edited CHANGES.3 to include new changes to the node.
Thanks to Marius YO2LOJ for a patch in do_ports within command.c where there
is a possibility that the interface count may return NULL and the function
will generate an exception in libc for the routine causing the node to
segment fault out and disconnect the user from the node. Good to see Marius
digging into the code again.
While at it Marius also discovered the possibility of the interface showing
as "null" in the do_sessions routine, possibly due to some changes in
libax25 perhaps? Under some conditions ax25_config_get_name(dev) could return
a null pointer - Marius YO2LOJ
Changed a call that was in axdigi.c which had a lib call hardcoded and could
break compiles under different archs. Patch supplied by Helmut Grohne, thanks
to KI6ZHD for relaying the mail that included the patch.
2021-01-10 21:12:57 +00:00
03/03/2020 v2.11
Changed node.h to reflect current version.
Note: The system has been behaving as best as it can be expected considering
it's a front-end to the linux protocol stacks. As long as there can be an
ax# or sp# interface, it can attach to it and work the protocol(s) the user
wishes to use. There's still the 2-line patch that the kernel maintainers
need to add to ax25.ko so that netrom will continue to properly function
however that's not the issue of URONode, it's the kernel ax25 module.
Made a couple of changes in gateway.c where the color schema wasn't properly
resetting the netrom prompt only in regards to aborting ping or a connect
request. This is now fixed.
Made changes in system.c where it wasn't displaying the user being on IPv6
properly. While at it, I changed how it handles the user when they're on
IPv4 in the lastlog and loggedin databases.
Changed user.c to reflect incoming session is via IPv6 which also fixes the
output of nodeusers so that instead of displaying ??????? it now shows that
Telnet6 is being used as the incoming protocol. This one was really getting
under my skin. Now I can rest in peace (as per QST 2/2020 haha!)
28/03/2020 v2.12
Edited node.h to reflect new version.
ADDED documentation! I wrote docs in both .txt and .doc format. Choose your
poison hihi! Unless you're a new sysop, I'm sure these are a waste of time
for you to read.
Modified the do_sessions command so that a plain S now shows SEssions and
ST is the minimum required now for do_status. This also cleans up the
commandset so it's more alphabetical.
I also modified do_status so that it now may require an argument to show
the full screen worth of system status otherwise by default it will only
show very basic stats of version/date/hostname/uptime and now requires
"ST" to be called. Calling "ST L" will show the long (original) status
screens. I did this after noticing some other node softwares go to the
extreme in showing stats that most end users would never understand nor
even care about. This also saves a lot of bandwidth!
2022-02-05 11:58:00 +00:00
17/01/2020 v2.13
Changed the external command text to inform the end user that the escape
sequence (CTRL-T typically) is disabled while an external command is run.
I've been wanting to do this for a while to preserve integrity for the
user. This required an edit in cmdparse.c
Edited node.h to reflect this version.
Cleaned up the status command. Prior *any* single character would print the
long status report. Now either "l" OR "L" will be accepted. If another
character is pressed an error will display:
n1uro-15@n1uro.ampr.org:/uronode6: st s
Usage: status l OR status L
** IMPORTANT **
-= IF YOU DO NOT READ THIS YOU WILL APPEAR BROKEN =-
To be more compliant with downstreams I moved the files in /var/ax25/
to now be looked for in /var/lib/ax25 which appears to be the new file
system ruleset by the linux gods. I did NOT make this up. I would *strongly*
urge you to copy over your current /var/ax25/node/* files after running
"make upgrade" unless you wish to start with a fresh system of sorts.
Your config files in etc/ax25 won't be moved or touched and the man
pages will remain where they are. Your help files, perhaps your ROSE
directory (if you use rose.hlp like I do), and user logs will be reset.
Users will be all considered new again so to prevent this from occurring
I would move those files over.
73 - Enjoy.
24/6/2021 2.14
Fixed a display issue when connecting via flex/ax.25 in regard to the desti
table where an additional line feed was presented upon the last row being
a full 4-wide. This was done in router.c
I went through multiple files that were giving compile warnings and fixed
all the warnings I saw. Hopefully URONode compiles without any warnings
whatsoever. If you do send me your log.
Note: Linux is on kernel 5.x now and since kernel 4.2, the ax.25 stack module
in the kernel has had a minor issue of NOT closing an ax.25 socket when used
with NetRom as a virtual circuit. This prohibits other NetRom sockets from
being created/established. This is an awful long time to allow such a bug
to linger. Until this bug is fixed (to which I have nothing to do with) there's
not much more I can do with the node. Some guys are more than able to do
their own kernel compiles, others are not however I seem to get the blame of
faulty software when this is far from the truth. Until this bug is resolved
and fixed, the project is on an indefinite pause.
22/10/2021 2.15
K3CHB found when running "make" that it was erroring on util.c due to dupe
calls. Removing those calls fixes this bug and allows URONode to compile
now without error on newer GCC systems. Older ones were a lot more tollerant
to bugs like this.
2016-04-01 16:06:32 +01:00
----------- Note on SystemD --------
In uronode.socket, you'll notice the line:
ListenStream=0.0.0.0:3694
This tells SystemD to listen on TCP socket 3694 for any IPv4 ONLY incoming
connection. If you wish to filter JUST your amprnet and IPv4 localhost
IPs make a line for each changing 0.0.0.0 to 127.0.0.1 and another for
your amprnet IP. This will by default filter any commercial IP requests
to URONode. If you want SystemD to try IPv6 *first*, don't enter in any
IP schemas and just list the port number. SystemD by default appears to
use IPv6 prior to IPv4.
You can verify the above by running systemctl status uronode.socket:
ystemctl status uronode.socket
● uronode.socket - URONode Server Activation Socket
Loaded: loaded (/usr/lib/systemd/system/uronode.socket; enabled)
Active: active (listening) since Mon 2016-03-07 15:30:39 EST; 6min ago
Listen: 0.0.0.0:3694 (Stream)
Accepted: 3; Connected: 1
----------- Wish-list: -----------
----------------------------------
Original Development Information (aka Disclaimer): URONode was developed
on an IBM eSeries 330 eServer with dual 1.2GHz CPUs The OS is Debian
Linux 4 using kernel 2.4.27, libax25 v0.0.11, ax25-tools v0.0.8 and
ax25-apps v0.0.6. This software comes with absolutely NO guarantees so
crash n burn at your own risk. We all may be surprised and find out that
it actually DOES something useful! URONode may not run 100% depending on
environmental conditions specific to your system.
URONode is GLPv2 code, and tested by it's main author on the following
platforms: Raspberry Pi ver. B, Debian 7.7 on a Core-i3, Ubuntu
12.0.4LTS on a Core-i3, Fedora ver. 21
------------
Comments/suggestions? email: n1uro@n1uro.ampr.org Gripes??? cat gripes >
/dev/null :D just kidding!
This version will get you going for now. I'll post any changes to:
ftp://ftp.n1uro.net/packet and https://uronode.sourceforge.net. You may
also find URONode in your distro's repositories. <dnf/yum or apt-cache>
search uronode
2021-01-10 21:12:57 +00:00
Join our support mail list:
https://uronode.n1uro.com/list/
2016-04-01 16:06:32 +01:00
73 de Brian N1URO