diff options
Diffstat (limited to 'net-dns/ez-ipupdate')
-rw-r--r-- | net-dns/ez-ipupdate/Manifest | 2 | ||||
-rw-r--r-- | net-dns/ez-ipupdate/ez-ipupdate-3.0.11.13.3_beta8-r2.ebuild | 128 | ||||
-rw-r--r-- | net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-3322.diff | 65 | ||||
-rw-r--r-- | net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-dnsexit.diff | 262 | ||||
-rw-r--r-- | net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-ipv6.diff | 41 | ||||
-rw-r--r-- | net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-linux.diff | 213 | ||||
-rw-r--r-- | net-dns/ez-ipupdate/files/ez-ipupdate.initd | 94 | ||||
-rw-r--r-- | net-dns/ez-ipupdate/files/ez-ipupdate.service | 12 | ||||
-rw-r--r-- | net-dns/ez-ipupdate/metadata.xml | 12 |
9 files changed, 829 insertions, 0 deletions
diff --git a/net-dns/ez-ipupdate/Manifest b/net-dns/ez-ipupdate/Manifest new file mode 100644 index 000000000000..e84f07a9392c --- /dev/null +++ b/net-dns/ez-ipupdate/Manifest @@ -0,0 +1,2 @@ +DIST ez-ipupdate_3.0.11b8-13.3.diff.gz 154094 SHA256 2c058941f8b172c8564d841d4413b7fa7a5c4dbd53d7d5574c2ff58f41cf39b3 SHA512 bef3c344a3c16f224cc3c6e662213713bb1123b4e47347d83d01d632c5ca0b09e7f0e5a989b3987655759ac901307c8dd6768fab3056c8878c0adcf78b0d5fb9 WHIRLPOOL f213674b871bdf950fe3f1a1131561954c77f0c79a2e4a70752f8a1a88f86e221ad269d92839c30a49544c636ccad77f9e096687a381209cb86367329eafd4ca +DIST ez-ipupdate_3.0.11b8.orig.tar.gz 81975 SHA256 bf5b8d11ffe055c5891d0ab64bbfa86e99cbda645d40f346146b939fec8d962d SHA512 85de91cde25d176374ade7128e8932a4e015cd04beb8d5b71bf540e2f59b6c409d1c8bd0ff7c50734b87ecc19a74a7b1da3e646a8c8787badcae4feb9dba7864 WHIRLPOOL ce279c1d8f1ae404c936b959b9273bce1c37404d7ecf0d7262468bb4b71f6aee75797a2448ea7a0191c9f8a01ffef92107f71727e2c7d445469ec61f0be8f162 diff --git a/net-dns/ez-ipupdate/ez-ipupdate-3.0.11.13.3_beta8-r2.ebuild b/net-dns/ez-ipupdate/ez-ipupdate-3.0.11.13.3_beta8-r2.ebuild new file mode 100644 index 000000000000..a0294124d61a --- /dev/null +++ b/net-dns/ez-ipupdate/ez-ipupdate-3.0.11.13.3_beta8-r2.ebuild @@ -0,0 +1,128 @@ +# Copyright 1999-2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI="5" +inherit eutils readme.gentoo systemd user versionator + +MY_BETA="$(get_version_component_range 6)" +MY_PATCH="$(get_version_component_range 4-5)" +MY_PV="$(get_version_component_range 1-3)${MY_BETA/beta/b}" + +DESCRIPTION="Dynamic DNS client for lots of dynamic dns services" +HOMEPAGE="http://ez-ipupdate.com/" +SRC_URI="mirror://debian/pool/main/e/ez-ipupdate/${PN}_${MY_PV}.orig.tar.gz + mirror://debian/pool/main/e/ez-ipupdate/${PN}_${MY_PV}-${MY_PATCH}.diff.gz" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~ppc ~sparc ~x86" +IUSE="" + +DEPEND="" +RDEPEND="" + +S="${WORKDIR}/${PN}-${MY_PV}" + +DISABLE_AUTOFORMATTING="yes" +DOC_CONTENTS=" +Please create one or more config files in +/etc/ez-ipupdate/. A bunch of samples can +be found in the doc directory. + +All config files must have a '.conf' extension. + +If you are using openRC you need to: +- Please do not use the 'run-as-user', 'run-as-euser', +'cache-file' and 'pidfile' options, since these are +handled internally by the init-script. + +-If you want to use ez-ipupdate in daemon mode, +please add 'daemon' to the config file(s) and +add the ez-ipupdate init-script to the default runlevel. +Without the 'daemon' option, you can run the +init-script with the 'update' parameter inside +your PPP ip-up script. +" + +src_prepare() { + # apply debian patches + epatch "${WORKDIR}/${PN}_${MY_PV}-${MY_PATCH}.diff" + + # repair/apply additional debian patches + sed -i -e "s|^\(---\s*\)\.\./|\1|g" debian/patches/*.diff + EPATCH_SOURCE="${S}/debian/patches" EPATCH_SUFFIX="diff" EPATCH_FORCE="yes" epatch + + # adding members.3322.org support + epatch "${FILESDIR}/${P}-3322.diff" + + # adding www.dnsexit.com support + epatch "${FILESDIR}/${P}-dnsexit.diff" + + # make ez-ipupdate work with iproute2/dhcpcd under linux (bug #318905) + epatch "${FILESDIR}/${P}-linux.diff" + + # allows to set IPv6 via -a option, (bug #432764) + epatch "${FILESDIR}/${P}-ipv6.diff" + + # repair format mask issues + sed -i -e "s|\(\s*\)\(strlen(putbuf)\)|\1(int)\2|g" ez-ipupdate.c || die + + # comment out obsolete options + sed -i -e "s:^\(run-as-user.*\):#\1:g" \ + -e "s:^\(cache-file.*\):#\1:g" ex*conf || die + + # make 'missing' executable (bug #103480) + chmod +x missing +} + +src_configure() { + econf --bindir=/usr/sbin +} + +src_install() { + emake DESTDIR="${D}" install + newinitd "${FILESDIR}/ez-ipupdate.initd" ez-ipupdate + systemd_dounit "${FILESDIR}/${PN}.service" + keepdir /etc/ez-ipupdate + + # install docs + dodoc README + newdoc debian/README.Debian README.debian + newdoc debian/changelog ChangeLog.debian + newdoc CHANGELOG ChangeLog + doman debian/ez-ipupdate.8 + + # install example configs + docinto examples + dodoc ex*conf + + readme.gentoo_create_doc +} + +pkg_preinst() { + enewgroup ez-ipupd + enewuser ez-ipupd -1 -1 /var/cache/ez-ipupdate ez-ipupd +} + +pkg_postinst() { + chmod 750 /etc/ez-ipupdate /var/cache/ez-ipupdate + chown ez-ipupd:ez-ipupd /etc/ez-ipupdate /var/cache/ez-ipupdate + + readme.gentoo_print_elog + + if [ -f /etc/ez-ipupdate.conf ]; then + elog "!!! IMPORTANT UPDATE NOTICE !!!" + elog + elog "The ez-ipupdate init-script can now handle more" + elog "than one config file. New config file location is" + elog "/etc/ez-ipupdate/*.conf" + elog + if [ ! -f /etc/ez-ipupdate/default.conf ]; then + mv -f /etc/ez-ipupdate.conf /etc/ez-ipupdate/default.conf + elog "Your old configuration has been moved to" + elog "/etc/ez-ipupdate/default.conf" + elog + fi + fi +} diff --git a/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-3322.diff b/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-3322.diff new file mode 100644 index 000000000000..d6bf0152a098 --- /dev/null +++ b/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-3322.diff @@ -0,0 +1,65 @@ +diff -Naur ez-ipupdate-3.0.11b8.orig/example-3322.conf ez-ipupdate-3.0.11b8/example-3322.conf +--- ez-ipupdate-3.0.11b8.orig/example-3322.conf 1970-01-01 01:00:00.000000000 +0100 ++++ ez-ipupdate-3.0.11b8/example-3322.conf 2011-01-23 19:30:43.785652588 +0100 +@@ -0,0 +1,19 @@ ++#!/usr/local/bin/ez-ipupdate -c ++# ++# example config file for ez-ipupdate ++# ++# this file is actually executable! ++# ++ ++service-type=qdns ++#service-type=qdns-static ++user=myuserid:mypassword ++host=mydomain.whatever.com ++interface=eth1 ++max-interval=2073600 ++ ++# uncomment this once you have everything working how you want and you are ++# ready to have ez-ipupdate running in the background all the time. to stop it ++# you can use "killall -QUIT ez-ipupdate" under linux. ++#daemon ++ +diff -Naur ez-ipupdate-3.0.11b8.orig/ez-ipupdate.c ez-ipupdate-3.0.11b8/ez-ipupdate.c +--- ez-ipupdate-3.0.11b8.orig/ez-ipupdate.c 2011-01-23 19:29:17.698793394 +0100 ++++ ez-ipupdate-3.0.11b8/ez-ipupdate.c 2011-01-23 19:29:17.799792055 +0100 +@@ -103,6 +103,11 @@ + #define HEIPV6TB_DEFAULT_PORT "80" + #define HEIPV6TB_REQUEST "/index.cgi" + ++#define QDNS_DEFAULT_SERVER "members.3322.org" ++#define QDNS_DEFAULT_PORT "80" ++#define QDNS_REQUEST "/dyndns/update" ++#define QDNS_STAT_REQUEST "/dyndns/update" ++ + #define DEFAULT_TIMEOUT 120 + #define DEFAULT_UPDATE_PERIOD 120 + #define DEFAULT_RESOLV_PERIOD 30 +@@ -514,6 +519,26 @@ + HEIPV6TB_DEFAULT_PORT, + HEIPV6TB_REQUEST + }, ++ { "qdns", ++ { "qdns", 0, 0, }, ++ DYNDNS_init, ++ DYNDNS_update_entry, ++ DYNDNS_check_info, ++ DYNDNS_fields_used, ++ QDNS_DEFAULT_SERVER, ++ QDNS_DEFAULT_PORT, ++ QDNS_REQUEST ++ }, ++ { "qdns-static", ++ { "qdns-static", "qdns-stat", "statdns", }, ++ DYNDNS_init, ++ DYNDNS_update_entry, ++ DYNDNS_check_info, ++ DYNDNS_STAT_fields_used, ++ QDNS_DEFAULT_SERVER, ++ QDNS_DEFAULT_PORT, ++ QDNS_STAT_REQUEST ++ }, + }; + + static struct service_t *service = NULL; diff --git a/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-dnsexit.diff b/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-dnsexit.diff new file mode 100644 index 000000000000..fd80485f0f4f --- /dev/null +++ b/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-dnsexit.diff @@ -0,0 +1,262 @@ +diff -Naur ez-ipupdate-3.0.11b8.orig/example-dnsexit.conf ez-ipupdate-3.0.11b8/example-dnsexit.conf +--- ez-ipupdate-3.0.11b8.orig/example-dnsexit.conf 1970-01-01 01:00:00.000000000 +0100 ++++ ez-ipupdate-3.0.11b8/example-dnsexit.conf 2011-01-23 19:32:53.181937517 +0100 +@@ -0,0 +1,19 @@ ++#!/usr/sbin/ez-ipupdate -c ++# ++# example config file for ez-ipupdate ++# ++# this file is actually executable! ++# ++ ++service-type=dnsexit ++user=loginname:password ++host=www.yourdomain.com ++interface=eth1 ++ ++run-as-user=ez-ipupd ++cache-file=/var/cache/ez-ipupdate/default-cache ++ ++# uncomment this once you have everything working how you want and you are ++# ready to have ez-ipupdate running in the background all the time. to stop it ++# you can use "killall -QUIT ez-ipupdate" under linux. ++#daemon +diff -Naur ez-ipupdate-3.0.11b8.orig/ez-ipupdate.c ez-ipupdate-3.0.11b8/ez-ipupdate.c +--- ez-ipupdate-3.0.11b8.orig/ez-ipupdate.c 2011-01-23 19:32:53.074938936 +0100 ++++ ez-ipupdate-3.0.11b8/ez-ipupdate.c 2011-01-23 19:32:53.182937505 +0100 +@@ -103,6 +103,10 @@ + #define HEIPV6TB_DEFAULT_PORT "80" + #define HEIPV6TB_REQUEST "/index.cgi" + ++#define DNSEXIT_DEFAULT_SERVER "www.dnsexit.com" ++#define DNSEXIT_DEFAULT_PORT "80" ++#define DNSEXIT_REQUEST "/RemoteUpdate.sv" ++ + #define DEFAULT_TIMEOUT 120 + #define DEFAULT_UPDATE_PERIOD 120 + #define DEFAULT_RESOLV_PERIOD 30 +@@ -341,6 +345,11 @@ + int HEIPV6TB_check_info(void); + static char *HEIPV6TB_fields_used[] = { "server", "user", NULL }; + ++int DNSEXIT_update_entry(void); ++int DNSEXIT_check_info(void); ++static char *DNSEXIT_fields_used[] = { "server", "user", "address", "wildcard", "mx", "host", NULL }; ++ ++ + struct service_t services[] = { + { "NULL", + { "null", "NULL", 0, }, +@@ -514,6 +523,16 @@ + HEIPV6TB_DEFAULT_PORT, + HEIPV6TB_REQUEST + }, ++ { "dnsexit", ++ { "dnsexit", 0, 0, }, ++ NULL, ++ DNSEXIT_update_entry, ++ DNSEXIT_check_info, ++ DNSEXIT_fields_used, ++ DNSEXIT_DEFAULT_SERVER, ++ DNSEXIT_DEFAULT_PORT, ++ DNSEXIT_REQUEST ++ }, + }; + + static struct service_t *service = NULL; +@@ -4241,6 +4260,195 @@ + } + return(UPDATERES_ERROR); + break; ++ } ++ ++ return(UPDATERES_OK); ++} ++ ++int DNSEXIT_check_info(void) ++{ ++ char buf[BUFSIZ+1]; ++ ++ if((host == NULL) || (*host == '\0')) ++ { ++ if(options & OPT_DAEMON) ++ { ++ return(-1); ++ } ++ if(host) { free(host); } ++ printf("host: "); ++ *buf = '\0'; ++ fgets(buf, BUFSIZ, stdin); ++ host = strdup(buf); ++ chomp(host); ++ } ++ ++ if(interface == NULL && address == NULL) ++ { ++ if(options & OPT_DAEMON) ++ { ++ fprintf(stderr, "you must provide either an interface or an address\n"); ++ return(-1); ++ } ++ if(interface) { free(interface); } ++ printf("interface: "); ++ *buf = '\0'; ++ fgets(buf, BUFSIZ, stdin); ++ chomp(buf); ++ option_handler(CMD_interface, buf); ++ } ++ ++ warn_fields(service->fields_used); ++ ++ return 0; ++} ++ ++int DNSEXIT_update_entry(void) ++{ ++ char buf[BUFFER_SIZE+1]; ++ char *bp = buf; ++ int bytes; ++ int btot; ++ int ret; ++ ++ buf[BUFFER_SIZE] = '\0'; ++ ++ if(do_connect((int*)&client_sockfd, server, port) != 0) ++ { ++ if(!(options & OPT_QUIET)) ++ { ++ show_message("error connecting to %s:%s\n", server, port); ++ } ++ return(UPDATERES_ERROR); ++ } ++ ++ snprintf(buf, BUFFER_SIZE, "GET %s?action=edit&", request); ++ output(buf); ++ if(address != NULL && *address != '\0') ++ { ++ snprintf(buf, BUFFER_SIZE, "%s=%s&", "myip", address); ++ output(buf); ++ } ++ snprintf(buf, BUFFER_SIZE, "%s=%s&", "wildcard", wildcard ? "ON" : "OFF"); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "%s=%s&", "mx", mx); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "%s=%s&", "backmx", *mx == '\0' ? "NO" : "YES"); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "%s=%s&", "host", host); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "%s=%s&", "login", user_name); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "%s=%s&", "password", password); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, " HTTP/1.0\015\012"); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "Authorization: Basic %s\015\012", auth); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "User-Agent: %s-%s %s [%s] (%s)\015\012", ++ "ez-update", VERSION, OS, (options & OPT_DAEMON) ? "daemon" : "", "by Angus Mackay"); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "Host: %s\015\012", server); ++ output(buf); ++ snprintf(buf, BUFFER_SIZE, "\015\012"); ++ output(buf); ++ ++ bp = buf; ++ bytes = 0; ++ btot = 0; ++ while((bytes=read_input(bp, BUFFER_SIZE-btot)) > 0) ++ { ++ bp += bytes; ++ btot += bytes; ++ dprintf((stderr, "btot: %d\n", btot)); ++ } ++ close(client_sockfd); ++ buf[btot] = '\0'; ++ ++ dprintf((stderr, "server output: %s\n", buf)); ++ ++ if(sscanf(buf, " HTTP/1.%*c %3d", &ret) != 1) ++ { ++ ret = -1; ++ } ++ ++ switch(ret) ++ { ++ case -1: ++ if(!(options & OPT_QUIET)) ++ { ++ show_message("strange server response, are you connecting to the right server?\n"); ++ } ++ return(UPDATERES_ERROR); ++ break; ++ ++ case 200: ++ ++ if(strstr(buf, "0=Success") != NULL) ++ { ++ if(!(options & OPT_QUIET)) ++ { ++ printf("Request successful\n"); ++ } ++ } ++ else if(strstr(buf, "1=IP is the same as the IP on the system") != NULL) ++ { ++ if(!(options & OPT_QUIET)) ++ { ++ printf("Request successful but the IP is the same as previous update\n"); ++ } ++ } ++ else if(strstr(buf, "2=Invalid passwords") != NULL) ++ { ++ if(!(options & OPT_QUIET)) ++ { ++ printf("Invalid Password\n"); ++ } ++ } ++ else if(strstr(buf, "3=User not found") != NULL) ++ { ++ if(!(options & OPT_QUIET)) ++ { ++ printf("Username not found\n"); ++ } ++ } ++ else if(strstr(buf, "4=Update too often") != NULL) ++ { ++ if(!(options & OPT_QUIET)) ++ { ++ printf("Updatting too often\n"); ++ } ++ } ++ else ++ { ++ show_message("Errors return from server\n"); ++ if(!(options & OPT_QUIET)) ++ { ++ fprintf(stderr, "server output: %s\n", buf); ++ } ++ return(UPDATERES_ERROR); ++ } ++ break; ++ ++ case 401: ++ if(!(options & OPT_QUIET)) ++ { ++ show_message("authentication failure\n"); ++ } ++ return(UPDATERES_SHUTDOWN); ++ break; ++ ++ default: ++ if(!(options & OPT_QUIET)) ++ { ++ // reuse the auth buffer ++ *auth = '\0'; ++ sscanf(buf, " HTTP/1.%*c %*3d %255[^\r\n]", auth); ++ show_message("unknown return code: %d\n", ret); ++ show_message("server response: %s\n", auth); ++ } ++ return(UPDATERES_ERROR); ++ break; + } + + return(UPDATERES_OK); diff --git a/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-ipv6.diff b/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-ipv6.diff new file mode 100644 index 000000000000..ec41647e066f --- /dev/null +++ b/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-ipv6.diff @@ -0,0 +1,41 @@ +diff --git a/ez-ipupdate.c b/ez-ipupdate.c +index ff093a9..eea7624 100644 +--- a/ez-ipupdate.c ++++ b/ez-ipupdate.c +@@ -849,6 +849,27 @@ int is_dotted_quad(char *addr) + return(1); + } + ++int is_ip_addr(char *addr) ++{ ++#if HAVE_ARPA_INET_H ++ char dst[16]; ++ ++ if(inet_pton(AF_INET,addr,dst) == 1) ++ { ++ return(1); ++ } ++ ++ if(inet_pton(AF_INET6,addr,dst) == 1) ++ { ++ return(1); ++ } ++ ++ return(0); ++#else ++ return is_dotted_quad(addr); ++#endif ++} ++ + void parse_service(char *str) + { + int i; +@@ -1859,7 +1880,7 @@ int DYNDNS_check_info(void) + chomp(host); + } + +- if(address != NULL && !is_dotted_quad(address)) ++ if(address != NULL && !is_ip_addr(address)) + { + fprintf(stderr, "the IP address \"%s\" is invalid\n", address); + return(-1); diff --git a/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-linux.diff b/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-linux.diff new file mode 100644 index 000000000000..8a282bb58c34 --- /dev/null +++ b/net-dns/ez-ipupdate/files/ez-ipupdate-3.0.11.13.3_beta8-linux.diff @@ -0,0 +1,213 @@ +diff -Naur ez-ipupdate-3.0.11b8.orig/ez-ipupdate.c ez-ipupdate-3.0.11b8/ez-ipupdate.c +--- ez-ipupdate-3.0.11b8.orig/ez-ipupdate.c 2011-01-23 19:35:10.885111914 +0100 ++++ ez-ipupdate-3.0.11b8/ez-ipupdate.c 2011-01-23 19:35:10.979110667 +0100 +@@ -172,6 +172,17 @@ + # ifdef HAVE_SYS_SOCKIO_H + # include <sys/sockio.h> + # endif ++# ifdef __linux__ ++/*# include <linux/if.h> */ ++# include <linux/netlink.h> ++# include <linux/rtnetlink.h> ++/* Under Linux, we reopen socket in get_if_addr() every time */ ++# define socketopen(sock) ++# define socketclose(sock) ++# else ++# define socketopen(sock) sock = socket(AF_INET, SOCK_STREAM, 0) ++# define socketclose(sock) close(sock) ++# endif + #endif + + #include <dprintf.h> +@@ -1605,6 +1616,114 @@ + int get_if_addr(int sock, char *name, struct sockaddr_in *sin) + { + #ifdef IF_LOOKUP ++#ifdef __linux__ ++ struct { ++ struct nlmsghdr nlmsg_info; ++ struct ifaddrmsg ifaddrmsg_info; ++ char buffer[2048]; ++ } req; ++ struct nlmsghdr *curr; ++ int len; ++ char buf[8192]; ++ ++ /* open a socket and bind it. ++ Under non-linux, the socket can be kept open, but it seems under ++ linux we cannot use the same socket for several requests reliable ++ [although sometimes it works...] */ ++ static struct sockaddr_nl local; ++ sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); ++ if(sock < 0) { ++ perror("socket"); ++ return -1; ++ } ++ local.nl_family = AF_NETLINK; ++ local.nl_pad = 0; ++ local.nl_pid = getpid(); ++ local.nl_groups = 0; ++ if(bind(sock, (struct sockaddr*) &local, sizeof(local)) < 0) { ++ perror("bind"); ++ close(sock); ++ return -1; ++ } ++ ++ memset(&req, 0, sizeof(req)); ++ req.nlmsg_info.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); ++ req.nlmsg_info.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; ++ req.nlmsg_info.nlmsg_type = RTM_GETADDR; ++ req.nlmsg_info.nlmsg_pid = getpid(); ++ req.ifaddrmsg_info.ifa_family = AF_INET; ++ if(send(sock, &req, req.nlmsg_info.nlmsg_len, 0) < 0) { ++ perror("sendmsg(sock)"); ++ close(sock); ++ return -1; ++ } ++ ++ len = recv(sock, buf, sizeof(buf), 0); ++ close(sock); ++ if(len < 0) { ++ perror("recv"); ++ return -1; ++ } else if(len == 0) { ++ dprintf((stderr, "No interfaces found")); ++ return -1; ++ } ++ ++ /* Initialize sin except for address */ ++ bzero(sin, sizeof(struct sockaddr_in)); ++ sin->sin_family = AF_INET; ++ ++ /* We take the last non-private IP with matching name */ ++ int found = 0; ++ curr = (struct nlmsghdr *) buf; ++ for(; NLMSG_OK(curr, len); curr = NLMSG_NEXT(curr, len)) { ++ struct ifaddrmsg *curraddr = (struct ifaddrmsg *) NLMSG_DATA(curr); ++ struct rtattr *datalist = (struct rtattr *) IFA_RTA(curraddr); ++ int datalen = IFA_PAYLOAD(curr); ++ int mystat = 0; ++ struct in_addr sin_addr; ++ in_addr_t addr; ++ for(; RTA_OK(datalist, datalen); datalist = RTA_NEXT(datalist, datalen)) { ++ switch(datalist->rta_type) { ++ case IFA_LABEL: ++ if(strcmp((char *)RTA_DATA(datalist), name) != 0) ++ mystat = -1; ++ break; ++ case IFA_LOCAL: ++ addr = ((struct in_addr *)RTA_DATA(datalist))->s_addr; ++ /* addr: 192.168.0.0/16 || 172.16.0.0/12 || 10.0.0.0/8 */ ++ if(((addr & 0xFFFF) == 0xA8C0) ++ || ((addr & 0xF0FF) == 0x10AC) ++ || ((addr & 0xFF) == 0x0A)) { ++ mystat = -1; ++ } ++ else { ++ /* We must not store yet sin->sin_addr, since name might not match */ ++ sin_addr = *((struct in_addr *)RTA_DATA(datalist)); ++ mystat = 1; ++ } ++ break; ++ default: ++ break; ++ } ++ if(mystat < 0) ++ break; ++ } ++ if(mystat > 0) { ++ sin->sin_addr = sin_addr; ++ found = 1; ++ /* If you want to take the first non-private IP with matching name ++ uncomment the next break command: ++ break; */ ++ } ++ } ++ if(found) { ++ dprintf((stderr, "%s: %s\n", name, inet_ntoa(sin->sin_addr))); ++ return 0; ++ } ++ dprintf((stderr, "%s: %s\n", name, "has no non-private address")); ++ return -1; ++#else ++/* ifndef __linux__ */ + struct ifreq ifr; + + memset(&ifr, 0, sizeof(ifr)); +@@ -1638,7 +1757,10 @@ + return -1; + } + return -1; ++#endif ++/* endif __linux__ */ + #else ++/* ifndef IF_LOOKUP */ + return -1; + #endif + } +@@ -4490,7 +4612,7 @@ + #ifdef IF_LOOKUP + if(options & OPT_DAEMON) + { +- sock = socket(AF_INET, SOCK_STREAM, 0); ++ socketopen(sock); + } + #endif + +@@ -4745,12 +4867,12 @@ + struct sockaddr_in sin; + int sock; + +- sock = socket(AF_INET, SOCK_STREAM, 0); ++ socketopen(sock); + if(get_if_addr(sock, interface, &sin) != 0) + { + exit(1); + } +- close(sock); ++ socketclose(sock); + snprintf(ipbuf, sizeof(ipbuf), "%s", inet_ntoa(sin.sin_addr)); + #else + fprintf(stderr, "interface lookup not enabled at compile time\n"); +@@ -4791,7 +4913,7 @@ + struct sockaddr_in sin; + int sock; + +- sock = socket(AF_INET, SOCK_STREAM, 0); ++ socketopen(sock); + if(get_if_addr(sock, interface, &sin) == 0) + { + if(address) { free(address); } +@@ -4802,7 +4924,7 @@ + show_message("could not resolve ip address for %s.\n", interface); + exit(1); + } +- close(sock); ++ socketclose(sock); + } + + for(i=0; i<ntrys; i++) +@@ -4846,12 +4968,12 @@ + struct sockaddr_in sin; + int sock; + +- sock = socket(AF_INET, SOCK_STREAM, 0); ++ socketopen(sock); + if(get_if_addr(sock, interface, &sin) != 0) + { + exit(1); + } +- close(sock); ++ socketclose(sock); + snprintf(ipbuf, sizeof(ipbuf), "%s", inet_ntoa(sin.sin_addr)); + #else + fprintf(stderr, "interface lookup not enabled at compile time\n"); +@@ -4878,7 +5000,7 @@ + } + + #ifdef IF_LOOKUP +- if(sock > 0) { close(sock); } ++ if(sock > 0) { socketclose(sock); } + #endif + + if(address) { free(address); } diff --git a/net-dns/ez-ipupdate/files/ez-ipupdate.initd b/net-dns/ez-ipupdate/files/ez-ipupdate.initd new file mode 100644 index 000000000000..4bba7230fdb3 --- /dev/null +++ b/net-dns/ez-ipupdate/files/ez-ipupdate.initd @@ -0,0 +1,94 @@ +#!/sbin/runscript +# Copyright 1999-2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +extra_commands="update" + +depend() { + need net + after rp-pppoe +} + +getconfig() { # 0: no daemon / 1: daemon + local CONF NAME LIST="" + for CONF in /etc/ez-ipupdate/*.conf; do + if [ -f "${CONF}" ]; then + # Don't run configurations that are (not) daemons + grep -q '^[[:space:]]*daemon' "${CONF}"; [ $? -eq $1 ] && continue + # Don't run configurations that run in the foreground + grep -q '^[[:space:]]*foreground' "${CONF}" && continue + # add config to list + NAME="${CONF##*/}" + LIST="${LIST} ${NAME%.*}" + fi + done + echo ${LIST} +} + +start() { + local NAME LIST=$(getconfig 1) + + if [ -z "${LIST}" ]; then + eerror "You need at least one config file in /etc/ez-ipupdate" + eerror "containing the 'daemon' keyword and no 'foreground' keyword." + return 1 + fi + + for dir in /var/run/ez-ipupdate /var/cache/ez-ipupdate; do + checkpath -q -d -m 0750 -o ez-ipupd:ez-ipupd ${dir} + done + + for NAME in ${LIST}; do + local CONFIG="/etc/ez-ipupdate/${NAME}.conf" + local PIDFILE="/var/run/ez-ipupdate/${NAME}.pid" + local CACHEFILE="/var/cache/ez-ipupdate/${NAME}.cache" + ebegin "Starting ez-ipupdate (${NAME})" + start-stop-daemon -p "${PIDFILE}" --start --quiet --exec /usr/sbin/ez-ipupdate \ + --user ez-ipupd:ez-ipupd -- -c "${CONFIG}" -F "${PIDFILE}" -b "${CACHEFILE}" + eend $? + done + return 0 # do not fail +} + +stop() { + local PIDFILE NAME + for PIDFILE in /var/run/ez-ipupdate/*.pid; do + if [ -f "${PIDFILE}" ]; then + NAME="${PIDFILE##*/}" + ebegin "Stopping ez-ipupdate (${NAME%.*})" + start-stop-daemon --stop --signal QUIT --quiet --pidfile "${PIDFILE}" + eend $? || rm -f "${PIDFILE}" + else + eerror "No running ez-ipupdate process" + fi + done + return 0 # do not fail +} + +update() { + local NAME TEXT LIST=$(getconfig 0) + + if [ -z "${LIST}" ]; then + eerror "You need at least one config file in /etc/ez-ipupdate" + eerror "containing no 'daemon' and 'foreground' keyword." + return 1 + fi + + for NAME in ${LIST}; do + local CONFIG="/etc/ez-ipupdate/${NAME}.conf" + local CACHEFILE="/var/cache/ez-ipupdate/${NAME}.cache" + ebegin "Running ez-ipupdate (${NAME})" + TEXT=$(/usr/sbin/ez-ipupdate -q -R ez-ipupd -c "${CONFIG}" -b "${CACHEFILE}" 2>&1) + if eend $?; then + if [ -n "${TEXT}" ]; then + echo "${TEXT}" | while read line; do einfo " $line"; done + fi + else + if [ -n "${TEXT}" ]; then + echo "${TEXT}" | while read line; do eerror " $line"; done + fi + fi + done + return 0 # do not fail +} diff --git a/net-dns/ez-ipupdate/files/ez-ipupdate.service b/net-dns/ez-ipupdate/files/ez-ipupdate.service new file mode 100644 index 000000000000..2f3d79b13dcd --- /dev/null +++ b/net-dns/ez-ipupdate/files/ez-ipupdate.service @@ -0,0 +1,12 @@ +[Unit] +Description=ez-ipupdate: Check and update your IP to dynamic DNS Server +Requires=network-online.target +After=network-online.target + +[Service] +ExecStart=/usr/sbin/ez-ipupdate -f -R ez-ipupd -c /etc/ez-ipupdate/defaults.conf -b /var/cache/ez-ipupdate/defaults.cache +ExecReload=/bin/kill -HUP $MAINPID +KillSignal=SIGQUIT + +[Install] +WantedBy=multi-user.target diff --git a/net-dns/ez-ipupdate/metadata.xml b/net-dns/ez-ipupdate/metadata.xml new file mode 100644 index 000000000000..b63524a497aa --- /dev/null +++ b/net-dns/ez-ipupdate/metadata.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <maintainer> + <email>maintainer-needed@gentoo.org</email> + </maintainer> + <longdescription lang="en"> + Ez-ipupdate is a client for the dynamic IP service offered by + http://www.ez-ip.net. It has several options and is quite complete. + It is written in pure C and supports a daemon mode. + </longdescription> +</pkgmetadata> |