diff -Naur ez-ipupdate-3.0.11b8-patched/example-dnsexit.conf ez-ipupdate-3.0.11b8-dnsexit/example-dnsexit.conf --- ez-ipupdate-3.0.11b8-patched/example-dnsexit.conf 1970-01-01 01:00:00.000000000 +0100 +++ ez-ipupdate-3.0.11b8-dnsexit/example-dnsexit.conf 2005-12-23 01:34:51.000000000 +0000 @@ -0,0 +1,20 @@ +#!/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=eth0 + +# please ensure the user has permission to write this file +cache-file=/tmp/ez-ipupdate.cache + +run-as-user=ez-ipupd +# 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-patched/ez-ipupdate.c ez-ipupdate-3.0.11b8-dnsexit/ez-ipupdate.c --- ez-ipupdate-3.0.11b8-patched/ez-ipupdate.c 2005-12-23 01:33:54.000000000 +0000 +++ ez-ipupdate-3.0.11b8-dnsexit/ez-ipupdate.c 2005-12-23 02:51:19.000000000 +0000 @@ -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 @@ -344,6 +348,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, }, @@ -517,6 +526,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; @@ -4251,6 +4270,195 @@ 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); +} + static int is_in_list(char *needle, char **haystack) { char **p;