Add dnsexit support from #1798
authorFlorian Fainelli <florian@openwrt.org>
Sat, 2 Jun 2007 18:28:14 +0000 (18:28 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Sat, 2 Jun 2007 18:28:14 +0000 (18:28 +0000)
SVN-Revision: 7459

net/ez-ipupdate/patches/003-dnsexit.patch [new file with mode: 0644]

diff --git a/net/ez-ipupdate/patches/003-dnsexit.patch b/net/ez-ipupdate/patches/003-dnsexit.patch
new file mode 100644 (file)
index 0000000..0818081
--- /dev/null
@@ -0,0 +1,263 @@
+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;