Blob Blame History Raw
--- ez-ipupdate.c.old	2005-09-11 05:41:27.000000000 -0400
+++ ez-ipupdate.c	2005-09-11 05:42:44.000000000 -0400
@@ -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
@@ -343,6 +349,12 @@
 int HEIPV6TB_check_info(void);
 static char *HEIPV6TB_fields_used[] = { "server", "user", NULL };
 
+#ifdef USE_MD5
+int DNSEXIT_update_entry(void);
+int DNSEXIT_check_info(void);
+static char *DNSEXIT_fields_used[] = { "server", "user", "address", "wildcard", "mx", "host", NULL };
+#endif
+
 struct service_t services[] = {
   { "NULL",
     { "null", "NULL", 0, },
@@ -516,6 +528,18 @@
     HEIPV6TB_DEFAULT_PORT,
     HEIPV6TB_REQUEST
   },
+#ifdef USE_MD5
+  { "dnsexit",
+  {"dnsexit", 0, 0, },
+  NULL,
+  DNSEXIT_update_entry,
+  DNSEXIT_check_info,
+  DNSEXIT_fields_used,
+  DNSEXIT_DEFAULT_SERVER,
+  DNSEXIT_DEFAULT_PORT,
+  DNSEXIT_REQUEST
+},
+#endif
 };
 
 static struct service_t *service = NULL;
@@ -675,7 +699,7 @@
   fprintf( stdout, "AUTHORS / CONTRIBUTORS\n"
       "  Angus Mackay <amackay@gusnet.cx>\n"
       "  Jeremy Bopp <jbopp@mail.utexas.edu>\n"
-      "  Mark Jeftovic <markjr@easydns.com>\n"
+      "  Mark Jeftovic <markjr@dnsexit.com>\n"
       "  Stefaan Ponnet <webmaster@dyns.cx>\n"
       "  Colin Viebrock <colin@easydns.com>\n"
       "  Tim Brown <timb@machine.org.uk>\n"
@@ -4248,6 +4272,175 @@
   return(UPDATERES_OK);
 }
 
+#ifdef USE_MD5
+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 stays same") != NULL)
+			{
+				if(!(options & OPT_QUIET))
+				{
+					printf("Request successful but the IP is the same as previous update\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);
+}
+#endif
 static int is_in_list(char *needle, char **haystack)
 {
   char **p;
--- example-dnsexit.conf
+++ example-dnsexit.conf
@@ -0,0 +1,19 @@
+#!/usr/local/bin/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=/var/lib/ez-ipupdate/ez-ipupdate.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