diff --git a/CHANGES.3 b/CHANGES.3 index 3e89b96..e2b9e5f 100644 --- a/CHANGES.3 +++ b/CHANGES.3 @@ -393,6 +393,48 @@ 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. +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! + ----------- Note on SystemD -------- In uronode.socket, you'll notice the line: ListenStream=0.0.0.0:3694 @@ -436,7 +478,7 @@ 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 -Join our support mail list graciously donated by TAPR! -http://www.tapr.org/mailman/listinfo/uronode +Join our support mail list: +https://uronode.n1uro.com/list/ 73 de Brian N1URO diff --git a/axdigi.c b/axdigi.c index 06ecb2f..2f3dbe6 100644 --- a/axdigi.c +++ b/axdigi.c @@ -21,7 +21,7 @@ * 12th June 1997. */ -#include <net/if.h> +#include </usr/include/net/if.h> #include <linux/if_ether.h> #include <netinet/in.h> #include <sys/ioctl.h> diff --git a/command.c b/command.c index c6b18f9..7d5c4be 100644 --- a/command.c +++ b/command.c @@ -39,7 +39,7 @@ void init_nodecmds(void) add_internal_cmd(&Nodecmds, "Help", 1, do_help); add_internal_cmd(&Nodecmds, "Info", 1, do_help); 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); #ifdef HAVEMOTD 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, "Links", 1, do_links); 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); #ifdef HAVE_FLEX add_internal_cmd(&Nodecmds, "Desti", 1, do_dest); @@ -77,6 +77,10 @@ void init_nodecmds(void) void node_prompt(const char *fmt, ...) { + + if ((User.ul_type == AF_NETROM) && (check_perms(PERM_ANSI, 0L) != -1)) { + axio_printf(NodeIo,"\e[0m"); + } if (User.ul_type == AF_NETROM) { axio_printf(NodeIo,"%s} ", NodeId); } @@ -765,7 +769,8 @@ int do_nodes(int argc, char **argv) /* * by Heikki Hannikainen <hessu@pspt.fi> * 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) { @@ -788,21 +793,59 @@ int do_status(int argc, char **argv) int na, nl, nd; #endif int ma, mu, mf, sa, su, sf; +/* "Status" */ + if (argc == 1) { 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("Status:"); + node_msg("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); + } + /* 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); } /* read and calculate the amount of uptime and format it nicely */ @@ -817,9 +860,10 @@ int do_status(int argc, char **argv) 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]); + 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()); - + // if (!(mem = meminfo()) || meminfo("memtotal") == 0) { /* cannot normalize mem usage */ // axio_printf(NodeIo,"Cannot get memory information!\n"); @@ -841,8 +885,7 @@ int do_status(int argc, char **argv) } else axio_printf(NodeIo,"Cannot get swap information or swap not active!\n"); - axio_printf(NodeIo," "); - + axio_printf(NodeIo," "); } #ifdef HAVE_AX25 @@ -898,6 +941,7 @@ int do_status(int argc, char **argv) #endif if (User.ul_type == AF_NETROM) { node_msg(""); + } } return 0; } @@ -931,6 +975,7 @@ int do_version(int argc, char **argv) } return 0; } + int nuser_list(int argc, char **argv) { FILE *f; diff --git a/docs/README b/docs/README new file mode 100644 index 0000000..7836984 --- /dev/null +++ b/docs/README @@ -0,0 +1 @@ +URONode documentation in both ascii text and word-97 .doc format. diff --git a/docs/URONode.doc b/docs/URONode.doc new file mode 100644 index 0000000..d8f25a0 Binary files /dev/null and b/docs/URONode.doc differ diff --git a/docs/URONode.txt b/docs/URONode.txt new file mode 100644 index 0000000..c6713cc --- /dev/null +++ b/docs/URONode.txt @@ -0,0 +1,244 @@ +Documentation for URONode program +dated 28/03/2020 + +Contents: + + 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/ + 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. diff --git a/etc/help/status.hlp b/etc/help/status.hlp index 44c18c7..664005c 100644 --- a/etc/help/status.hlp +++ b/etc/help/status.hlp @@ -1,12 +1,17 @@ USAGE - STatus + STatus [<l>ong] DESCRIPTION Returns information about the status of the Linux system which this URONode runs on. All information is taken directly from the 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 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 diff --git a/gateway.c b/gateway.c index e480b8f..7b2dd3b 100644 --- a/gateway.c +++ b/gateway.c @@ -266,7 +266,12 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr) if (check_perms(PERM_ANSI, 0L) != -1) { axio_printf(NodeIo, "\e[01;33m"); } + if (check_perms(PERM_ANSI, 0L) == -1) { axio_printf(NodeIo,"link setup (%s)...", User.dl_port); + } + if (check_perms(PERM_ANSI, 0L) != -1) { + axio_printf(NodeIo,"link setup (%s)...\e[0;m", User.dl_port); + } } /* else node_msg("Trying %s on %s... Type <RETURN> to abort", User.dl_name, User.dl_port); */ break; @@ -795,7 +800,7 @@ int do_connect(int argc, char **argv) if (check_perms(PERM_ANSI, 0L) != -1) { axio_printf(NodeIo,"\e[01;31m"); } - axio_printf(NodeIo,"Returning you to the shell..."); + axio_printf(NodeIo, "Returning you to the shell..."); } else if ((User.ul_type == AF_AX25) && (!stay)) { axio_flush(NodeIo); @@ -1146,17 +1151,17 @@ int do_ping(int argc, char **argv) if (User.ul_type == AF_NETROM){ axio_printf(NodeIo,"%s} ", NodeId); } - if (User.ul_type == AF_INET) { +// if (User.ul_type == AF_INET) { if (check_perms(PERM_ANSI, 0L) != -1) { axio_printf(NodeIo, "\e[05;31m"); - } +// } } axio_printf(NodeIo,"Ping aborted."); - if (User.ul_type == AF_INET) { +// if (User.ul_type == AF_INET) { if (check_perms(PERM_ANSI, 0L) != -1) { axio_printf(NodeIo, "\e[0;m"); } - } +// } if (User.ul_type == AF_NETROM) { node_msg(""); } diff --git a/node.h b/node.h index fa9dfe5..af7f581 100644 --- a/node.h +++ b/node.h @@ -1,5 +1,5 @@ -#define VERSION "URONode v2.10" -#define COMPILING "December, 2018" +#define VERSION "URONode v2.12" +#define COMPILING "30 June, 2020" #define STATE_IDLE 0 #define STATE_TRYING 1 diff --git a/system.c b/system.c index f1079d5..2e69ef4 100644 --- a/system.c +++ b/system.c @@ -458,6 +458,7 @@ void lastlog(void) int UserId=0; char tty[LAST_DATA_SIZE]; char hostname[LAST_DATA_SIZE]; + char hostname6[LAST_DATA_SIZE]; char usercall[10]; char *cp; int escape; @@ -494,7 +495,13 @@ void lastlog(void) } break; #endif - case AF_INET: strcpy(hostname, User.ul_name); + case AF_INET: strcpy(hostname, User.call); + strcat(hostname, " on IPv4 "); + strcat(hostname, User.ul_name); + break; + case AF_INET6: strcpy(hostname6, User.ul_name); + strcat(hostname, User.call); + strcat(hostname, " on IPv6"); break; case AF_UNSPEC: strcpy(hostname, User.call); strcat(hostname, " on local"); diff --git a/systemd/uronode.service b/systemd/uronode.service deleted file mode 100644 index b380c87..0000000 --- a/systemd/uronode.service +++ /dev/null @@ -1,17 +0,0 @@ -[Unit] -Description = URONode Server -Requires = uronode.socket -After=syslog.target network.target - -[Service] -Type=oneshot -ExecStartPre=systemctl start uronode.socket -ExecStart=/usr/local/sbin/uronode -ExecStartPost=systemctl restart uronode.socket -StandardInput=socket -Sockets=uronode.socket - -[Install] -Also = uronode.socket -WantedBy = multi-user.target -WantedBy = network.target diff --git a/user.c b/user.c index 2b1fb44..c0f2b26 100644 --- a/user.c +++ b/user.c @@ -185,6 +185,9 @@ int user_list(int argc, char **argv) sprintf(buf, "\nTelnet (%.9s @ %.16s)", u.call, u.ul_name); break; + case AF_INET6: + sprintf(buf, "\nTelnet6 (%.9s via IPv6)", u.call); + break; case AF_UNSPEC: sprintf(buf, "\nHost (%.9s on local)", u.call);