diff --git a/0001-Add-ether-wake-binary.patch b/0001-Add-ether-wake-binary.patch new file mode 100644 index 0000000000000000000000000000000000000000..62fdbf8086e992eec4079bde24d53c3cced1509a --- /dev/null +++ b/0001-Add-ether-wake-binary.patch @@ -0,0 +1,584 @@ +From 259d1c453c7dc3b0291f3b4755567a94b778480e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= +Date: Sat, 17 Jun 2017 22:06:03 +0200 +Subject: [PATCH 1/7] Add ether-wake binary + +--- + Makefile | 6 +- + ether-wake.c | 445 +++++++++++++++++++++++++++++++++++++++++++++++++ + man/en_US/ether-wake.8 | 81 +++++++++ + 3 files changed, 531 insertions(+), 1 deletion(-) + create mode 100644 ether-wake.c + create mode 100644 man/en_US/ether-wake.8 + +diff --git a/Makefile b/Makefile +index bf67bc6..cb171a0 100644 +--- a/Makefile ++++ b/Makefile +@@ -33,7 +33,7 @@ SBINDIR ?= /sbin + NET_LIB_PATH = lib + NET_LIB_NAME = net-tools + +-PROGS := ifconfig netstat route nameif ++PROGS := ifconfig netstat route nameif ether-wake + + -include config.make + ifeq ($(HAVE_ARP_TOOLS),1) +@@ -205,6 +205,9 @@ ipmaddr: $(NET_LIB) ipmaddr.o + mii-tool: $(NET_LIB) mii-tool.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ mii-tool.o $(NLIB) $(LDLIBS) + ++ether-wake: $(NET_LIB) ether-wake.o ++ $(CC) $(CFLAGS) $(LDFLAGS) -o ether-wake ether-wake.o $(NLIB) $(LDLIBS) ++ + installbin: + @echo + @echo "######################################################" +@@ -217,6 +220,7 @@ installbin: + install -m 0755 nameif ${BASEDIR}${SBINDIR} + install -m 0755 netstat ${BASEDIR}${BINDIR} + install -m 0755 route ${BASEDIR}${BINDIR} ++ install -m 0755 ether-wake ${BASEDIR}${SBINDIR} + ifeq ($(HAVE_ARP_TOOLS),1) + install -m 0755 arp ${BASEDIR}${SBINDIR} + install -m 0755 rarp ${BASEDIR}${SBINDIR} +diff --git a/ether-wake.c b/ether-wake.c +new file mode 100644 +index 0000000..cfceb44 +--- /dev/null ++++ b/ether-wake.c +@@ -0,0 +1,445 @@ ++/* ether-wake.c: Send a magic packet to wake up sleeping machines. */ ++ ++static char version_msg[] = ++"ether-wake.c: v1.09 11/12/2003 Donald Becker, http://www.scyld.com/"; ++static char brief_usage_msg[] = ++"usage: ether-wake -i [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55\n" ++" Use '-u' to see the complete set of options.\n"; ++static char usage_msg[] = ++"usage: ether-wake -i [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55\n" ++"\n" ++" This program generates and transmits a Wake-On-LAN (WOL)\n" ++" \"Magic Packet\", used for restarting machines that have been\n" ++" soft-powered-down (ACPI D3-warm state).\n" ++" It currently generates the standard AMD Magic Packet format, with\n" ++" an optional password appended.\n" ++"\n" ++" The single required parameter is the Ethernet MAC (station) address\n" ++" of the machine to wake or a host ID with known NSS 'ethers' entry.\n" ++" The MAC address may be found with the 'arp' program while the target\n" ++" machine is awake.\n" ++"\n" ++" Options:\n" ++" -b Send wake-up packet to the broadcast address.\n" ++" -D Increase the debug level.\n" ++" -i ifname Use interface ifname instead of sending a wake packet to all interfaces.\n" ++" -p Append the four or six byte password PW to the packet.\n" ++" A password is only required for a few adapter types.\n" ++" The password may be specified in ethernet hex format\n" ++" or dotted decimal (Internet address)\n" ++" -p 00:22:44:66:88:aa\n" ++" -p 192.168.1.1\n"; ++ ++/* ++ This program generates and transmits a Wake-On-LAN (WOL) "Magic Packet", ++ used for restarting machines that have been soft-powered-down ++ (ACPI D3-warm state). It currently generates the standard AMD Magic Packet ++ format, with an optional password appended. ++ ++ This software may be used and distributed according to the terms ++ of the GNU Public License, incorporated herein by reference. ++ Contact the author for use under other terms. ++ ++ This source file was originally part of the network tricks package, and ++ is now distributed to support the Scyld Beowulf system. ++ Copyright 1999-2003 Donald Becker and Scyld Computing Corporation. ++ ++ The author may be reached as becker@scyld, or C/O ++ Scyld Computing Corporation ++ 914 Bay Ridge Road, Suite 220 ++ Annapolis MD 21403 ++ ++ Notes: ++ On some systems dropping root capability allows the process to be ++ dumped, traced or debugged. ++ If someone traces this program, they get control of a raw socket. ++ Linux handles this safely, but beware when porting this program. ++ ++ An alternative to needing 'root' is using a UDP broadcast socket, however ++ doing so only works with adapters configured for unicast+broadcast Rx ++ filter. That configuration consumes more power. ++*/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#if 0 /* Only exists on some versions. */ ++#include ++#endif ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1 ++#include ++#include ++#else ++#include ++#include ++#include ++#endif ++#include ++#include ++ ++#include "interface.h" ++#include "sockets.h" ++ ++/* Grrr, no consistency between include versions. ++ Enable this if setsockopt() isn't declared with your library. */ ++#if 0 ++extern int setsockopt __P ((int __fd, int __level, int __optname, ++ __ptr_t __optval, int __optlen)); ++#else /* New, correct head files. */ ++#include ++#endif ++ ++u_char outpack[1000]; ++int outpack_sz = 0; ++int debug = 0; ++u_char wol_passwd[6]; ++int wol_passwd_sz = 0; ++ ++static int opt_no_src_addr = 0, opt_broadcast = 0; ++ ++static int get_dest_addr(const char *arg, struct ether_addr *eaddr); ++static int get_fill(unsigned char *pkt, struct ether_addr *eaddr); ++static int get_wol_pw(const char *optarg); ++ ++typedef struct { ++ int s; ++ int verbose; ++ int pktsize; ++} if_info; ++ ++static int send_wol_packet(char *ifname, int s, int verbose, int pktsize); ++ ++static int do_wake(struct interface *ife, void *cookie) { ++ if_info *info = (if_info *)cookie; ++ send_wol_packet(ife->name, info->s, info->verbose, info->pktsize); ++ return 0; ++} ++ ++int main(int argc, char *argv[]) ++{ ++ char *ifname = NULL; ++ int s; /* Raw socket */ ++ int errflag = 0, verbose = 0, do_version = 0; ++ int perm_failure = 0; ++ int c, pktsize; ++ struct ether_addr eaddr; ++ if_info info; ++ ++ while ((c = getopt(argc, argv, "bDi:p:uvV")) != -1) ++ switch (c) { ++ case 'b': opt_broadcast++; break; ++ case 'D': debug++; break; ++ case 'i': ifname = optarg; break; ++ case 'p': get_wol_pw(optarg); break; ++ case 'u': printf("%s",usage_msg); return 0; ++ case 'v': verbose++; break; ++ case 'V': do_version++; break; ++ case '?': ++ errflag++; ++ } ++ if (verbose || do_version) ++ printf("%s\n", version_msg); ++ if (errflag) { ++ fprintf(stderr,"%s", brief_usage_msg); ++ return 3; ++ } ++ ++ if (ifname == NULL) { ++ fprintf(stderr, "Specify -i .\n"); ++ return 3; ++ } ++ ++ if (optind == argc) { ++ fprintf(stderr, "Specify the Ethernet address as 00:11:22:33:44:55.\n"); ++ return 3; ++ } ++ ++ /* Note: PF_INET, SOCK_DGRAM, IPPROTO_UDP would allow SIOCGIFHWADDR to ++ work as non-root, but we need SOCK_PACKET to specify the Ethernet ++ destination address. */ ++#if defined(PF_PACKET) ++ s = socket(PF_PACKET, SOCK_RAW, 0); ++#else ++ s = socket(AF_INET, SOCK_PACKET, SOCK_PACKET); ++#endif ++ if (s < 0) { ++ if (errno == EPERM) ++ fprintf(stderr, "ether-wake: This program must be run as root.\n"); ++ else ++ perror("ether-wake: socket"); ++ perm_failure++; ++ } ++ /* Don't revert if debugging allows a normal user to get the raw socket. */ ++ setuid(getuid()); ++ ++ /* We look up the station address before reporting failure so that ++ errors may be reported even when run as a normal user. ++ */ ++ if (get_dest_addr(argv[optind], &eaddr) != 0) ++ return 3; ++ if (perm_failure && ! debug) ++ return 2; ++ ++ pktsize = get_fill(outpack, &eaddr); ++ ++ if (ifname == NULL) { ++ info.s = s; ++ info.verbose = verbose; ++ info.pktsize = pktsize; ++ ++ /* Create a channel to the NET kernel. */ ++ if ((sockets_open(0)) < 0) { ++ perror("socket"); ++ exit(1); ++ } ++ ++ return for_all_interfaces(do_wake, &info); ++ } ++ ++ return send_wol_packet(ifname, s, verbose, pktsize); ++} ++ ++/* Send a Wake-On-LAN (WOL) "Magic Packet" to Interface IFNAME using ++ Socket S with a packet size PKTSIZE. VERBOSE implies ++ verbosity. */ ++ ++static int send_wol_packet(char *ifname, int s, int verbose, int pktsize) ++{ ++ int i; ++ int one = 1; /* True, for socket options. */ ++#if defined(PF_PACKET) ++ struct sockaddr_ll whereto; ++#else ++ struct sockaddr whereto; /* who to wake up */ ++#endif ++ ++ /* Fill in the source address, if possible. ++ The code to retrieve the local station address is Linux specific. */ ++ if (! opt_no_src_addr) { ++ struct ifreq if_hwaddr; ++ const char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data; ++ ++ strncpy(if_hwaddr.ifr_name, ifname, IFNAMSIZ); ++ if_hwaddr.ifr_name[IFNAMSIZ-1] = '\0'; ++ if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0) { ++ fprintf(stderr, "SIOCGIFHWADDR on %s failed: %s\n", ifname, ++ strerror(errno)); ++ /* Magic packets still work if our source address is bogus, but ++ we fail just to be anal. */ ++ return 1; ++ } ++ memcpy(outpack+6, if_hwaddr.ifr_hwaddr.sa_data, 6); ++ ++ if (verbose) { ++ printf("The hardware address (SIOCGIFHWADDR) of %s is type %d " ++ "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", ifname, ++ if_hwaddr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1], ++ hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]); ++ } ++ } ++ ++ if (wol_passwd_sz > 0) { ++ memcpy(outpack+pktsize, wol_passwd, wol_passwd_sz); ++ pktsize += wol_passwd_sz; ++ } ++ ++ if (verbose > 1) { ++ printf("The final packet is: "); ++ for (i = 0; i < pktsize; i++) ++ printf(" %2.2x", outpack[i]); ++ printf(".\n"); ++ } ++ ++ /* This is necessary for broadcasts to work */ ++ if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)) < 0) ++ perror("setsockopt: SO_BROADCAST"); ++ ++#if defined(PF_PACKET) ++ { ++ struct ifreq ifr; ++ strncpy(ifr.ifr_name, ifname, IFNAMSIZ); ++ ifr.ifr_name[IFNAMSIZ-1] = '\0'; ++ if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) { ++ fprintf(stderr, "SIOCGIFINDEX on %s failed: %s\n", ifname, ++ strerror(errno)); ++ return 1; ++ } ++ memset(&whereto, 0, sizeof(whereto)); ++ whereto.sll_family = AF_PACKET; ++ whereto.sll_ifindex = ifr.ifr_ifindex; ++ /* The manual page incorrectly claims the address must be filled. ++ We do so because the code may change to match the docs. */ ++ whereto.sll_halen = ETH_ALEN; ++ memcpy(whereto.sll_addr, outpack, ETH_ALEN); ++ ++ } ++#else ++ whereto.sa_family = 0; ++ strcpy(whereto.sa_data, ifname); ++#endif ++ ++ char senderrmsg[IFNAMSIZ+16] = "'"; ++ strcat(senderrmsg, ifname); ++ strcat(senderrmsg, "', sendto"); ++ if ((i = sendto(s, outpack, pktsize, 0, (struct sockaddr *)&whereto, ++ sizeof(whereto))) < 0) ++ perror(senderrmsg); ++ else if (debug) ++ printf("'%s', Sendto worked ! %d.\n", ifname, i); ++ ++#ifdef USE_SEND ++ if (bind(s, (struct sockaddr *)&whereto, sizeof(whereto)) < 0) ++ perror("bind"); ++ else if (send(s, outpack, 100, 0) < 0) ++ perror("send"); ++#endif ++#ifdef USE_SENDMSG ++ { ++ struct msghdr msghdr = { 0,}; ++ struct iovec iovector[1]; ++ msghdr.msg_name = &whereto; ++ msghdr.msg_namelen = sizeof(whereto); ++ msghdr.msg_iov = iovector; ++ msghdr.msg_iovlen = 1; ++ iovector[0].iov_base = outpack; ++ iovector[0].iov_len = pktsize; ++ if ((i = sendmsg(s, &msghdr, 0)) < 0) ++ perror("sendmsg"); ++ else if (debug) ++ printf("sendmsg worked, %d (%d).\n", i, errno); ++ } ++#endif ++ ++ return 0; ++} ++ ++/* Convert the host ID string to a MAC address. ++ The string may be a ++ Host name ++ IP address string ++ MAC address string ++*/ ++ ++static int get_dest_addr(const char *hostid, struct ether_addr *eaddr) ++{ ++ struct ether_addr *eap; ++ ++ eap = ether_aton(hostid); ++ if (eap) { ++ *eaddr = *eap; ++ if (debug) ++ fprintf(stderr, "The target station address is %s.\n", ++ ether_ntoa(eaddr)); ++ } else if (ether_hostton(hostid, eaddr) == 0) { ++ if (debug) ++ fprintf(stderr, "Station address for hostname %s is %s.\n", ++ hostid, ether_ntoa(eaddr)); ++ } else { ++ (void)fprintf(stderr, ++ "ether-wake: The Magic Packet host address must be " ++ "specified as\n" ++ " - a station address, 00:11:22:33:44:55, or\n" ++ " - a hostname with a known 'ethers' entry.\n"); ++ return -1; ++ } ++ return 0; ++} ++ ++ ++static int get_fill(unsigned char *pkt, struct ether_addr *eaddr) ++{ ++ int offset, i; ++ unsigned char *station_addr = eaddr->ether_addr_octet; ++ ++ if (opt_broadcast) ++ memset(pkt+0, 0xff, 6); ++ else ++ memcpy(pkt, station_addr, 6); ++ memcpy(pkt+6, station_addr, 6); ++ pkt[12] = 0x08; /* Or 0x0806 for ARP, 0x8035 for RARP */ ++ pkt[13] = 0x42; ++ offset = 14; ++ ++ memset(pkt+offset, 0xff, 6); ++ offset += 6; ++ ++ for (i = 0; i < 16; i++) { ++ memcpy(pkt+offset, station_addr, 6); ++ offset += 6; ++ } ++ if (debug) { ++ fprintf(stderr, "Packet is "); ++ for (i = 0; i < offset; i++) ++ fprintf(stderr, " %2.2x", pkt[i]); ++ fprintf(stderr, ".\n"); ++ } ++ return offset; ++} ++ ++static int get_wol_pw(const char *optarg) ++{ ++ int passwd[6]; ++ int byte_cnt; ++ int i; ++ ++ byte_cnt = sscanf(optarg, "%2x:%2x:%2x:%2x:%2x:%2x", ++ &passwd[0], &passwd[1], &passwd[2], ++ &passwd[3], &passwd[4], &passwd[5]); ++ if (byte_cnt < 4) ++ byte_cnt = sscanf(optarg, "%d.%d.%d.%d", ++ &passwd[0], &passwd[1], &passwd[2], &passwd[3]); ++ if (byte_cnt < 4) { ++ fprintf(stderr, "Unable to read the Wake-On-LAN password.\n"); ++ return 0; ++ } ++ printf(" The Magic packet password is %2.2x %2.2x %2.2x %2.2x (%d).\n", ++ passwd[0], passwd[1], passwd[2], passwd[3], byte_cnt); ++ for (i = 0; i < byte_cnt; i++) ++ wol_passwd[i] = passwd[i]; ++ return wol_passwd_sz = byte_cnt; ++} ++ ++#if 0 ++{ ++ to = (struct sockaddr_in *)&whereto; ++ to->sin_family = AF_INET; ++ if (inet_aton(target, &to->sin_addr)) { ++ hostname = target; ++ } ++ memset (&sa, 0, sizeof sa); ++ sa.sa_family = AF_INET; ++ strncpy (sa.sa_data, interface, sizeof sa.sa_data); ++ sendto (sock, buf, bufix + len, 0, &sa, sizeof sa); ++ strncpy (sa.sa_data, interface, sizeof sa.sa_data); ++#if 1 ++ sendto (sock, buf, bufix + len, 0, &sa, sizeof sa); ++#else ++ bind (sock, &sa, sizeof sa); ++ connect(); ++ send (sock, buf, bufix + len, 0); ++#endif ++} ++#endif ++ ++ ++/* ++ * Local variables: ++ * compile-command: "gcc -O -Wall -o ether-wake ether-wake.c" ++ * c-indent-level: 4 ++ * c-basic-offset: 4 ++ * c-indent-level: 4 ++ * tab-width: 4 ++ * End: ++ */ +diff --git a/man/en_US/ether-wake.8 b/man/en_US/ether-wake.8 +new file mode 100644 +index 0000000..d0569c2 +--- /dev/null ++++ b/man/en_US/ether-wake.8 +@@ -0,0 +1,81 @@ ++.\" Hey, EMACS: -*- nroff -*- ++.\" First parameter, NAME, should be all caps ++.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection ++.\" other parameters are allowed: see man(7), man(1) ++.TH ETHER-WAKE 8 "March 31, 2003" "Scyld" ++.\" Please adjust this date whenever revising the manpage. ++.\" ++.\" Some roff macros, for reference: ++.\" .nh disable hyphenation ++.\" .hy enable hyphenation ++.\" .ad l left justify ++.\" .ad b justify to both left and right margins ++.\" .nf disable filling ++.\" .fi enable filling ++.\" .br insert line break ++.\" .sp insert n+1 empty lines ++.\" for manpage-specific macros, see man(7) ++.SH NAME ++ether-wake \- A tool to send a Wake-On-LAN "Magic Packet" ++.SH SYNOPSIS ++.B ether-wake ++.RI [ options ] " Host-ID" ++.SH DESCRIPTION ++This manual page documents the usage of the ++.B ether-wake ++command. ++.PP ++.\" TeX users may be more comfortable with the \fB\fP and ++.\" \fI\fP escape sequences to invoke bold face and italics, ++.\" respectively. ++\fBether-wake\fP is a program that generates and transmits a Wake-On-LAN ++(WOL) "Magic Packet", used for restarting machines that have been ++soft-powered-down (ACPI D3-warm state). It generates the standard ++AMD Magic Packet format, optionally with a password included. The ++single required parameter is a station (MAC) address or a host ID that can ++be translated to a MAC address by an ++.BR ethers (5) ++database specified in ++.BR nsswitch.conf (5) ++. ++.SH OPTIONS ++\fBether-wake\fP needs a single dash (´-´) in front of options. ++A summary of options is included below. ++.TP ++.B \-b ++Send the wake-up packet to the broadcast address. ++.TP ++.B \-D ++Increase the Debug Level. ++.TP ++.B \-i ifname ++Use interface ifname instead of sending a wake packet to all interfaces. ++.TP ++.B \-p passwd ++Append a four or six byte password to the packet. Only a few adapters ++need or support this. A six byte password may be specified in Ethernet hex ++format (00:22:44:66:88:aa) or four byte dotted decimal (192.168.1.1) format. ++A four byte password must use the dotted decimal format. ++ ++.TP ++.B \-V ++Show the program version information. ++ ++.SH EXIT STATUS ++This program returns 0 on success. ++A permission failures (e.g. run as a non-root user) results in an exit ++status of 2. Unrecognized or invalid parameters result in an exit ++status of 3. Failure to retrieve network interface information or send ++a packet will result in an exit status of 1. ++ ++.SH SEE ALSO ++.BR arp (8). ++.br ++.SH SECURITY ++On some non-Linux systems dropping root capability allows the process to be ++dumped, traced or debugged. ++If someone traces this program, they get control of a raw socket. ++Linux handles this safely, but beware when porting this program. ++.SH AUTHOR ++The ether-wake program was written by Donald Becker at Scyld Computing ++Corporation for use with the Scyld(\*(Tm) Beowulf System. +-- +2.13.1 diff --git a/arp-ethers.service b/arp-ethers.service new file mode 100644 index 0000000000000000000000000000000000000000..76a6474c86cc82349658d2ebafe183759555f8aa --- /dev/null +++ b/arp-ethers.service @@ -0,0 +1,14 @@ +[Unit] +Description=Load static arp entries +Documentation=man:arp(8) man:ethers(5) +ConditionPathExists=/etc/ethers +After=network.service +Before=network.target + +[Service] +Type=oneshot +ExecStart=/sbin/arp -f /etc/ethers +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/net-tools-2.10.tar.xz b/net-tools-2.10.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..663e27899466ea10bf19aaf0aa9fe551ee4bb81d Binary files /dev/null and b/net-tools-2.10.tar.xz differ diff --git a/net-tools-configure.patch b/net-tools-configure.patch new file mode 100644 index 0000000000000000000000000000000000000000..579ad4625a471b8855f964451e1a5c6ad216b8fa --- /dev/null +++ b/net-tools-configure.patch @@ -0,0 +1,44 @@ +Index: net-tools-2.10/config.in +=================================================================== +--- net-tools-2.10.orig/config.in ++++ net-tools-2.10/config.in +@@ -42,7 +42,7 @@ + * course, welcome. Answer `n' here if you have no support for + * internationalization on your system. + * +-bool 'Does your system support GNU gettext?' I18N n ++bool 'Does your system support GNU gettext?' I18N y + * + * + * Protocol Families. +@@ -91,10 +91,10 @@ bool 'InfiniBand hardware support' HAVE_ + * + bool 'IP Masquerading support' HAVE_FW_MASQUERADE y + bool 'Build arp and rarp' HAVE_ARP_TOOLS y +-bool 'Build hostname' HAVE_HOSTNAME_TOOLS y +-bool 'Install hostname NIS/YP symlinks' HAVE_HOSTNAME_SYMLINKS y ++bool 'Build hostname' HAVE_HOSTNAME_TOOLS n ++bool 'Install hostname NIS/YP symlinks' HAVE_HOSTNAME_SYMLINKS n + bool 'Build iptunnel and ipmaddr' HAVE_IP_TOOLS y +-bool 'Build mii-tool' HAVE_MII y ++bool 'Build mii-tool' HAVE_MII n + bool 'Build plipconfig' HAVE_PLIP_TOOLS y + bool 'Build slattach' HAVE_SERIAL_TOOLS y + bool 'SELinux support' HAVE_SELINUX n +Index: net-tools-2.10/configure.sh +=================================================================== +--- net-tools-2.10.orig/configure.sh ++++ net-tools-2.10/configure.sh +@@ -66,9 +66,8 @@ config_fd_redir='<&7' + # + function readln() + { +- echo -n "$1" +- IFS='@' read ans || exit 1 +- [ -z "$ans" ] && ans=$2 ++ echo "$1" ++ ans=$2 + } + + # bool processes a boolean argument + diff --git a/net-tools.spec b/net-tools.spec new file mode 100644 index 0000000000000000000000000000000000000000..7c626d9a97247e11ac12fd509d1d5ee84ca6375f --- /dev/null +++ b/net-tools.spec @@ -0,0 +1,88 @@ +%define anolis_release 1 + +Summary: Basic networking tools +Name: net-tools +Version: 2.10 +Release: %{anolis_release}%{?dist} +License: GPLv2+ +URL: http://sourceforge.net/projects/net-tools/ + +Source0: net-tools-%{version}.tar.xz +Source1: arp-ethers.service + +# sync from suse +Patch0: net-tools-configure.patch +Patch1: 0001-Add-ether-wake-binary.patch + +BuildRequires: make +BuildRequires: bluez-libs-devel +BuildRequires: gettext, libselinux +BuildRequires: libselinux-devel +BuildRequires: systemd +BuildRequires: gcc +%{?systemd_requires} + +%description +The net-tools package contains basic networking tools, +including ifconfig, netstat, route, and others. +Most of them are obsolete. For replacement check iproute package. + +%prep +%autosetup -p1 + +%build +export CFLAGS="%{optflags}" +make %{?_smp_mflags} config +make %{?_smp_mflags} + +%install +mv man/de_DE man/de +mv man/fr_FR man/fr +mv man/pt_BR man/pt + +make BASEDIR=%{buildroot} BINDIR=%{_bindir} SBINDIR=%{_sbindir} install + +mv %{buildroot}%{_bindir}/ifconfig %{buildroot}%{_sbindir} +mv %{buildroot}%{_bindir}/route %{buildroot}%{_sbindir} + +rm %{buildroot}%{_sbindir}/rarp +rm %{buildroot}%{_mandir}/man8/rarp.8* +rm %{buildroot}%{_mandir}/de/man8/rarp.8* +rm %{buildroot}%{_mandir}/fr/man8/rarp.8* +rm %{buildroot}%{_mandir}/pt/man8/rarp.8* + +# otherwise %%find_lang finds them even they're empty +rm -rf %{buildroot}%{_mandir}/de/man1 +rm -rf %{buildroot}%{_mandir}/fr/man1 +rm -rf %{buildroot}%{_mandir}/man1 +rm -rf %{buildroot}%{_mandir}/pt/man1 +rm -rf %{buildroot}%{_mandir}/pt/man5 + +# install systemd unit file +install -D -p -m 644 %{SOURCE1} %{buildroot}%{_unitdir}/arp-ethers.service + +%find_lang %{name} --all-name --with-man + +%post +%systemd_post arp-ethers.service + +%files -f %{name}.lang +%license COPYING +%{_bindir}/netstat +%{_sbindir}/ifconfig +%{_sbindir}/route +%{_sbindir}/arp +%{_sbindir}/ether-wake +%{_sbindir}/ipmaddr +%{_sbindir}/iptunnel +%{_sbindir}/nameif +%{_sbindir}/plipconfig +%{_sbindir}/slattach +%{_mandir}/man[58]/* + +%attr(0644,root,root) %{_unitdir}/arp-ethers.service + +%changelog +* Thu Jan 20 2022 Fedora Release Engineering - 2.10-1 +- init from upstream 2.10 +- add patches to pass build and add ether-wake