New upstream version 2.7

This commit is contained in:
Hibby 2017-08-22 13:54:39 +01:00
parent a3886f2ff6
commit fa52d5a185
11 changed files with 131 additions and 52 deletions

View File

@ -220,20 +220,6 @@ robot scripts such as PBBS mail forwarding sessions. While other systems
may wish to continue to violate the NetRom protocol (and others) I will may wish to continue to violate the NetRom protocol (and others) I will
do everything in my power NOT to. do everything in my power NOT to.
An anonymous user from sourceforge had a compiler warning on the
do_prompt cycle in config.c and provided a fix for it. I don't know if
the user is even a ham but their alias is dcb314, and we thank them. Their
report and fix which is included:
config.c:407:35: warning: logical 'or' of collectively exhaustive tests is always true [-Wlogical-op]
Source code is
if ((User.ul_type != AF_NETROM) || (User.ul_type != AF_INET) ||
(User.ul_type != AF_INET6)) {
Maybe better code
if ((User.ul_type != AF_NETROM) && (User.ul_type != AF_INET) &&
(User.ul_type != AF_INET6)) {
While I don't get the warning he had, the logistics seem to be fine. Thanks
again to dcb314 at sourceforge for their report.
I have made a diff file for JNOS2.0K that makes it a bit more user 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 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 TCP port 3694 has been used for inbound telnet for linux-based nodes, and
@ -257,6 +243,61 @@ 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 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. on RF, it will be ignored by the node so it's not exposed.
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.
----------- 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

@ -48,6 +48,7 @@ installhelp:
installconf: installhelp installconf: installhelp
install -b -m 755 -D -d $(ETC_DIR) install -b -m 755 -D -d $(ETC_DIR)
install -b -m 600 -p etc/uronode.announce $(ETC_DIR)
install -b -m 600 -p etc/uronode.conf $(ETC_DIR) install -b -m 600 -p etc/uronode.conf $(ETC_DIR)
install -b -m 600 -p etc/uronode.perms $(ETC_DIR) install -b -m 600 -p etc/uronode.perms $(ETC_DIR)
install -b -m 600 -p etc/uronode.info $(ETC_DIR) install -b -m 600 -p etc/uronode.info $(ETC_DIR)
@ -68,11 +69,13 @@ installman:
install -m 644 -p man/flexd.8 $(MAN_DIR)/man8 install -m 644 -p man/flexd.8 $(MAN_DIR)/man8
upgrade: installman installhelp upgrade: installman installhelp
install -b -m 600 -p etc/uronode.announce $(ETC_DIR)
install -m 755 -p uronode $(SBIN_DIR) install -m 755 -p uronode $(SBIN_DIR)
install -m 755 -p nodeusers $(SBIN_DIR) install -m 755 -p nodeusers $(SBIN_DIR)
install -m 755 -p calibrate $(SBIN_DIR) install -m 755 -p calibrate $(SBIN_DIR)
@IN@ install -m 755 -p flexd $(SBIN_DIR) @IN@ install -m 755 -p flexd $(SBIN_DIR)
install -m 755 -p axdigi $(SBIN_DIR) install -m 755 -p axdigi $(SBIN_DIR)
clean: clean:
rm -f *.o *~ *.bak *.orig make.debug nodeusers uronode flexd axdigi calibrate rm -f *.o *~ *.bak *.orig make.debug nodeusers uronode flexd axdigi calibrate

View File

@ -30,6 +30,7 @@ struct cmd *Nodecmds = NULL;
void init_nodecmds(void) void init_nodecmds(void)
{ {
add_internal_cmd(&Nodecmds, "?", 1, do_help); add_internal_cmd(&Nodecmds, "?", 1, do_help);
add_internal_cmd(&Nodecmds, "Announce", 1, do_help);
add_internal_cmd(&Nodecmds, "Bye", 1, do_bye); add_internal_cmd(&Nodecmds, "Bye", 1, do_bye);
add_internal_cmd(&Nodecmds, "Escape", 1, do_escape); add_internal_cmd(&Nodecmds, "Escape", 1, do_escape);
if (User.ul_type == AF_INET) { if (User.ul_type == AF_INET) {
@ -125,9 +126,9 @@ void node_logout(char *reason)
if (check_perms(PERM_ANSI, 0L) != -1) { if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo, "\e[03;36m"); axio_printf(NodeIo, "\e[03;36m");
} }
axio_printf(NodeIo, "%s, thank you for connecting to the %s\nURONode ROSE network node. Come back again soon, 73!\r ", User.call, RoseId); axio_printf(NodeIo, "%s, thank you for connecting to the %s\nURONode ROSE network node. Come back again soon, 73!\n", User.call, RoseId);
if (check_perms(PERM_ANSI, 0L) != -1) { if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo, "\e[0;m\b"); axio_printf(NodeIo, "\e[0;m");
} }
} else } else
if ((User.ul_type == AF_FLEXNET) || (User.ul_type == AF_AX25)) { if ((User.ul_type == AF_FLEXNET) || (User.ul_type == AF_AX25)) {
@ -136,7 +137,7 @@ void node_logout(char *reason)
} }
axio_printf(NodeIo, "%s de %s\n73! ", User.call, FlexId); axio_printf(NodeIo, "%s de %s\n73! ", User.call, FlexId);
if (check_perms(PERM_ANSI, 0L) != -1) { if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo, "\e[0;m\b"); axio_printf(NodeIo, "\e[0;m");
} }
} }
#endif #endif
@ -242,18 +243,28 @@ int do_help(int argc, char **argv)
} }
if (*argv[0] == 'i') { /* "info" */ if (*argv[0] == 'i') { /* "info" */
strcpy(fname, CONF_NODE_INFO_FILE); strcpy(fname, CONF_NODE_INFO_FILE);
} else if (*argv[0] == 'a') { /* announcements */
strcpy(fname, CONF_NODE_ANN_FILE);
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");
} }
if (*argv[0] == 'i') {
// axio_printf(NodeIo,"%s - %s \n", VERSION, COMPILING);
axio_printf(NodeIo,"System Information:\n"); axio_printf(NodeIo,"System Information:\n");
} else if (*argv[0] == 'a') {
// axio_printf(NodeIo,"%s - %s \n", VERSION, COMPILING);
// axio_printf(NodeIo,"System Announcements/News:\n");
axio_printf(NodeIo," NEWS & ANNOUNCEMENTS NEWS & ANNOUNCEMENTS NEWS & ANNOUNCEMENTS\n");
axio_printf(NodeIo," -------------------- -------------------- --------------------\n");
}
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");
} }
axio_printf(NodeIo,"%s - %s \n", VERSION, COMPILING);
} else if (!argv[1]) { /* "help" */ } else if (!argv[1]) { /* "help" */
strcpy(fname, DATA_NODE_HELP_DIR "help.hlp"); strcpy(fname, DATA_NODE_HELP_DIR "help.hlp");
} else { /* "help <cmd>" */ } else { /* "help <cmd>" */
@ -262,7 +273,7 @@ int do_help(int argc, char **argv)
fname[sizeof(fname) - 1] = 0; fname[sizeof(fname) - 1] = 0;
} }
if ((fp = fopen(fname, "r")) == NULL) { if ((fp = fopen(fname, "r")) == NULL) {
if (*argv[0] != 'i') if ((*argv[0] != 'a') || (*argv[0] != 'i'))
if (User.ul_type == AF_NETROM) { if (User.ul_type == AF_NETROM) {
axio_printf(NodeIo,"%s} ", NodeId); axio_printf(NodeIo,"%s} ", NodeId);
} }
@ -273,9 +284,11 @@ int do_help(int argc, char **argv)
return 0; return 0;
} }
if (User.ul_type == AF_NETROM) { if (User.ul_type == AF_NETROM) {
axio_printf(NodeIo,"%s} ", NodeId); // axio_printf(NodeIo,"%s} ", NodeId);
} }
if (*argv[0] != 'i') if ((*argv[0] != 'a') || (*argv[0] != 'i'))
axio_printf(NodeIo,"");
else
node_msg("Help for command %s", argv[1] ? argv[1] : "help"); node_msg("Help for command %s", argv[1] ? argv[1] : "help");
while (fgets(line, 256, fp) != NULL) while (fgets(line, 256, fp) != NULL)
axio_puts(line,NodeIo); axio_puts(line,NodeIo);

