#!/usr/bin/env python
#
# A Monolith dynamic DNS client
#
# May, 1998
# Neil Schemenauer <nascheme@acs.ucalgary.ca>
#
################################################################
# Configuration (change this)
################################################################
MYHOST = "me"
ACTION = "act" # "dec"
MYID = "myid"
MYPASS = "password"

################################################################
# Stuff that should probably remain unchanged
################################################################
MYDOMAIN = ".dyn.mil.org"
URLHOST = "members.ml.org"
URLPORT = 8080
OKSTRING = "MS3V STATUS:OK"

import string

URLPATHF = [ "/mis-bin/ms3/nic/dyndns?"
			"command=Update+Host&",
			"domain=%s&",
			"act=%s&",
			"wildcard=on&",
			"do=mod&",
			"agree=agree" ]
URLPATHF = string.join(URLPATHF, '')

REQUEST = [ 
	"GET %s HTTP/1.0\r\n",
	"Host: %s\r\n",
	"Pragma: no-cache\r\n",
	"User-Agent: pydyndns/0.1/STD\r\n",
	"Authorization: Basic %s\r\n",
	"\r\n"
]
REQUEST = string.join(REQUEST, '')


import sys
import socket
import base64

# connect
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
	s.connect((URLHOST, URLPORT))
except socket.error:
	sys.stderr.write('Error connecting to %s:%d\n' % (URLHOST, URLPORT))
	sys.exit(1)

# send CGI data
URLPATH = URLPATHF %  (MYHOST, ACTION)
MYPASS = base64.encodestring(MYID+":"+MYPASS)[:-1]
try:
	s.send(REQUEST % (URLPATH, URLHOST, MYPASS) )
except socket.error:
	sys.stderr.write('Error writing to %s:%d\n' % (URLHOST, URLPORT))
	sys.exit(1)

# read reply
success = 0
while 1:
	try:
		reply = s.recv(10000)
	except socket.error:
		sys.stderr.write('Error reading from %s:%d\n' % (URLHOST, URLPORT))
		sys.exit(1)
	if not reply:
		break
	if string.find(reply, OKSTRING) != -1:
		success = 1

if success:
	sys.exit(0)
else:
	sys.stderr.write('dyndns: command was unsuccessfull.\n')
	sys.exit(2)
