diff --git a/CHANGES.2 b/CHANGES.2 index 08bdb06..4499cc4 100644 --- a/CHANGES.2 +++ b/CHANGES.2 @@ -695,39 +695,6 @@ Fortunatey I maintain monthly backups and restored from that. For me this meant minimum recreations of work lost. As for URONode, I only lost the suggestion by VE1JOT and other clean ups. - --- +see CHANGES.1 for prior changes, or CHANGES.3 for the latest changes. -Known NON-Critical Bugs: -Status memory/swap reporting fix - -Wish-list: -Who file sorter -pactor - requested by sv1uy ------------ - -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. 19 - ------------- - -Comments/suggestions? email: n1uro@n1uro.ampr.org -Gripes??? cat gripes > /dev/null Smile just kidding! - -This version will get you going for now. I'll post any changes to: -ftp://ftp.n1uro.net/packet - -Join our support mail list graciously donated by TAPR! -http://www.tapr.org/mailman/listinfo/uronode - -73 de Brian N1URO diff --git a/CHANGES.3 b/CHANGES.3 new file mode 100644 index 0000000..c8da290 --- /dev/null +++ b/CHANGES.3 @@ -0,0 +1,224 @@ +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. + +----------- 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. +search uronode + +Join our support mail list graciously donated by TAPR! +http://www.tapr.org/mailman/listinfo/uronode + +73 de Brian N1URO + diff --git a/Makefile.in b/Makefile.in index 14efeb9..daebe36 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -all: nodeusers uronode axdigi @FLEXNET@ +all: nodeusers uronode axdigi calibrate @FLEXNET@ CC = gcc LD = gcc @@ -15,43 +15,46 @@ NODE_SRC = node.c cmdparse.c config.c command.c mheard.c axcalluser.c \ NODEUSERS_SRC = nodeusers.c FLEXD_SRC = flexd.c procinfo.c DIGI_SRC = axdigi.c +CALIBRATE_SRC = calibrate.c COMMON_OBJS = $(COMMON_SRC:.c=.o) NODE_OBJS = $(NODE_SRC:.c=.o) NODEUSERS_OBJS = $(NODEUSERS_SRC:.c=.o) FLEXD_OBJS = $(FLEXD_SRC:.c=.o) DIGI_OBJS = $(DIGI_SRC:.c=.o) +CALIBRATE_OBJS = $(CALIBRATE_SRC:.c=.o) .c.o: $(CC) $(CFLAGS) -c $< install: installbin installman installhelp installconf - install -m 755 -D -d $(VAR_DIR) - install -m 755 -D -d $(VAR_DIR)/node - install -m 644 -p etc/loggedin $(VAR_DIR)/node - install -m 644 -p etc/lastlog $(VAR_DIR)/node - install -m 755 -D -d $(VAR_DIR)/flex - install -m 644 -p etc/gateways $(VAR_DIR)/flex + install -b -m 755 -D -d $(VAR_DIR) + install -b -m 755 -D -d $(VAR_DIR)/node + install -b -m 644 -p etc/loggedin $(VAR_DIR)/node + install -b -m 644 -p etc/lastlog $(VAR_DIR)/node + install -b -m 755 -D -d $(VAR_DIR)/flex + install -b -m 644 -p etc/gateways $(VAR_DIR)/flex installbin: all install -m 755 -s -p uronode $(SBIN_DIR) install -m 755 -s -p nodeusers $(SBIN_DIR) install -m 755 -s -p axdigi $(SBIN_DIR) + install -m 755 -s -p calibrate $(SBIN_DIR) @IN@ install -m 755 -s -p flexd $(SBIN_DIR) installhelp: - install -m 755 -D -d $(VAR_DIR) - install -m 755 -D -d $(VAR_DIR)/node/help - install -m 644 -p etc/help/*.hlp $(VAR_DIR)/node/help + install -b -m 755 -D -d $(VAR_DIR) + install -b -m 755 -D -d $(VAR_DIR)/node/help + install -b -m 644 -p etc/help/*.hlp $(VAR_DIR)/node/help installconf: installhelp - install -m 755 -D -d $(ETC_DIR) - install -m 600 -p etc/uronode.conf $(ETC_DIR) - install -m 600 -p etc/uronode.perms $(ETC_DIR) - install -m 600 -p etc/uronode.info $(ETC_DIR) - install -m 600 -p etc/uronode.motd $(ETC_DIR) - install -m 600 -p etc/uronode.users $(ETC_DIR) - install -m 600 -p etc/uronode.routes $(ETC_DIR) - install -m 600 -p etc/flexd.conf $(ETC_DIR) + install -b -m 755 -D -d $(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.info $(ETC_DIR) + install -b -m 600 -p etc/uronode.motd $(ETC_DIR) + install -b -m 600 -p etc/uronode.users $(ETC_DIR) + install -b -m 600 -p etc/uronode.routes $(ETC_DIR) + install -b -m 600 -p etc/flexd.conf $(ETC_DIR) installman: install -m 755 -D -d $(MAN_DIR)/man1 $(MAN_DIR)/man5 $(MAN_DIR)/man8 @@ -60,27 +63,29 @@ installman: install -m 644 -p man/uronode.perms.5 $(MAN_DIR)/man5 install -m 644 -p man/flexd.conf.5 $(MAN_DIR)/man5 install -m 644 -p man/uronode.8 $(MAN_DIR)/man8 + install -m 644 -p man/calibrate.8 $(MAN_DIR)/man8 install -m 644 -p man/axdigi.8 $(MAN_DIR)/man8 install -m 644 -p man/flexd.8 $(MAN_DIR)/man8 -upgrade: installman +upgrade: installman installhelp install -m 755 -p uronode $(SBIN_DIR) install -m 755 -p nodeusers $(SBIN_DIR) - install -m 755 -p flexd $(SBIN_DIR) + install -m 755 -p calibrate $(SBIN_DIR) +@IN@ install -m 755 -p flexd $(SBIN_DIR) install -m 755 -p axdigi $(SBIN_DIR) clean: - rm -f *.o *~ *.bak *.orig make.debug nodeusers uronode flexd axdigi + rm -f *.o *~ *.bak *.orig make.debug nodeusers uronode flexd axdigi calibrate rm -f etc/*~ etc/*.bak etc/*.orig rm -f etc/help/*~ etc/help/*.bak etc/help/*.orig distclean: clean rm -f .depend Makefile.include config.h - rm -f uronode nodeusers axdigi @FLEXNET@ + rm -f uronode nodeusers axdigi calibrate @FLEXNET@ rm -f Makefile make.debug depend: - $(CC) $(CFLAGS) -M $(COMMON_SRC) $(NODE_SRC) $(NODEUSERS_SRC) $(FLEXD_SRC) > .depend + $(CC) $(CFLAGS) -M $(COMMON_SRC) $(NODE_SRC) $(NODEUSERS_SRC) $(FLEXD_SRC) $(CALIBRATE_SRC) > .depend uronode: $(COMMON_OBJS) $(NODE_OBJS) $(LD) $(LDFLAGS) -o uronode $(COMMON_OBJS) $(NODE_OBJS) $(LIBS) $(ZLIB) @@ -91,8 +96,11 @@ nodeusers: $(COMMON_OBJS) $(NODEUSERS_OBJS) flexd: $(FLEXD_OBJS) $(LD) $(LDFLAGS) -o flexd $(FLEXD_OBJS) $(LIBS) $(ZLIB) +calibrate: $(CALIBRATE_OBJS) + $(LD) $(LDFLAGS) -o calibrate $(CALIBRATE_OBJS) $(LIBS) $(ZLIB) + axdigi: $(DIGI_OBJS) - $(LD) $(LDFLAGS) -o axdigi $(DIGI_OBJS) $(LIBS) + $(LD) $(LDFLAGS) -o axdigi $(DIGI_OBJS) $(LIBS) $(ZLIB) ifeq (.depend,$(wildcard .depend)) include .depend diff --git a/README.flexd b/README.flexd new file mode 100644 index 0000000..be26838 --- /dev/null +++ b/README.flexd @@ -0,0 +1,30 @@ +If you find that your flexd isn't properly working, scroll down to line 120 +where it says: +char buffer[256], port[14], path[AX25_MAX_DIGIS*10] +and adjust the buffer per your neighbor's screens. The formula is: +2 data frames: 256 +3 data frames: 512 +4 data frames: 1024 + +Unfortunately the configure script can't autosense this because in some +cases, flexd doesn't already exist yet. To determine how many frames you're +receiving, use the (ax)listen tool and count the frames after making a manual +connect. Ex: +ax2: fm N1URO-15 to N1URO-1 ctl SABM+ +ax2: fm N1URO-1 to N1URO-15 ctl UA- +ax2: fm N1URO-1 to N1URO-15 ctl I00^ pid=F0(Text) len 256 +0000 PC/FlexNet V3.3g - Welcome to the N1URO FlexNet-Digi. This node +0040 is located at .Unionville, Hartford County, Connecticut [FN31ns] +0080 . This version of pc/Flexnet.and all related services are hosted +00C0 under the Linux operating system. Enjoy!..Basic commands are:.< +ax2: fm N1URO-1 to N1URO-15 ctl I01^ pid=F0(Text) len 176 +0000 A>rea destinations file.onnect .estinations list..< +0040 H>elp (more detailed command list).inks.list...ailBox (BBS +0080 URO:N1URO-4).uit this node..alk ..=> + +Here I made a manual connect from my URONode to my pc/FlexNet node. +After the protocol handshakes there's 2 frames prior to the => prompt. +So using the formula above, my line needs to be 256 for the buffer size. + +Hope this may help those with flexd errors. +73 de Brian N1URO diff --git a/axdigi.c b/axdigi.c index e82a553..928d67c 100644 --- a/axdigi.c +++ b/axdigi.c @@ -33,6 +33,8 @@ /* below added by N1URO */ #include #include +#include +#include #include #include /* added by N1URO */ @@ -51,7 +53,7 @@ void get_interfaces(int skt); #define E_BIT 0x01 /* Address extension bit */ #define REPEATED 0x80 /* Has-been-repeated bit */ #define MAX_PORTS 16 -#define VERSION "0.2" +#define VERSION "0.3" #define AXDIGI_PID_FILE "/var/run/axdigi.pid" int port_count = 0; unsigned char portname[MAX_PORTS][20]; @@ -59,20 +61,24 @@ unsigned char portcall[MAX_PORTS][8]; void(*sigterm_defhnd)(int); -static void quit_handler(int sig) +void quit_handler(int sig) { + unlink(AXDIGI_PID_FILE); signal(SIGTERM, SIG_IGN); - - unlink(AXDIGI_PID_FILE); - -// signal(SIGTERM, sigterm_defhnd); - signal(SIGTERM, quit_handler); + fprintf(stderr, "axDigi quitting.\n\r"); + signal(SIGTERM, sigterm_defhnd); raise(SIGTERM); - unlink(AXDIGI_PID_FILE); - system("rm -f /var/run/axdigi.pid"); return; } +void hup_handler(int sig) +{ + signal(SIGHUP, SIG_IGN); + fprintf(stderr, "SIGHUP caught by axDigi.\n\r"); + signal(SIGHUP, hup_handler); /* Restore hangup handler */ +} + + int main(int argc, char *argv[]) { int skt; @@ -80,28 +86,17 @@ int main(int argc, char *argv[]) unsigned char buf[4096]; struct sockaddr sa; int asize; - - system("rm -f /var/run/axdigi.pid"); FILE *pidfile; -// signal(SIGALRM, alarm_handler); -// signal(SIGTERM, term_handler); -// signal(SIGPIPE, quit_handler); -// signal(SIGQUIT, quit_handler); - -// pidfile = fopen(AXDIGI_PID_FILE, "w"); -// fprintf(pidfile, "%d\n", (int)getpid()); -// fclose(pidfile); - /* Check our huge range of flags */ if (argc > 1) { if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "-h") ==0) { printf("axdigi version %s. Copyright (C) 1995 Craig Small VK2XLZ\n", VERSION); - printf("modificatiions 2012-present by Brian N1URO\n\n"); + printf("modificatiions Copyright (C) 2012-present by Brian N1URO\n\n"); printf("axdigi comes with ABSOLUTELY NO WARRANTY.\n"); printf("This is free software, and you are welcome to redistribute it\n"); printf("under the terms of GNU General Public Licence as published\n"); @@ -112,6 +107,7 @@ int main(int argc, char *argv[]) } /* Routine to daemonize - added by N1URO */ + if (!daemon_start(TRUE)) { fprintf(stderr, "Sorry, axdigi cannot become a daemon\n"); return 1; @@ -126,8 +122,12 @@ if (!daemon_start(TRUE)) { pidfile = fopen(AXDIGI_PID_FILE, "w"); fprintf(pidfile, "%d\n", (int)getpid()); + fprintf(stderr, "axDigi started. \n\r"); fclose(pidfile); + signal(SIGHUP, hup_handler); + sigterm_defhnd = signal(SIGTERM, quit_handler); + get_interfaces(skt); while(1) @@ -154,7 +154,6 @@ if (!daemon_start(TRUE)) { } /* while(1) */ close(skt); -// system("rm -f /var/run/axdigi.pid"); } int recv_packet(unsigned char *buf, int size, unsigned char *port) @@ -299,3 +298,5 @@ void get_interfaces(int skt) } } /* for */ } + +void(*sigterm_defhnd)(int); diff --git a/calibrate b/calibrate deleted file mode 100755 index f6d3ace..0000000 Binary files a/calibrate and /dev/null differ diff --git a/calibrate.c b/calibrate.c new file mode 100644 index 0000000..2b4412d --- /dev/null +++ b/calibrate.c @@ -0,0 +1,130 @@ +/* + * calibrate : Modem calibration utility + * Most code is portion of beacon.c of the standard ax25-utils package + * F1OAT 980321 + * mods by N1URO 151123 + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#define BUFLEN 256 +#define NBFRAMES 100 +#define TEMPO 1000 + + +static void Usage(void) +{ + fprintf(stderr, "Usage : calibrate [-t ms] interface\n"); + exit(1); +} + +int main(int argc, char *argv[]) +{ + struct full_sockaddr_ax25 dest; + struct full_sockaddr_ax25 src; + int i, s, dlen, len, tempo = TEMPO; + char *port; + char *srccall = NULL, *destcall = "CAL"; + char buffer[BUFLEN]; + fd_set rfds; + struct timeval tv; + + if (argc < 2) Usage(); + + while ((s = getopt(argc, argv, "t:")) != -1) { + switch (s) { + case 't': + tempo = atoi(optarg); + break; + case ':': + fprintf(stderr, "calibrate: option -t needs a duration in ms\n"); + return 1; + case '?': + Usage(); + return 1; + } + } + + if (optind == argc) { + Usage(); + return 1; + } + + port = argv[optind]; + + if (ax25_config_load_ports() == 0) { + fprintf(stderr, "calibrate: no AX.25 interfaces defined\n"); + return 1; + } + + if ((srccall = ax25_config_get_addr(port)) == NULL) { + fprintf(stderr, "calibrate: invalid AX.25 interface setting - %s\n", port); + return 1; + } + + if ((dlen = ax25_aton(destcall, &dest)) == -1) { + fprintf(stderr, "calibrate: unable to convert callsign '%s'\n", destcall); + return 1; + } + + if ((len = ax25_aton(srccall, &src)) == -1) { + fprintf(stderr, "calibrate: unable to convert callsign '%s'\n", srccall); + return 1; + } + + if ((s = socket(AF_AX25, SOCK_DGRAM, 0)) == -1) { + perror("socket"); + return 1; + } + + if (bind(s, (struct sockaddr *)&src, len) == -1) { + perror("bind"); + return 1; + } + + printf("Press return to stop calibrate\n"); + + for (i = 0 ; i < BUFLEN ; i++) + buffer[i] = 0x55; + + for (i = 0 ; i < NBFRAMES ; i++) { +/* fd_set rfds; + struct timeval tv; +*/ + tv.tv_sec = tempo / 1000; + tv.tv_usec = (tempo % 1000) * 1000; + + FD_ZERO(&rfds); + FD_SET(0, &rfds); + + if (select(1, &rfds, NULL, NULL, &tv) == 1) break; + + buffer[0] = (i / 100) + '0'; + buffer[1] = ((i % 100) / 10) + '0'; + buffer[2] = (i % 10) + '0'; + + if (sendto(s, buffer, BUFLEN, 0, (struct sockaddr *)&dest, dlen) == -1) { + perror("sendto"); + } + } + + close(s); + + return 0; +} diff --git a/command.c b/command.c index 457522d..e793c36 100644 --- a/command.c +++ b/command.c @@ -96,6 +96,12 @@ void node_prompt(const char *fmt, ...) if ((User.ul_type == AF_ROSE) && (check_perms(PERM_ANSI, 0L) != -1)) { axio_printf(NodeIo,"\r\e[01;35m-=>\e[0m \b"); } + if ((User.ul_type ==AF_INET6) && (check_perms(PERM_ANSI, 0L) == -1)) { + axio_printf(NodeIo, "\nSystemD - %s@%s: ",User.call, HostName); + } + if ((User.ul_type ==AF_INET6) && (check_perms(PERM_ANSI, 0L) != -1)) { + axio_printf(NodeIo, "\n\e[01;31mSystemD \e[0m- \e[01;34m%s@\e[0m%s: ",User.call, HostName); + } /* axio_flush(NodeIo); */ } @@ -784,26 +790,27 @@ int do_status(int argc, char **argv) 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()) || mem[meminfo_main][meminfo_total] == 0) { +// if (!(mem = meminfo()) || meminfo("memtotal") == 0) { /* cannot normalize mem usage */ - axio_printf(NodeIo,"Cannot get memory information!\n"); - } else { - ma = mem[meminfo_main][meminfo_total]; - mu = (mem[meminfo_main][meminfo_total] - mem[meminfo_free][meminfo_total]); - mf = mem[meminfo_free][meminfo_total]; +// axio_printf(NodeIo,"Cannot get memory information!\n"); +// } else + if (load_meminfo()) { + ma = meminfo("memtotal"); + mu = (meminfo("memtotal") - meminfo("memfree")); + mf = meminfo("memfree"); axio_printf(NodeIo,"Memory: Available Used Free perc. Used\n"); axio_printf(NodeIo,"------------------ ---------- ---------- ---------- ----------\n"); axio_printf(NodeIo,"Physical: %-7d kB %-7d kB %-7d kB %3d %%\n", ma, mu, mf, (mu*100)/ma); - if (!(mem = meminfo()) || mem[meminfo_stotal][meminfo_total] != 0) -{ - sa = mem[meminfo_stotal][meminfo_total]; - su = (mem[meminfo_stotal][meminfo_total] - mem[meminfo_sfree][meminfo_total]); - sf = mem[meminfo_sfree][meminfo_total]; - axio_printf(NodeIo,"Swap: %-7d kB %-7d kB %-7d kB %3d %%\n",sa,su,sf,(su*100)/sa); + if (meminfo("swaptotal") != 0) + { + sa = meminfo("swaptotal"); + su = (meminfo("swaptotal") - meminfo("swapfree")); + sf = meminfo("swapfree"); + axio_printf(NodeIo," Swap: %-7d kB %-7d kB %-7d kB %3d %%\n",sa,su,sf,(su*100)/sa); } else - axio_printf(NodeIo,"Cannot get swap information!\n"); + axio_printf(NodeIo,"Cannot get swap information or swap not active!\n"); axio_printf(NodeIo," "); } @@ -958,6 +965,11 @@ int nuser_list(int argc, char **argv) sprintf(buf, "\nTelnet (%.9s @ %.16s)", u.call, u.ul_name); break; + + case AF_INET6: + sprintf(buf, "\nTelnet6 (%.9s @ SystemD)", u.call); + break; + case AF_UNSPEC: sprintf(buf, "\nHost (%.9s on local)", u.call); diff --git a/config.c b/config.c index f222db6..8feb4e4 100644 --- a/config.c +++ b/config.c @@ -150,7 +150,8 @@ char *read_perms(struct user *up, unsigned long peer) if (!strcasecmp(argv[1], "rose")) break; continue; -#endif +#endif + case AF_INET6: case AF_INET: if (!strcmp(argv[1], "*")) break; @@ -191,7 +192,8 @@ static int do_alias(int argc, char **argv) return -1; if ((new = calloc(1, sizeof(struct cmd))) == NULL) { node_perror("do_alias: malloc", errno); - return -2; + // return -2; + return -1; /* ve3tok 31 Mar,2016 - tnx Brian */ } new->name = strdup(argv[1]); while (isupper(new->name[len])) @@ -402,7 +404,7 @@ static int do_roseid(int argc, char **argv) static int do_prompt(int argc, char **argv) { - if ((User.ul_type != AF_NETROM) || (User.ul_type != AF_INET)) { + if ((User.ul_type != AF_NETROM) || (User.ul_type != AF_INET) || (User.ul_type != AF_INET6)) { if (argc < 2) { return -1; Prompt = strdup(argv[1]); diff --git a/configure b/configure index c238a02..2911fa0 100755 --- a/configure +++ b/configure @@ -48,6 +48,25 @@ else echo "and rerun ./configure to continue." exit 1 fi +_sleep 1 +echo -n "you need make to make URONode: " +MAKE=`which make` +_sleep 2 +if [ -e "$MAKE" ] + then + echo -n "saw $MAKE... " + _sleep 1 + echo "MAKE found! Congratulations!!" +else + echo "make not found!" + echo " " + echo "You need this utility to make URONode." + echo "Please install make, and rerun this ./configure script." + echo "If you have a copy of make installed, please insure you have" + echo "it in your path and rerun ./configure to continue." + exit 1 +fi + echo -n "Your machine architecture is: " _sleep 1 ARCH=`uname -m` @@ -290,6 +309,13 @@ echo "" if [ -x ./axdigi ]; then echo "SUCCESS!" fi + _sleep 1 + echo -n "calibrate: " + _sleep 1 + if [ -x ./calibrate ]; then + echo "SUCCESS!" + fi + _sleep 1 echo -n "flexd: " _sleep 1 diff --git a/etc/help/ping.hlp b/etc/help/ping.hlp index 30eb4ac..fdd5020 100644 --- a/etc/help/ping.hlp +++ b/etc/help/ping.hlp @@ -9,7 +9,8 @@ DESCRIPTION between the local and remote hosts is shown. If an optional length is specified the data portion of the - packet is filled with length number of bytes. + packet is filled with length number of bytes up to 128. -EXAMPLE +EXAMPLES ping aripisa.ampr.org + ping n1uro.ampr.org 128 diff --git a/flexd.c b/flexd.c index 663307a..3d677b2 100644 --- a/flexd.c +++ b/flexd.c @@ -31,6 +31,8 @@ int poll_time=DEFAULT_POLL_TIME; char flexgate[10]="\0"; char mycall[10]="\0"; +char prompt1[1]="\0"; +char prompt2[1]="\0"; struct ax_routes *gw; int s; void (*sigterm_defhnd)(int); @@ -64,7 +66,7 @@ void read_conf(void) if(strcasecmp(cp,"pollinterval")==0) { /* set poll interval */ cp=strtok(NULL, " \t\n\r"); if(cp==NULL) { - fprintf(stderr, "flexd config: PollInterval needs an argument\n"); + fprintf(stderr, "flexd config: Poll Interval needs an argument\n"); fclose(fp); fclose(fgt); exit(1); @@ -109,7 +111,7 @@ void read_conf(void) } } } - + fprintf(stderr,"FlexD started.\n\r"); fclose(fgt); fclose(fp); } @@ -117,7 +119,7 @@ void read_conf(void) int download_dest(char *gateway, char *fname) { FILE *tmp; - char buffer[256], port[14], path[AX25_MAX_DIGIS*10]; + char buffer[512], port[14], path[AX25_MAX_DIGIS*10]; /* Increased buffer to 512 from 256 - ve3tok 31 Mar, 2016 */ char *addr, *commands[10], *dlist[9]; /* Destination + 8 digipeaters */ fd_set read_fd; int n, addrlen, cmd_send=0, cmd_ack=0, c, k; @@ -223,7 +225,9 @@ int download_dest(char *gateway, char *fname) break; } if (FD_ISSET(s, &read_fd)) { - int ret, retlen; +// int ret, retlen; + int ret = 0; + int retlen = 0; char *cp; /* See if we got connected or if this was an error */ @@ -231,12 +235,12 @@ int download_dest(char *gateway, char *fname) if (ret != 0) { cp = strdup(strerror(ret)); strlwr(cp); - sprintf(buffer, "flexd connect: Failure with %s: %sr\r\n", gateway, cp); + sprintf(buffer, "flexd connect: Failure with %s\r\nError: %s\r\n", gateway, cp); write(STDOUT_FILENO, buffer, strlen(buffer)); free(cp); close(s); return 1; - } + } break; } } @@ -270,10 +274,12 @@ int download_dest(char *gateway, char *fname) if (FD_ISSET(s, &read_fd)) { if ((n = read(s, buffer, 512)) == -1) break; +// if ((n = read(s, buffer, 256)) == -1) break; for(c=0;c') { - /* fprintf(stderr, "flex interact: ack[%d]\n", cmd_ack); */ +// if (buffer[c]=='%s' && c 2) { len = atoi(argv[2]) + sizeof(struct icmphdr); - if (len > 256) { +// if (len > 256) { + if (len > 136) { if (User.ul_type == AF_NETROM) { axio_printf(NodeIo,"%s} ", NodeId); } - axio_printf(NodeIo,"Maximum size is %d", 256 - sizeof(struct icmphdr)); + axio_printf(NodeIo,"Maximum ping size is %d", 136 - sizeof(struct icmphdr)); if (User.ul_type == AF_NETROM) { node_msg(""); } @@ -1118,10 +1125,10 @@ int do_ping(int argc, char **argv) } if (User.ul_type == AF_INET) { if (check_perms(PERM_ANSI, 0L) != -1) { - axio_printf(NodeIo, "\e[05;38m"); + axio_printf(NodeIo, "\e[05;31m"); } } - axio_printf(NodeIo,"Aborted"); + axio_printf(NodeIo,"Ping aborted."); if (User.ul_type == AF_INET) { if (check_perms(PERM_ANSI, 0L) != -1) { axio_printf(NodeIo, "\e[0;m"); diff --git a/man/calibrate.8 b/man/calibrate.8 new file mode 100644 index 0000000..157a02e --- /dev/null +++ b/man/calibrate.8 @@ -0,0 +1,29 @@ +.TH CALIBRATE 8 "28 April 1998" Linux "Linux Programmer's Manual" +.SH NAME +calibrate \- URONode user information lookup program +.SH SYNOPSIS +.B calibrate +.SH DESCRIPTION +.LP +.B calibrate \-t ## interface +tool by F1OAT ported for compile and use with URONode to calibrate radios. +.SH OPTIONS +.TP 10 +.BI \-t +Time in ms to engage the calibration of an interface (often mislabeled port). +.TP 10 +.BI interface +This is the interface you wish to calibrate. +.SH FILES +.LP +.TP 5 +.B /etc/ax25/axports +List of ax25 interfaces. +.SH "SEE ALSO" +.BR uronode (8) +.SH AUTHOR +Brian Rogers N1URO +.br +Stefano Noferi IZ5AWZ +.br +Tomi Manninen OH2BNS diff --git a/man/flexd.8 b/man/flexd.8 index 0186d6a..b58ef89 100644 --- a/man/flexd.8 +++ b/man/flexd.8 @@ -7,7 +7,10 @@ flexd \- flexnet routing daemon backend for URONode. .LP .B Flexd is a simple flexnet routing daemon back end. The purpose of this daemon is to -import pc/FlexNet destinations into URONode for auto-ax25 routing. +import pc/FlexNet destinations into URONode for auto-ax25 routing. It's +quite normal sometimes for flexd to generate an error upon bootup if it +can't make a connect to the neighbor flex node in flexd.conf. When it +can connect, it will do so automatically. .SH COMMANDS There are no commands for flexd. The runtime parameters are in flexd.conf .SH FILES diff --git a/man/uronode.8 b/man/uronode.8 index a6a7f08..48d2649 100644 --- a/man/uronode.8 +++ b/man/uronode.8 @@ -136,7 +136,7 @@ reply. If a reply is received the round-trip-time (RTT) between the local and remote hosts is shown. .sp If an optional length is specified the data portion of the -packet is filled with length number of bytes. +packet is filled with length number of bytes up to 128. .TP 14 .BI Routes Shows the NET/ROM route table of the local host (eg. the nodes diff --git a/mheard.c b/mheard.c index 9c2ed9a..ee46b7b 100644 --- a/mheard.c +++ b/mheard.c @@ -39,7 +39,7 @@ int do_mheard (int argc,char **argv) { if(ax25_config_get_dev(argv[1]) == NULL || (check_perms(PERM_HIDDEN, 0) == -1 && is_hidden(argv[1]))) { - axio_printf(NodeIo,"Invalid port: %s",argv[1]); + axio_printf(NodeIo,"Invalid interface: %s", argv[1]); if(User.ul_type == AF_NETROM) node_msg(""); diff --git a/node.c b/node.c index be6ff87..53c4e73 100644 --- a/node.c +++ b/node.c @@ -69,10 +69,10 @@ static void alarm_handler(int sig) if ((User.ul_type == AF_AX25) || (User.ul_type == AF_ROSE)) { node_msg("Inactivity timeout! Disconnecting you... "); } - if (User.ul_type == AF_INET) { + if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) { node_msg("Inactivity timeout! Disconnecting you..."); } - if (User.ul_type == AF_INET) { + if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) { if (check_perms(PERM_ANSI, 0L) != -1) { axio_printf(NodeIo,"\e[0;m"); } @@ -219,7 +219,7 @@ int main(int argc, char *argv[]) axio_compr(NodeIo, 1); } #endif - if (User.ul_type == AF_INET) { + if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) { axio_tnmode(NodeIo, 1); axio_tn_do_linemode(NodeIo); } @@ -261,13 +261,13 @@ int main(int argc, char *argv[]) } else if (strcmp(pw, "*") != 0) { axio_printf(NodeIo,"*** Password required! If you don't have a password please email\n%s for a password you wish to use.", Email); axio_printf(NodeIo,"\nPassword: "); - if (User.ul_type == AF_INET) { + if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) { axio_tn_will_echo(NodeIo); axio_eolmode(NodeIo, EOLMODE_BINARY); } axio_flush(NodeIo); p = axio_getline(NodeIo); - if (User.ul_type == AF_INET) { + if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) { axio_tn_wont_echo(NodeIo); axio_eolmode(NodeIo, EOLMODE_TEXT); /* axio_puts("\n",NodeIo); */ @@ -295,7 +295,7 @@ int main(int argc, char *argv[]) if (User.ul_type == AF_NETROM) { /* axio_printf(NodeIo, "%s} Welcome.\n", NodeId); */ } else - if (User.ul_type == AF_INET) { + if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) { if (check_perms(PERM_ANSI, 0L) != -1) { node_msg("\n\e[01;34m[\e[01;37m%s\e[01;34m]\e[0m\nWelcome %s to the %s packet shell.", VERSION, User.call, HostName); } else if (check_perms(PERM_ANSI, 0L) == -1) { @@ -389,7 +389,7 @@ int main(int argc, char *argv[]) node_msg("What?\007"); } else if (User.ul_type == AF_ROSE) { axio_printf(NodeIo,"Que?\007"); - } else if (User.ul_type == AF_INET) { + } else if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) { axio_printf(NodeIo, "Huh?\007"); } else { axio_printf(NodeIo,"Eh?\007"); diff --git a/node.h b/node.h index e2d5375..9fb30cb 100644 --- a/node.h +++ b/node.h @@ -1,5 +1,5 @@ -#define VERSION "URONode v2.4" -#define COMPILING "November 21, 2015" +#define VERSION "URONode v2.5.1" +#define COMPILING "March 31, 2016" #define STATE_IDLE 0 #define STATE_TRYING 1 diff --git a/sysinfo.c b/sysinfo.c index 884eaca..1ac4caa 100644 --- a/sysinfo.c +++ b/sysinfo.c @@ -47,7 +47,7 @@ static STRUCT_UTMP *utmp_contents; #define S_IWGRP 020 #endif -static char buf[300]; +static char buf[800]; /* This macro opens FILE only if necessary and seeks to 0 so that successive calls to the functions are more efficient. It also reads the current @@ -110,36 +110,36 @@ int loadavg(double *av1, double *av5, double *av15) { labels which do not *begin* with digits, though. */ -#define MAX_ROW 22 /* these are a little liberal for flexibility */ +#define MAX_ROW 20 /* these are a little liberal for flexibility */ #define MAX_COL 2 -unsigned** meminfo(void) { - static unsigned *row[MAX_ROW + 1]; /* row pointers */ - static unsigned num[MAX_ROW * MAX_COL]; /* number storage */ - char *p; - int i, j, k, l; +//unsigned** meminfo(void) { +// static unsigned *row[MAX_ROW + 1]; /* row pointers */ +// static unsigned num[MAX_ROW * MAX_COL]; /* number storage */ +// char *p; +// int i, j, k, l; - FILE_TO_BUF(MEMINFO_FILE) - if (!row[0]) /* init ptrs 1st time through */ - for (i=0; i < MAX_ROW; i++) /* std column major order: */ - row[i] = num + MAX_COL*i; /* A[i][j] = A + COLS*i + j */ - p = buf; - for (i=0; i < MAX_ROW; i++) /* zero unassigned fields */ - for (j=0; j < MAX_COL; j++) - row[i][j] = 0; - for (i=0; i < MAX_ROW && *p; i++) { /* loop over rows */ - while(*p && !isdigit(*p)) p++; /* skip chars until a digit */ - for (j=0; j < MAX_COL && *p; j++) { /* scanf column-by-column */ - l = sscanf(p, "%u%n", row[i] + j, &k); - p += k; /* step over used buffer */ - if (*p == '\n' || l < 1) /* end of line/buffer */ - break; - } - } +// FILE_TO_BUF(MEMINFO_FILE) +// if (!row[0]) /* init ptrs 1st time through */ +// for (i=0; i < MAX_ROW; i++) /* std column major order: */ +// row[i] = num + MAX_COL*i; /* A[i][j] = A + COLS*i + j */ +// p = buf; +// for (i=0; i < MAX_ROW; i++) /* zero unassigned fields */ +// for (j=0; j < MAX_COL; j++) +// row[i][j] = 0; +// for (i=0; i < MAX_ROW && *p; i++) { /* loop over rows */ +// while(*p && !isdigit(*p)) p++; /* skip chars until a digit */ +// for (j=0; j < MAX_COL && *p; j++) { /* scanf column-by-column */ +// l = sscanf(p, "%u%n", row[i] + j, &k); +// p += k; /* step over used buffer */ +// if (*p == '\n' || l < 1) /* end of line/buffer */ +// break; +// } +// } /* row[i+1] = NULL; terminate the row list, currently unnecessary */ - return row; /* NULL return ==> error */ -} - +// return row; /* NULL return ==> error */ +//} +// int system_user_count(void) { int users; @@ -241,3 +241,30 @@ char *xmalloc (n) p = fixup_null_alloc (n); return p; } + +int load_meminfo(void) +{ + FILE_TO_BUF(MEMINFO_FILE) + return 1; +} + +int meminfo(const char *s) +{ + char *cp; + int len; + + len = strlen(s); + cp = buf; + while (1) { + if (strncasecmp(cp, s, len) == 0) { + cp += len; + if (*cp == ':') + return atoi(++cp); + } + if ((cp = strchr(cp, '\n')) == NULL) + break; + cp++; + } + return -1; +} + diff --git a/sysinfo.h b/sysinfo.h index 5d2e32f..2a7a947 100644 --- a/sysinfo.h +++ b/sysinfo.h @@ -1,8 +1,12 @@ #ifndef SYSINFO_H #define SYSINFO_H -int loadavg(double *av1, double *av5, double *av15); -int uptime (double *uptime_secs, double *idle_secs); +extern int loadavg(double *av1, double *av5, double *av15); +extern int uptime (double *uptime_secs, double *idle_secs); +extern int load_meminfo(void); +// extern int meminfo(const char *s); +/* + unsigned** meminfo(void); @@ -16,11 +20,12 @@ enum meminfo_row { meminfo_main = 0, meminfo_free, meminfo_buffers, meminfo_nfs_unstab, meminfo_bounce, meminfo_climit, meminfo_cas, meminfo_vmtotal, meminfo_vmused, meminfo_vmchunk + }; enum meminfo_col { meminfo_total = 0 }; unsigned read_total_main(void); - +*/ #endif /* SYSINFO_H */ diff --git a/system.c b/system.c index e7805fb..679d492 100644 --- a/system.c +++ b/system.c @@ -124,7 +124,7 @@ void login_close(void) ut->ut_type=DEAD_PROCESS; memset(ut->ut_host,0,UT_HOSTSIZE); memset(ut->ut_user,0,UT_NAMESIZE); - time(&ut->ut_time); + time((time_t *)&ut->ut_time); /* ut->ut_xtime = (unsigned int)time(NULL); */ pututline(ut); endutent(); @@ -195,7 +195,7 @@ int login_open(struct passwd *pw, char *command) strcpy(utmpbuf.ut_user, pw->pw_name); /* Username */ strcpy(utmpbuf.ut_host, "local:uronode"); utmpbuf.ut_addr=0x7f000000; - time(&utmpbuf.ut_time); /* Time entry was made */ + time((time_t *)&utmpbuf.ut_time); /* Time entry was made */ /* utmpbuf.ut_xtime = (unsigned int)time(NULL); */ setutent(); diff --git a/systemd/README.systemd b/systemd/README.systemd new file mode 100644 index 0000000..6df9ce5 --- /dev/null +++ b/systemd/README.systemd @@ -0,0 +1,14 @@ +To get URONode to answer IP socket requests via SystemD do the following: + +- copy the SystemD files into /lib/systemd/system +- run: systemctl enable uronode +- run: systemctl enable ax25 +- run: chkconfig uronode on +- run: chkconfig ax25 on +- run: systemctl daemon-reload +- in /etc/xinetd.d/uronode (or node) set disable to yes + (or comment out your line in /etc/inetd.conf) +- run: systemctl restart xinetd +- reboot + + diff --git a/systemd/ax25.system b/systemd/ax25.system new file mode 100644 index 0000000..c241c10 --- /dev/null +++ b/systemd/ax25.system @@ -0,0 +1,13 @@ +[Unit] +Description=ax25 service +After=network.target syslog.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/ax25 start +ExecReload=/usr/local/bin/ax25 restart +ExecStop =/usr/local/bin/ax25 stop + +[Install] +WantedBy=multi-user.target + diff --git a/systemd/uronode.service b/systemd/uronode.service new file mode 100644 index 0000000..b380c87 --- /dev/null +++ b/systemd/uronode.service @@ -0,0 +1,17 @@ +[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/systemd/uronode.socket b/systemd/uronode.socket new file mode 100644 index 0000000..8654ab4 --- /dev/null +++ b/systemd/uronode.socket @@ -0,0 +1,9 @@ +[Unit] +Description=URONode Server Activation Socket + +[Socket] +ListenStream=0.0.0.0:3694 +Accept=yes + +[Install] +WantedBy=sockets.target diff --git a/systemd/uronode@.service b/systemd/uronode@.service new file mode 100644 index 0000000..3207cca --- /dev/null +++ b/systemd/uronode@.service @@ -0,0 +1,15 @@ +[Unit] +Description = URONode Server +Requires = uronode.socket +After=syslog.target network.target + +[Service] +Type=oneshot +ExecStart=/usr/local/sbin/uronode +StandardInput=socket +Sockets=uronode.socket + +[Install] +Also = uronode.socket +WantedBy = multi-user.target +WantedBy = network.target diff --git a/util.c b/util.c index a7e8e37..a03e59a 100644 --- a/util.c +++ b/util.c @@ -39,7 +39,7 @@ void node_msg(const char *fmt, ...) if (User.ul_type == AF_NETROM) { axio_printf(NodeIo,"%s} ", NodeId); } - if ((User.ul_type == AF_INET) && (check_perms(PERM_ANSI, 0L) != -1)) { + if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6) && (check_perms(PERM_ANSI, 0L) != -1)) { axio_printf(NodeIo,"\n\e[01;31m%s\e[0m@\e[01;34m%s\e[0m:/uronode$ ",User.call, HostName); } if ((User.ul_type == AF_INET) && (check_perms(PERM_ANSI, 0L) == -1)) { @@ -48,6 +48,12 @@ void node_msg(const char *fmt, ...) if (User.ul_type == AF_AX25) { axio_printf(NodeIo,"%s",Prompt); } + if ((User.ul_type ==AF_INET6) && (check_perms(PERM_ANSI, 0L) == -1)) { + axio_printf(NodeIo, "\nSystemD - %s@%s: ",User.call, Hostname); + } + if ((User.ul_type ==AF_INET6) && (check_perms(PERM_ANSI, 0L) != -1)) { + axio_printf(NodeIo, "\n\e[01;31mSystemD \e[0m- \e[01;34m%s@\e[0m%s: ",User.call, Hostname); + } } */ void node_perror(char *str, int err)