View File

@ -40,7 +40,8 @@ static char *HiddenPorts[32] = {0};
/* /*
* Return non-zero if `port' is a hidden port. * Return non-zero if `port' is a hidden port.
*/ */
int is_hidden(const char *port) int is_hidden(const char *port)
{ {
int i; int i;
@ -54,6 +55,7 @@ int is_hidden(const char *port)
/* /*
* Return non-zero if peer is on "local" or loopback network. * Return non-zero if peer is on "local" or loopback network.
*/ */
static int is_local(unsigned long peer) static int is_local(unsigned long peer)
{ {
return ((peer & LocalMask) == LocalNet) || ((peer & 0xff) == 127); return ((peer & LocalMask) == LocalNet) || ((peer & 0xff) == 127);
@ -404,7 +406,7 @@ static int do_roseid(int argc, char **argv)
static int do_prompt(int argc, char **argv) static int do_prompt(int argc, char **argv)
{ {
if ((User.ul_type != AF_NETROM) && (User.ul_type != AF_INET) && (User.ul_type != AF_INET6)) { if ((User.ul_type != AF_NETROM) || (User.ul_type != AF_INET) || (User.ul_type != AF_INET6)) {
if (argc < 2) { if (argc < 2) {
return -1; return -1;
Prompt = strdup(argv[1]); Prompt = strdup(argv[1]);

View File

@ -21,6 +21,7 @@
#define CONF_NODE_PERMS_FILE "@ETC_DIR@/uronode.perms" #define CONF_NODE_PERMS_FILE "@ETC_DIR@/uronode.perms"
@HAVEMOTD@ @MOTDPATH@ @HAVEMOTD@ @MOTDPATH@
#define CONF_NODE_INFO_FILE "@ETC_DIR@/uronode.info" #define CONF_NODE_INFO_FILE "@ETC_DIR@/uronode.info"
#define CONF_NODE_ANN_FILE "@ETC_DIR@/uronode.announce"
#define AX_ROUTES_FILE "@ETC_DIR@/uronode.routes" #define AX_ROUTES_FILE "@ETC_DIR@/uronode.routes"
#define CONF_USERS_FILE "@ETC_DIR@/uronode.users" #define CONF_USERS_FILE "@ETC_DIR@/uronode.users"
#define FLEXD_CONF_FILE "@ETC_DIR@/flexd.conf" #define FLEXD_CONF_FILE "@ETC_DIR@/flexd.conf"

2
etc/uronode.announce Normal file
View File

@ -0,0 +1,2 @@
Place your news/announcements in here. Good place for announcing
club meetings, club announcements, area flea markets, etc.

View File

@ -24,6 +24,7 @@
#include <netax25/rsconfig.h> #include <netax25/rsconfig.h>
#include <netax25/procutils.h> #include <netax25/procutils.h>
#include "sysinfo.h"
#include "procinfo.h" #include "procinfo.h"
#include "node.h" #include "node.h"
@ -138,9 +139,10 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
/* Uncomment the below if you wish to have the node show a 'Trying' state */ /* Uncomment the below if you wish to have the node show a 'Trying' state */
if (check_perms(PERM_ANSI, 0L) != -1) { if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo, "\e[01;35m"); axio_printf(NodeIo, "\e[01;35m");
} }
axio_printf(NodeIo,"Trying %s... press <Enter> to abort", User.dl_name); if (User.ul_type != AF_NETROM) {
axio_printf(NodeIo,"Trying %s... <Enter> aborts. ", User.dl_name);
}
break; break;
#endif #endif
#ifdef HAVE_NETROM #ifdef HAVE_NETROM
@ -189,8 +191,8 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
if (check_perms(PERM_ANSI, 0L) != -1) { if (check_perms(PERM_ANSI, 0L) != -1) {
if (User.ul_type == AF_NETROM) { if (User.ul_type == AF_NETROM) {
break; break;
} } if (User.ul_type != AF_NETROM) {
node_msg("\e[01;36mTrying %s... hit <Enter> to abort", User.dl_name); node_msg("\e[01;36mTrying %s... <Enter> aborts. ", User.dl_name);
} }
break; break;
#endif #endif
@ -199,7 +201,7 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
case AF_AX25: case AF_AX25:
if (aliascmd==0) { if (aliascmd==0) {
if (check_perms(PERM_AX25, 0L) == -1 || (is_hidden(addr[0]) && check_perms(PERM_HIDDEN, 0L) == -1)) { if (check_perms(PERM_AX25, 0L) == -1 || (is_hidden(addr[0]) && check_perms(PERM_HIDDEN, 0L) == -1)) {
axio_printf(NodeIo,"Permission denied"); axio_printf(NodeIo,"Not a user interface.");
if (User.ul_type == AF_NETROM) { if (User.ul_type == AF_NETROM) {
node_msg(""); node_msg("");
} }
@ -328,13 +330,19 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
return NULL; return NULL;
} }
} }
/* if ((check_perms(PERM_ANSI, 0L) != -1) && (family == AF_NETROM)) { if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo,"\e[01;36m%s Trying %s... Type <RETURN> to abort. (Escape: %s%c) \n",NodeId, axio_printf(NodeIo,"\e[01;36m");
User.dl_name, }
escape < 32 ? "CTRL-" : "", if (User.ul_type != AF_NETROM) {
escape < 32 ? (escape + 'A' - 1) : escape); axio_printf(NodeIo,"Trying %s:%s... <Enter> aborts. ", User.dl_name, User.dl_port);
// escape < 32 ? "CTRL-" : "",
// escape < 32 ? (escape + 'A' - 1) : escape);
axio_flush(NodeIo); axio_flush(NodeIo);
} */ }
}
if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo,"\e[0m");
}
break; break;
default: default:
if (User.ul_type == AF_NETROM) { if (User.ul_type == AF_NETROM) {
@ -448,8 +456,11 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
} }
if (check_perms(PERM_ANSI, 0L) != -1) { if (check_perms(PERM_ANSI, 0L) != -1) {
axio_printf(NodeIo,"\e[01;32m"); axio_printf(NodeIo,"\e[01;32m");
} } if (User.ul_type != AF_NETROM) {
node_msg("Socket established to %s:%s", User.dl_name, User.dl_port); node_msg("\nSocket established to %s:%s", User.dl_name, User.dl_port);
} else {
node_msg("Socket established to %s:%s", User.dl_name, User.dl_port);
}
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");
} }

View File

@ -36,9 +36,10 @@ int do_jheard (int argc,char **argv) {
axio_printf(NodeIo,"%s} ",NodeId); axio_printf(NodeIo,"%s} ",NodeId);
if(argc > 0) { if(argc > 0) {
if(ax25_config_get_dev(argv[1]) == NULL if(ax25_config_get_dev(argv[1]) == NULL)
|| (check_perms(PERM_HIDDEN, 0) == -1 // || (check_perms(PERM_HIDDEN, 0) == -1
&& is_hidden(argv[1]))) { // && is_hidden(argv[1]))) {
{
axio_printf(NodeIo,"Invalid interface: %s", argv[1]); axio_printf(NodeIo,"Invalid interface: %s", argv[1]);
if(User.ul_type == AF_NETROM) if(User.ul_type == AF_NETROM)
@ -57,8 +58,8 @@ int do_jheard (int argc,char **argv) {
if(strcmp(argv[1],mh.portname)) if(strcmp(argv[1],mh.portname))
continue; continue;
} }
if(check_perms(PERM_HIDDEN,0) == -1 && is_hidden(mh.portname)) // if(check_perms(PERM_HIDDEN,0) == -1 && is_hidden(mh.portname))
continue; // continue;
if((new = calloc(1,sizeof(struct mheard_list))) == NULL) { if((new = calloc(1,sizeof(struct mheard_list))) == NULL) {
node_perror("do_mheard: calloc",errno); node_perror("do_mheard: calloc",errno);
@ -163,11 +164,11 @@ int do_jlong (int argc,char **argv) {
axio_printf(NodeIo,"%s} ",NodeId); axio_printf(NodeIo,"%s} ",NodeId);
if(argc > 0) { if(argc > 0) {
if(ax25_config_get_dev(argv[1]) == NULL if(ax25_config_get_dev(argv[1]) == NULL )
|| (check_perms(PERM_HIDDEN, 0) == -1 // || (check_perms(PERM_HIDDEN, 0) == -1
&& is_hidden(argv[1]))) { // && is_hidden(argv[1])))
{
axio_printf(NodeIo,"Invalid interface: %s", argv[1]); axio_printf(NodeIo,"Invalid interface: %s", argv[1]);
if(User.ul_type == AF_NETROM) if(User.ul_type == AF_NETROM)
node_msg(""); node_msg("");
@ -184,8 +185,8 @@ int do_jlong (int argc,char **argv) {
if(strcmp(argv[1],mh.portname)) if(strcmp(argv[1],mh.portname))
continue; continue;
} }
if(check_perms(PERM_HIDDEN,0) == -1 && is_hidden(mh.portname)) // if(check_perms(PERM_HIDDEN,0) == -1 && is_hidden(mh.portname))
continue; // continue;
if((new = calloc(1,sizeof(struct mheard_list))) == NULL) { if((new = calloc(1,sizeof(struct mheard_list))) == NULL) {
node_perror("do_mheard: calloc",errno); node_perror("do_mheard: calloc",errno);

View File

@ -15,6 +15,11 @@ The following commands are supported for users of
.BI ? .BI ?
Give short list of available commands. Give short list of available commands.
.TP 13 .TP 13
.BI Announce
Reads the file uronode.announce. This is like a local announcement wall
where you can give your locals connecting into your node a chance to see
the local activities going on like a cork board with posted announcements.
.TP 13
.BI Bye .BI Bye
Disconnect user from the node. Disconnect user from the node.
.TP 13 .TP 13

2
node.c
View File

@ -402,7 +402,7 @@ int main(int argc, char *argv[])
} }
else { else {
if (User.ul_type == AF_NETROM) { if (User.ul_type == AF_NETROM) {
node_msg("%s Too many invalid commands. Disconnecting...", NodeId); node_msg("%s} Too many invalid commands. Disconnecting...", NodeId);
node_logout("Too many invalid commands"); node_logout("Too many invalid commands");
} else { } else {
node_msg("Too many invalid commands, disconnecting you..."); node_msg("Too many invalid commands, disconnecting you...");

4
node.h
View File

@ -1,5 +1,5 @@
#define VERSION "URONode v2.6" #define VERSION "URONode v2.7"
#define COMPILING "November 25, 2016" #define COMPILING "June 1, 2017"
#define STATE_IDLE 0 #define STATE_IDLE 0
#define STATE_TRYING 1 #define STATE_TRYING 1