New upstream version 2.12

This commit is contained in:
Dave Hibberd 2020-09-20 14:29:26 +01:00
parent ef4822cca2
commit 5f0010158a
8 changed files with 317 additions and 14 deletions

View File

@ -416,6 +416,25 @@ 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 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!) 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!
----------- Note on SystemD -------- ----------- Note on SystemD --------
In uronode.socket, you'll notice the line: In uronode.socket, you'll notice the line:
ListenStream=0.0.0.0:3694 ListenStream=0.0.0.0:3694

View File

@ -39,7 +39,7 @@ void init_nodecmds(void)
add_internal_cmd(&Nodecmds, "Help", 1, do_help); add_internal_cmd(&Nodecmds, "Help", 1, do_help);
add_internal_cmd(&Nodecmds, "Info", 1, do_help); add_internal_cmd(&Nodecmds, "Info", 1, do_help);
add_internal_cmd(&Nodecmds, "Quit", 1, do_bye); add_internal_cmd(&Nodecmds, "Quit", 1, do_bye);
add_internal_cmd(&Nodecmds, "Status", 1, do_status); add_internal_cmd(&Nodecmds, "STatus", 2, do_status);
add_internal_cmd(&Nodecmds, "Version", 1, do_version); add_internal_cmd(&Nodecmds, "Version", 1, do_version);
#ifdef HAVEMOTD #ifdef HAVEMOTD
add_internal_cmd(&Nodecmds, "Who", 1, do_last); add_internal_cmd(&Nodecmds, "Who", 1, do_last);
@ -49,7 +49,7 @@ void init_nodecmds(void)
add_internal_cmd(&Nodecmds, "Connect", 1, do_connect); add_internal_cmd(&Nodecmds, "Connect", 1, do_connect);
add_internal_cmd(&Nodecmds, "Links", 1, do_links); add_internal_cmd(&Nodecmds, "Links", 1, do_links);
add_internal_cmd(&Nodecmds, "INTerfaces", 3, do_ports); add_internal_cmd(&Nodecmds, "INTerfaces", 3, do_ports);
add_internal_cmd(&Nodecmds, "SEssions", 2, do_sessions); add_internal_cmd(&Nodecmds, "Sessions", 1, do_sessions);
add_internal_cmd(&Nodecmds, "Users", 1, nuser_list); add_internal_cmd(&Nodecmds, "Users", 1, nuser_list);
#ifdef HAVE_FLEX #ifdef HAVE_FLEX
add_internal_cmd(&Nodecmds, "Desti", 1, do_dest); add_internal_cmd(&Nodecmds, "Desti", 1, do_dest);
@ -769,7 +769,8 @@ int do_nodes(int argc, char **argv)
/* /*
* by Heikki Hannikainen <hessu@pspt.fi> * by Heikki Hannikainen <hessu@pspt.fi>
* The following was mostly learnt from the procps package and the * The following was mostly learnt from the procps package and the
* gnu sh-utils (mainly uname). * gnu sh-utils (mainly uname). Addition of argument switches added
* by N1URO.
*/ */
int do_status(int argc, char **argv) int do_status(int argc, char **argv)
{ {
@ -792,21 +793,59 @@ int do_status(int argc, char **argv)
int na, nl, nd; int na, nl, nd;
#endif #endif
int ma, mu, mf, sa, su, sf; int ma, mu, mf, sa, su, sf;
/* "Status" */
if (argc == 1) {
if (User.ul_type == AF_NETROM) { if (User.ul_type == AF_NETROM) {
axio_printf(NodeIo,"%s} ", NodeId); axio_printf(NodeIo,"%s} ", NodeId);
} }
if (check_perms(PERM_ANSI, 0L) != -1) { if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo, "\e[01;37m"); axio_printf(NodeIo, "\e[01;37m");
} }
node_msg("Status:"); node_msg("Status report:");
if (check_perms(PERM_ANSI, 0L) != -1) { if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo, "\e[0;m"); axio_printf(NodeIo, "\e[0;m");
} }
time(&t); time(&t);
axio_printf(NodeIo,"Version: %s\n", VERSION);
axio_printf(NodeIo,"System time: %s", ctime(&t)); axio_printf(NodeIo,"System time: %s", ctime(&t));
if (uname(&name) == -1) axio_printf(NodeIo,"Cannot get system name\n"); if (uname(&name) == -1) axio_printf(NodeIo,"Cannot get system name\n");
else { else {
axio_printf(NodeIo,"Hostname: %s\n", HostName); axio_printf(NodeIo,"Hostname: %s\n", HostName);
// axio_printf(NodeIo,"Operating system: %s %s (%s)\n", name.sysname, name.release, name.machine);
}
/* read and calculate the amount of uptime and format it nicely */
uptime(&uptime_secs, &idle_secs);
updays = (int) uptime_secs / (60*60*24);
upminutes = (int) uptime_secs / 60;
uphours = upminutes / 60;
uphours = uphours % 24;
upminutes = upminutes % 60;
axio_printf(NodeIo,"Uptime: ");
if (updays) axio_printf(NodeIo,"%d day%s, ", updays, (updays != 1) ? "s" : "");
if(uphours) axio_printf(NodeIo,"%d hour%s ", uphours, (uphours != 1) ? "s" : "");
axio_printf(NodeIo,"%d minute%s\n", upminutes, (upminutes != 1) ? "s" : "");
loadavg(&av[0], &av[1], &av[2]);
// }
return 0;
}
/* "Status L" */
if (argc == 2) {
if (User.ul_type == AF_NETROM) {
axio_printf(NodeIo,"%s} ", NodeId);
}
if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo, "\e[01;37m");
}
node_msg("Full Status report:");
if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo, "\e[0;m");
}
time(&t);
axio_printf(NodeIo,"Version: %s\n", VERSION);
axio_printf(NodeIo,"System time: %s", ctime(&t));
if (uname(&name) == -1) axio_printf(NodeIo,"Cannot get system name\n");
else {
axio_printf(NodeIo,"Hostname: %s\n", HostName);
axio_printf(NodeIo,"Operating system: %s %s (%s)\n", name.sysname, name.release, name.machine); axio_printf(NodeIo,"Operating system: %s %s (%s)\n", name.sysname, name.release, name.machine);
} }
/* read and calculate the amount of uptime and format it nicely */ /* read and calculate the amount of uptime and format it nicely */
@ -821,9 +860,10 @@ int do_status(int argc, char **argv)
if(uphours) axio_printf(NodeIo,"%d hour%s ", uphours, (uphours != 1) ? "s" : ""); if(uphours) axio_printf(NodeIo,"%d hour%s ", uphours, (uphours != 1) ? "s" : "");
axio_printf(NodeIo,"%d minute%s\n", upminutes, (upminutes != 1) ? "s" : ""); axio_printf(NodeIo,"%d minute%s\n", upminutes, (upminutes != 1) ? "s" : "");
loadavg(&av[0], &av[1], &av[2]); loadavg(&av[0], &av[1], &av[2]);
axio_printf(NodeIo,"Load average: %.2f, %.2f, %.2f\n", av[0], av[1], av[2]); axio_printf(NodeIo,"Load average: %.2f, %.2f, %.2f\n", av[0], av[1], av[2]);
axio_printf(NodeIo,"Users: %d node, %d system\n", user_count(), system_user_count()); axio_printf(NodeIo,"Users: %d node, %d system\n", user_count(), system_user_count());
// if (!(mem = meminfo()) || meminfo("memtotal") == 0) { // if (!(mem = meminfo()) || meminfo("memtotal") == 0) {
/* cannot normalize mem usage */ /* cannot normalize mem usage */
// axio_printf(NodeIo,"Cannot get memory information!\n"); // axio_printf(NodeIo,"Cannot get memory information!\n");
@ -845,8 +885,7 @@ int do_status(int argc, char **argv)
} }
else else
axio_printf(NodeIo,"Cannot get swap information or swap not active!\n"); axio_printf(NodeIo,"Cannot get swap information or swap not active!\n");
axio_printf(NodeIo," "); axio_printf(NodeIo," ");
} }
#ifdef HAVE_AX25 #ifdef HAVE_AX25
@ -902,6 +941,7 @@ int do_status(int argc, char **argv)
#endif #endif
if (User.ul_type == AF_NETROM) { if (User.ul_type == AF_NETROM) {
node_msg(""); node_msg("");
}
} }
return 0; return 0;
} }
@ -935,6 +975,7 @@ int do_version(int argc, char **argv)
} }
return 0; return 0;
} }
int nuser_list(int argc, char **argv) int nuser_list(int argc, char **argv)
{ {
FILE *f; FILE *f;

1
docs/README Normal file
View File

@ -0,0 +1 @@
URONode documentation in both ascii text and word-97 .doc format.

BIN
docs/URONode.doc Normal file

Binary file not shown.

View File

@ -1,7 +1,244 @@
Documentation for URONode program Documentation for URONode program
version 2.10 dated 27/01/2019 dated 28/03/2020
Latest release of this program can be downloaded Contents:
from one of two below sites:
I - Introduction
II - What it is
III - Generic commands
IV - Extra commands
V - Where to get it
VI - Where to get support
VII - Acknowledgements
Introduction:
I decided to make URONode primarily for my own use and purposes but those who
came to login my node enjoyed it's functionality so much that they would want
a copy of their own so I decided around the year 2000 to release it. At the
time I was also helping K2MF with MFNOS and wanted something a bit similar
in functionality with xNOS that would also keep true to form with the basics
of the linux-nodes (and variants). Since the original code, there's been many
changes and additions. Around 2015 it became a standard node in Debian and
Red Hat repositories having proven itself as a sturdy node for native linux.
I took the best of all the linux based nodes, put them all together into one
and made many changes including adding a color schema if a user desires full
ansi colors to their screens. The prompt systems are also unique in nature
as depending on how the user connects IN to a URONode system is the style of
prompt they get returned to them. No other node system allows for such a
thing. The advantage is that under no circumstance if a user (or bbs for that
matter) connects via NetRom, never ever will a CTEXT or MOTD text get pushed
out which can disrupt a BBS session. The same goes for any sort of DTEXT
under a NetRom session.
All your configuration file manuals are online at a shell prompt. Just
type: man <filename> to view the online help. Ex: man uronode.conf to
read up on the main uronode configuration file or man flexd.conf to see how
to add flexnet routing into your node. If by chance you do find a man page
missing feel free to let me know.
There's some what I call helper apps included for you such as axDigi and
FlexD for example. AxDigi is a true cross-interface digipeater. There's NO
configuration you need to do for axDigi at all. It will auto-sense your ax.25
interfaces and simply listen for requests to digi in from one and out the
other interface. For more information on this, type "man axdigi".
What URONode is:
What many people get extremely confused about it is the fact it's not a
daemon - it's a shell. Like with bash/dash/sh/etc, it doesn't stay in
memory. You'll only see it listed in your process list if someone is
connected to you and it's been commanded to spawn so it doesn't hog up
any system resources when it's not needed unlike other systems that do.
It's also much smaller than bash, and with all features compiled into
URONode it's still under 500K in size. This makes it a smart choice to
use as it's not sitting there using CPU for nothing, which makes the CPU
run cooler thus improving it's lifespan.
It also locks the connected user to the command-set either within the
shell itself or any external commands the sysop may allow for, so
there's no file manipulation available, or system info available to
"steal" such as user account information. It also never overrides a
human command like some other systems may do. for an example,
c <int> <callsign-ssid> won't force a user to use an internet gated
route to the remote end, but will follow the human instruction to use
the RF interface as commanded. If a user wishes to stay RF they may do
so and not be forced on wired internet because the systems sees it's a
quicker path.
For those who still believe IP is a wire link only and not a protocol,
if you wish not to use it, say NO during the configuration to TCP/IP.
Same with ROSE, NetRom, FlexNet, etc. when you compile it if you compile
your own. I believe when it's packaged by the various distributions all
options are flagged on (which would make sense).
All protocol routing is handled by the kernel and various tools. Like
with bash, it doesn't provide any routing whatsoever. All routing for
all protocols is handled internally within the linux kernel. The same
for firewalling. By not introducing a "middle man" or trying to
re-invent the wheel by using the native protocol stacks within linux
itself, URONode is a much faster system.
For those who aren't that linux savvy, I've made 2 versions of an install
script for URONode, axMail-FAX (an SMTP plugin module for the node), and
a library installer to get you ready for LinFBB if you so choose to run a
BBS with your node. This gives you the opportunity to be fully messaging
compliant. One version of the install system is for sysvinit, the other
for systemd. It also will install ampr-ripd routing daemon if you're looking
to run as an internet gateway, along with an axip and an axudp interface along
with what I consider to be a master control file I call ax25 and is located in
/usr/local/bin/. All your amateur services can be controlled from this one
file quite easily.
Generic node commands:
Online help is available for all native compiled commands. The user simply
does: help <commandname-in-full> to see the online help. If a sysop wishes
to add more commands to their node they should follow the format of the
online help files (located in /path/to/node/help) to keep consistent with
the online help system. Every node may be configured with different commands
as sysops often may develop their own tools/apps for their set of users.
A brief description of compiled-in commands would be:
announcements - local news/announcements to share.
bye/exit (ipv4/ipv6 only)/quit - leave the node.
connect - gateway out to another system/node.
desti - bring up a list of flexnet destinations if applicable.
escape - This can change/display/disable your escape character. Defaults to
ctrl-T
finger - finger information from the local or a remote host.
host - look up an IP or Hostname in dns.
info - read the uronode.info file and display it to the end user.
jheard - the most recent 20 just heard stations
jlong - a long list of stations heard. This may be quite long.
links - connectable nodes hard coded into the uronode.routes file.
msg - an "instant message" utility build into the node to talk to another user.
nodes - display a listing of NetRom based nodes.
ping - an ICMP ping utility to see how fast a path to a remote is.
ports - a display of the ax.25 interfaces available on the node.
routes - a display of direct neighbor NetRom links.
status - a display of some of the hosts statistics including uptime.
telnet - a means to use tcp/ip to gateway out to a remote site.
users - who's online at the moment.
version - display information about the node's version.
who - information about a node's users or a specific user.
This command set is automatically compiled into URONode for you based on the
options you choose at pre-compilation time with the configure command.
Extra commands:
URONode supports execution of external commands from it's own shell such as
the axMail-FAX plugin. Some standard shell commands such as "netstat" are
preconfigured for you so that you may easily see how to duplicate adding a
custom command for your system. Typically these are commanded by executing
bash scripts.
The ideas of added commands you may choose are endless in nature! I have the
old Z-80 based game Zork available on my node for example. I also run an
Ambient Weather station to which users may pull real-time weather information
from via my URONode that calls Lynx (text based browser) and other formulas
to gather real-time statistics on my local weather.
I do provide a bunch of add-ons both on my FTP server and on SourceForge for
those who wish to add even more functionality to their node(s). An example
of one very useful one is NodeSearch where a user may enter a string either
by alias or by callsign to find a NetRom node. An example of searching for
either type of string:
n1uro-15@n1uro.ampr.org:/uronode6: ns
Executing command...
Which node are you looking for (no * please): n9
Searching NetRom nodes for N9 ...
BBSLYA:N9LYA-4 IN105:N9LYA-7 INNOS:N9LYA-5
NodeSearch v2.2 by N1URO for URONode.
Goodbye.
End of command.
n1uro-15@n1uro.ampr.org:/uronode6: ns
Executing command...
Which node are you looking for (no * please): in
Searching NetRom nodes for IN ...
DZINOD:SV1DZI-11 DZINOS:SV1DZI-12 IN105:N9LYA-7 INNOS:N9LYA-5
NodeSearch v2.2 by N1URO for URONode.
Goodbye.
End of command.
Bob Tenty has written a parallel for flexnet destis:
n1uro-15@n1uro.ampr.org:/uronode6: ds
Executing command...
Enter the first character or more of a flexnet digi callsign: k1y
Searching Flexnet Digi nodes for K1Y ...
K1YON 1-1 K1YON 2-14
Flexnet DigiSearch by VE3TOK for URONode.
Adaptation of NodeSearch v1.7 by N1URO.
Goodbye.
End of command.
While URONode handles HF just fine such as on Net105, some guys seem to live
by the game of "he with the most nodes listing on their node wins", a listing
of more than 80 nodes may time out a guest connecting into you via HF thus
NOT making them feel welcome. Having easy to use search utilities for example
will make their stay with you pleasant and easier to use than some other
systems.
Where to get it:
Latest release of URONode and various plug-ins may be downloaded from one of
two below sites:
ftp://ftp.n1uro.net/pub/hamradio/packet/ ftp://ftp.n1uro.net/pub/hamradio/packet/
https://sourceforge.net/projects/uronode/ https://sourceforge.net/projects/uronode/
It's always best to wait until you see a new version with .tgz or .tar.gz
appended so you know the code has been tested to be as bug-free as possible
or else you're on your own.
Where to get support:
I run an email list server which you may subscribe to by visiting the official
URONode website at https://uronode.n1uro.com/ just look for the link.
Acknowledgements:
I'd like to acknowledge the following people and groups for their various
contributions and support of the project:
Marius Petrescu - code contributor and member of the URONode development
team
Bob Tenty - code contributor and member of the URONode development team
Paul Lewis - supplied many great ideas for URONode
Tomasz Stankiewicz - supplied many great ideas for URONode
Barry Siegfried - supplied code for URONode
Dave Hibbard - Debian contact
Jaroslav Skarvada - Red Hat contact and code contributor
Craig Small - originated axDigi
Tomi Manninen - original (linux) node creator
Alan Cox - early linux ax.25 developer
Roy Van Zundert - FlexNode developer
Stefano Noferi - AWZNode developer
TAPR - very supportive of URONode
... and the many others involved as sysops and developers of the ax.25 and
tcp/ip stacks for linux.
URONode comes with absolutely NO WARRANTEE whatsoever. Use at your own risk.
There are no fees to use this software and unlike others we will never "beg"
for donations either. Thanks for your support by using URONode.

View File

@ -1,12 +1,17 @@
USAGE USAGE
STatus STatus [<l>ong]
DESCRIPTION DESCRIPTION
Returns information about the status of the Linux system which this Returns information about the status of the Linux system which this
URONode runs on. All information is taken directly from the URONode runs on. All information is taken directly from the
operating system. operating system.
By itself STatus will show 4 lines of basic status of the system:
Version, System time, Hostname, and Uptime. When followed with a
Long or L it will give you more detailed information about the
host.
The "load average" values indicate the average amount of processes The "load average" values indicate the average amount of processes
waiting for processor time during the last 1, 5 and 15 minutes. waiting for processor time during the last 1, 5 and 15 minutes.
Load average of 1.0 would mean that the all of the processor time is Load average of 1.0 would mean that the all of the processor time is

4
node.h
View File

@ -1,5 +1,5 @@
#define VERSION "URONode v2.11" #define VERSION "URONode v2.12"
#define COMPILING "03 March, 2020" #define COMPILING "30 June, 2020"
#define STATE_IDLE 0 #define STATE_IDLE 0
#define STATE_TRYING 1 #define STATE_TRYING 1

View File

@ -496,7 +496,7 @@ void lastlog(void)
break; break;
#endif #endif
case AF_INET: strcpy(hostname, User.call); case AF_INET: strcpy(hostname, User.call);
strcat(hostname, " from ip "); strcat(hostname, " on IPv4 ");
strcat(hostname, User.ul_name); strcat(hostname, User.ul_name);
break; break;
case AF_INET6: strcpy(hostname6, User.ul_name); case AF_INET6: strcpy(hostname6, User.ul_name);