mirror of
https://github.com/nikdoof/dhsd.git
synced 2026-01-30 09:58:16 +00:00
v0.0.1
This commit is contained in:
59
base64.c
Normal file
59
base64.c
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
|
||||||
|
// Shamelessly snarfed from Peter Mac Millan =/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static const unsigned char BaseTable[] =
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
"0123456789+/";
|
||||||
|
|
||||||
|
|
||||||
|
void benc( unsigned char *dst, unsigned char *s )
|
||||||
|
{
|
||||||
|
int n = strlen( s );
|
||||||
|
int n3byt = n / 3;
|
||||||
|
int k = n3byt * 3;
|
||||||
|
int nrest = n % 3;
|
||||||
|
int i = 0;
|
||||||
|
int dstlen = 0;
|
||||||
|
|
||||||
|
while ( i < k )
|
||||||
|
{
|
||||||
|
dst[dstlen++] = BaseTable[(( s[i] & 0xFC) >> 2)];
|
||||||
|
dst[dstlen++] = BaseTable[(((s[i] & 0x03) << 4) | ((s[i+1] & 0xF0) >> 4))];
|
||||||
|
dst[dstlen++] = BaseTable[(((s[i+1] & 0x0F) << 2) | ((s[i+2] & 0xC0) >> 6))];
|
||||||
|
dst[dstlen++] = BaseTable[( s[i+2] & 0x3F)];
|
||||||
|
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nrest==2)
|
||||||
|
{
|
||||||
|
dst[dstlen++] = BaseTable[(( s[k] & 0xFC) >> 2)];
|
||||||
|
dst[dstlen++] = BaseTable[(((s[k] & 0x03) << 4) | ((s[k+1] & 0xF0) >> 4))];
|
||||||
|
dst[dstlen++] = BaseTable[(( s[k+1] & 0x0F) << 2)];
|
||||||
|
}
|
||||||
|
else if (nrest==1)
|
||||||
|
{
|
||||||
|
dst[dstlen++] = BaseTable[((s[k] & 0xFC) >> 2)];
|
||||||
|
dst[dstlen++] = BaseTable[((s[k] & 0x03) << 4)];
|
||||||
|
}
|
||||||
|
|
||||||
|
while (dstlen%3)
|
||||||
|
dst[dstlen++] = '=';
|
||||||
|
|
||||||
|
dst[dstlen] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
void encbasic( char *d, const char *u, const char *p )
|
||||||
|
{
|
||||||
|
char _buf[4*1024];
|
||||||
|
|
||||||
|
strcpy( _buf, u );
|
||||||
|
strcat( _buf, ":" );
|
||||||
|
strcat( _buf, p );
|
||||||
|
benc( d, _buf );
|
||||||
|
}
|
||||||
|
|
||||||
20
compile
Executable file
20
compile
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# main init
|
||||||
|
gcc -c -ggdb -Wall -o main.o main.c
|
||||||
|
|
||||||
|
# library routines
|
||||||
|
gcc -c -ggdb -Wall -o pdetach.o pdetach.c
|
||||||
|
gcc -c -ggdb -Wall -o dprintf.o dprintf.c
|
||||||
|
gcc -c -ggdb -Wall -o base64.o base64.c
|
||||||
|
|
||||||
|
# program functions
|
||||||
|
gcc -c -ggdb -Wall -o devcheck.o devcheck.c
|
||||||
|
gcc -c -ggdb -Wall -o updateip.o updateip.c
|
||||||
|
gcc -c -ggdb -Wall -o debug.o debug.c
|
||||||
|
|
||||||
|
# consolodation
|
||||||
|
gcc -ggdb -Wall -o dhsd main.o debug.o pdetach.o dprintf.o base64.o devcheck.o updateip.o
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
rm *.o
|
||||||
20
config.h
Normal file
20
config.h
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef __CONFIG_H__
|
||||||
|
#define __CONFIG_H__
|
||||||
|
|
||||||
|
// Config variables
|
||||||
|
|
||||||
|
#define USR_LOGIN "nikdoof"
|
||||||
|
#define USR_PASSWD "poobeast"
|
||||||
|
#define USR_HOST "doofy"
|
||||||
|
#define USR_DOM "2y.net"
|
||||||
|
#define USR_DEV "ppp0"
|
||||||
|
|
||||||
|
#define SLEEP_TIME 10
|
||||||
|
|
||||||
|
// use syslog y/n?
|
||||||
|
#define USE_SYSLOG
|
||||||
|
|
||||||
|
// use debug (no backgrounding and msgs) y/n?
|
||||||
|
#undef DEBUG
|
||||||
|
|
||||||
|
#endif
|
||||||
24
debug.c
Normal file
24
debug.c
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
// SegFault & Debug handler - By Nik_Doof
|
||||||
|
|
||||||
|
#include "dhsd.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
void han_segv()
|
||||||
|
{
|
||||||
|
#ifdef USE_SYSLOG
|
||||||
|
closelog();
|
||||||
|
#endif
|
||||||
|
close(sockfd);
|
||||||
|
pdebug("SegFault in DHSD...exiting safely...");
|
||||||
|
//return 1;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pdebug(char *dmsg)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("DhsD Debug: %s\n",dmsg);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
57
devcheck.c
Normal file
57
devcheck.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "dhsd.h"
|
||||||
|
|
||||||
|
|
||||||
|
int devcheck(char *dev)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
struct sockaddr *sa;
|
||||||
|
struct sockaddr_in *sin;
|
||||||
|
struct ifreq ifr;
|
||||||
|
|
||||||
|
char *toldaddr;
|
||||||
|
|
||||||
|
toldaddr = oldaddr;
|
||||||
|
|
||||||
|
fd = socket(PF_INET,SOCK_STREAM,0);
|
||||||
|
if (fd == -1) {
|
||||||
|
pdebug("socket() failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the interface name into the buffer */
|
||||||
|
strncpy(ifr.ifr_name,dev,IFNAMSIZ);
|
||||||
|
|
||||||
|
if (ioctl(fd,SIOCGIFADDR,&ifr) == -1) {
|
||||||
|
pdebug("device ioctl failed");
|
||||||
|
oldaddr = '\0'; // Hackaratus?
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* Now the buffer will contain the information we requested */
|
||||||
|
sa = (struct sockaddr *)&(ifr.ifr_addr);
|
||||||
|
if (sa->sa_family == AF_INET) {
|
||||||
|
sin = (struct sockaddr_in*) sa;
|
||||||
|
pdebug(toldaddr);
|
||||||
|
if (inet_ntoa(sin->sin_addr) != toldaddr) {
|
||||||
|
oldaddr = inet_ntoa(sin->sin_addr);
|
||||||
|
close(fd);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
pdebug(inet_ntoa(sin->sin_addr));
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf(": Unknown Address Family (%d)\n",sa->sa_family);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
39
dhsd.h
Normal file
39
dhsd.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
#ifndef __DHSD_H__
|
||||||
|
#define __DHSD_H__
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define DHSD_VERSION "v0.01 Beta"
|
||||||
|
#define DHSD_INT_VERSION 0001
|
||||||
|
|
||||||
|
#define DHS_IP "209.249.50.99"
|
||||||
|
#define DHS_PORT 80
|
||||||
|
#define DHS_ADDR "/nic/hosts?"
|
||||||
|
|
||||||
|
#ifdef USE_SYSLOG
|
||||||
|
#include <syslog.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// pdetach.c - by dyfet@sourceforge.net
|
||||||
|
void pdetach(void);
|
||||||
|
|
||||||
|
// dprintf.c - by dfx@sourceforge.net
|
||||||
|
void dprintf(int fd, char *format, ...);
|
||||||
|
|
||||||
|
// devcheck.c
|
||||||
|
char *oldaddr;
|
||||||
|
int devcheck(char *dev);
|
||||||
|
|
||||||
|
// updateip.c
|
||||||
|
int sockfd;
|
||||||
|
int updateip(char *ipaddr, char *dhsdom, char *dhshost);
|
||||||
|
|
||||||
|
// debug.c
|
||||||
|
void han_segv();
|
||||||
|
void pdebug(char *dmsg);
|
||||||
|
|
||||||
|
// base64.c
|
||||||
|
void encbasic( char *d, const char *u, const char *p );
|
||||||
|
|
||||||
|
#endif
|
||||||
1
docs/INSTALL
Normal file
1
docs/INSTALL
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Edit `config.h' to set your options then run `compile' script then run dhsd...
|
||||||
25
docs/README
Normal file
25
docs/README
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
DHSD v0.01 Beta
|
||||||
|
---------------
|
||||||
|
|
||||||
|
DHSD is a dynamic update engine for the dhs.org dynamic dns service.
|
||||||
|
The aim is to provide a quick and efficent update engine that will
|
||||||
|
monitor selected network devices and check for changes of the IP address.
|
||||||
|
|
||||||
|
Project Development Staff:
|
||||||
|
|
||||||
|
Programmers:
|
||||||
|
* Nik_Doof (nik_doof@h3o.org)
|
||||||
|
|
||||||
|
Documentors:
|
||||||
|
* Qwaz (qwaszx@h3o.org)
|
||||||
|
|
||||||
|
PLEASE NOTE, this is a CVS Alpha release (in other words...not working)
|
||||||
|
i have put this code onto the CVS for users to take a look at and see
|
||||||
|
how it works.
|
||||||
|
|
||||||
|
Thanks go to:
|
||||||
|
|
||||||
|
* Sourceforge for hosting my project
|
||||||
|
* Dyfet for his pdetach() code
|
||||||
|
* DFX for his dprintf() code
|
||||||
|
|
||||||
17
dprintf.c
Normal file
17
dprintf.c
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define BUFLEN 4096
|
||||||
|
|
||||||
|
void dprintf(int fd, char *format, ...)
|
||||||
|
{
|
||||||
|
va_list arglist;
|
||||||
|
char buffer[BUFLEN];
|
||||||
|
|
||||||
|
va_start(arglist, format);
|
||||||
|
vsnprintf(buffer, BUFLEN, format, arglist);
|
||||||
|
va_end(arglist);
|
||||||
|
|
||||||
|
write(fd, buffer, strlen(buffer));
|
||||||
|
}
|
||||||
64
main.c
Normal file
64
main.c
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "dhsd.h"
|
||||||
|
|
||||||
|
void cleanup()
|
||||||
|
{
|
||||||
|
#ifdef USE_SYSLOG
|
||||||
|
closelog();
|
||||||
|
#endif
|
||||||
|
close(sockfd);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int doext;
|
||||||
|
char verstring[255];
|
||||||
|
int res;
|
||||||
|
|
||||||
|
printf("DhsD %s\n\n",DHSD_VERSION);
|
||||||
|
printf("Detaching to daemon...\n");
|
||||||
|
#ifndef DEBUG
|
||||||
|
pdetach();
|
||||||
|
#endif
|
||||||
|
signal(SIGINT,cleanup);
|
||||||
|
signal(SIGKILL,cleanup);
|
||||||
|
signal(SIGSEGV,han_segv);
|
||||||
|
|
||||||
|
#ifdef USE_SYSLOG
|
||||||
|
verstring[0] = '\0';
|
||||||
|
openlog("dhsd",LOG_PID,LOG_DAEMON);
|
||||||
|
strncat(verstring, "DhsD ",5);
|
||||||
|
strncat(verstring, DHSD_VERSION,strlen(DHSD_VERSION));
|
||||||
|
strncat(verstring, " loaded...\0",10);
|
||||||
|
syslog(LOG_NOTICE,verstring);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
do {
|
||||||
|
pdebug("loop...");
|
||||||
|
if (devcheck(USR_DEV) == 1) {
|
||||||
|
#ifdef USE_SYSLOG
|
||||||
|
syslog(LOG_NOTICE,"device ip has changed, update initiated...");
|
||||||
|
#endif
|
||||||
|
do {
|
||||||
|
res = updateip(oldaddr,USR_DOM,USR_HOST);
|
||||||
|
if (res != 0) {
|
||||||
|
sleep(SLEEP_TIME);
|
||||||
|
}
|
||||||
|
} while(res != 0);
|
||||||
|
#ifdef USE_SYSLOG
|
||||||
|
syslog(LOG_NOTICE,"update complete");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
doext = 0;
|
||||||
|
sleep(SLEEP_TIME);
|
||||||
|
} while(doext == 0);
|
||||||
|
|
||||||
|
cleanup();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
65
pdetach.c
Normal file
65
pdetach.c
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sysexits.h>
|
||||||
|
|
||||||
|
#ifdef SIGTSTP
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* normally included from paths.h */
|
||||||
|
|
||||||
|
#ifndef _PATH_TTY
|
||||||
|
#define _PATH_TTY "/dev/tty"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void pdetach(void)
|
||||||
|
{
|
||||||
|
int pid;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
/* if we are started from init, no need to become daemon */
|
||||||
|
|
||||||
|
if(getppid() == 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef SIGTTOU
|
||||||
|
signal(SIGTTOU, SIG_IGN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SIGTTIN
|
||||||
|
signal(SIGTTIN, SIG_IGN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SIGTSTP
|
||||||
|
signal(SIGTSTP, SIG_IGN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if((pid = fork()) < 0)
|
||||||
|
exit(EX_OSERR);
|
||||||
|
else if(pid > 0)
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(SIGTSTP) && defined(TIOCNOTTY)
|
||||||
|
if(setpgid(0, getpid()) == -1)
|
||||||
|
exit(EX_OSERR);
|
||||||
|
|
||||||
|
if((fd = open(_PATH_TTY, O_RDWR)) >= 0)
|
||||||
|
{
|
||||||
|
ioctl(fd, TIOCNOTTY, NULL);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if(setpgrp() == -1)
|
||||||
|
exit(EX_OSERR);
|
||||||
|
|
||||||
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
|
||||||
|
if((pid = fork()) < 0)
|
||||||
|
exit(OS_ERR);
|
||||||
|
else if(pid > 0)
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
77
updateip.c
Normal file
77
updateip.c
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "dhsd.h"
|
||||||
|
|
||||||
|
int sconnect(char *ip)
|
||||||
|
{
|
||||||
|
int isock;
|
||||||
|
struct sockaddr_in srvaddr;
|
||||||
|
|
||||||
|
isock = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
srvaddr.sin_family = AF_INET;
|
||||||
|
srvaddr.sin_port = htons(DHS_PORT);
|
||||||
|
srvaddr.sin_addr.s_addr = inet_addr(ip);
|
||||||
|
bzero(&(srvaddr.sin_zero),8);
|
||||||
|
|
||||||
|
if (connect(isock, (struct sockaddr *)&srvaddr,sizeof(struct sockaddr)) == -1) {
|
||||||
|
perror("connect");
|
||||||
|
close(isock);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return isock;
|
||||||
|
}
|
||||||
|
|
||||||
|
int updateip(char *ipaddr, char *dhsdom, char *dhshost)
|
||||||
|
{
|
||||||
|
char post_data[255];
|
||||||
|
char post_head[64];
|
||||||
|
char auth_head[128];
|
||||||
|
char chostname[50];
|
||||||
|
char tmpdatabuf[8192];
|
||||||
|
char databuf[4*8192];
|
||||||
|
char outbuf[8192];
|
||||||
|
char b64str[255];
|
||||||
|
int ibytes;
|
||||||
|
|
||||||
|
encbasic(b64str,USR_LOGIN,USR_PASSWD);
|
||||||
|
sprintf(chostname,"%s.%s",dhshost,dhsdom);
|
||||||
|
|
||||||
|
sprintf(auth_head,"Authorization: Basic %s\r\n",b64str);
|
||||||
|
|
||||||
|
sprintf(post_data,"%stype=4&updatetype=Online&hostscmd=edit&hostscmdstage=2&ip=%s&mx=%s&domain=%s&hostname=%s",DHS_ADDR,ipaddr,chostname,dhsdom,dhshost);
|
||||||
|
sprintf(post_head,"GET %s HTTP/1.0\r\n",post_data);
|
||||||
|
|
||||||
|
sockfd = sconnect(DHS_IP);
|
||||||
|
if (sockfd == -1) {
|
||||||
|
pdebug("sconnect() failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(outbuf,"%s%s\r\n\r\n",post_head,auth_head);
|
||||||
|
|
||||||
|
send(sockfd,outbuf,strlen(outbuf),0);
|
||||||
|
|
||||||
|
do {
|
||||||
|
ibytes = recv(sockfd, tmpdatabuf, 8192, 0);
|
||||||
|
if (ibytes > 0) {
|
||||||
|
tmpdatabuf[ibytes] = '\0';
|
||||||
|
strncat(databuf,tmpdatabuf,strlen(tmpdatabuf));
|
||||||
|
}
|
||||||
|
} while (ibytes > 0);
|
||||||
|
pdebug(tmpdatabuf);
|
||||||
|
|
||||||
|
//close(sockfd);
|
||||||
|
|
||||||
|
pdebug("socket closed");
|
||||||
|
|
||||||
|
/* Some error checking code could be handy... */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user