⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 joe-ham

📁 早期freebsd实现
💻
字号:
Return-Path: bind-request@uunet.uu.netReceived: by cognition.pa.dec.com; id AA20768; Thu, 6 May 93 22:31:27 -0700Received: by inet-gw-2.pa.dec.com; id AA08078; Thu, 6 May 93 22:30:39 -0700Received: by rodan.UU.NET (5.61/UUNET-mail-drop)	id AA10465; Fri, 7 May 93 01:22:48 -0400Received: from relay1.UU.NET by rodan.UU.NET with SMTP 	(5.61/UUNET-mail-drop) id AA10461; Fri, 7 May 93 01:22:41 -0400Received: from inet-gw-1.pa.dec.com by relay1.UU.NET with SMTP 	(5.61/UUNET-internet-primary) id AA26744; Fri, 7 May 93 01:22:16 -0400Received: by inet-gw-1.pa.dec.com; id AA23315; Thu, 6 May 93 22:19:41 -0700Received: from ucsd.edu (ucsd.edu [128.54.16.1]) by vangogh.CS.Berkeley.EDU (ALPHA-6.55/6.25) id WAA29603; Thu, 6 May 1993 22:17:58 -0700Received: by ucsd.edu; id AA23528	sendmail 5.67/UCSD-2.2-sun	Thu, 6 May 93 22:18:06 -0700 for bind@vangogh.CS.Berkeley.EDUDate: Thu, 6 May 93 22:18:06 -0700From: brian@UCSD.EDU (Brian Kantor)Message-Id: <9305070518.AA23528@ucsd.edu>To: bind@vangogh.CS.Berkeley.EDU, sra@epilogue.comSubject: Re:  wish listThe AMPR.ORG domain is maintained by a mail robot which updates the zonefiles through a simple unique-key database.  Maintenance of the entriesis split among more than 150 "coordinators" in more than 140 regions ofthe world (more than 50 countries), with more than 15,000 entries in thezone file.It's simple stupid code, and people futz it up occasionally, but it works.Sure, I have to go through the database every few weeks and clean outthe stupidities, but without the robot, I'd never have the time to maintainit by hand!These tools are included below primarily as inspiration; I'd hate to inflictthis Joe-code (I hacked it up in one weekend) on anyone who would run it as is.	- Brian::::::::::::::/usr/ham/Makefile::::::::::::::all: ham.org hamhosts hamaddr ham.serialham.data: ham.pag dbtofile	dbtofile ham | sort -u > ham.data	chmod 664 ham.data	/usr/etc/chown nobody.ham ham.dataham.org:	ham.head ham.rev.head ham.data ham.serial	cat ham.head ham.data > ham.org	cat ham.rev.head > ham.org.rev	fgrep '44.' ham.data | awk -f rev.awk >> ham.org.rev	cp ham.org /usr/spool/ftp/hamradio/ham.org	cp ham.org.rev /usr/spool/ftp/hamradio/ham.org.rev	chmod 444 /usr/spool/ftp/hamradio/ham.org	chmod 444 /usr/spool/ftp/hamradio/ham.org.rev	/usr/etc/chown nobody.ham /usr/spool/ftp/hamradio/ham.org	/usr/etc/chown nobody.ham /usr/spool/ftp/hamradio/ham.org.revhamhosts: ham.data	awk -f hosts.awk < ham.data > hamhosts	sort -nt. +1 -2 +2 -3 +3 -4 hamhosts -o hamhosts	cp hamhosts /usr/spool/ftp/hamradio/hamhosts	chmod 644 /usr/spool/ftp/hamradio/hamhosts	/usr/etc/chown nobody.ham /usr/spool/ftp/hamradio/hamhostsham.serial:	ham.data serial newserial	serial > ham.serial	newserialserial:	serial.c	cc serial.c -O -o serial::::::::::::::/usr/ham/hosts.awk::::::::::::::/^#/		{print ""; print $0; h = "AaBbCc";next}/IN	A/	{h = $1; 			printf("\n%s\t%s",$4,$1)			next}$3 == "CNAME" && $4 == h	{printf " %s",$1}END	{printf "\n"}::::::::::::::/usr/ham/rev.awk::::::::::::::/IN	A	44/	{ split($1, h, " "); split($4, a, ".");if (a[1] == "" || a[2] == "" || a[3] == "")	next;if ( last4 != $4 ) {	printf "%s.%s.%s\tIN\tPTR\t%s.ampr.org.\n", a[4],a[3],a[2],h[1]	last4 = $4	}}::::::::::::::/usr/ham/hamaddr.c::::::::::::::#include <stdio.h>#include <ndbm.h>#include <strings.h>#include <ctype.h>#include <sys/file.h>char buf[BUFSIZ];char dat[6][128];char from[BUFSIZ];char keybuf[256];char valbuf[256];FILE *mailer;#define sendmail "/usr/lib/sendmail -oi -t"#define DB	"/usr/ham/ham"DBM *db;datum key, val;main(){int nf;int lc = 0;int i;char *c;int hdr = 0;mailer = popen(sendmail, "w");if (mailer == NULL)	{	perror(sendmail);	exit(-1);	}db = dbm_open(DB, O_RDWR, 0666);if (db == NULL)	{	perror(DB);	exit(1);	}while(fgets(buf, sizeof buf, stdin))	{	if ( (c = index(buf,'\n')) != NULL)		*c = 0;		if (strlen(buf) < 1)		{		hdr++;		continue;		}		if (hdr == 0  && !strncmp(buf, "From:", 5))		{		fprintf(mailer, "From: ham-request@ucsd.edu\n");		fprintf(mailer, "To: %s\n", &buf[5]);		printf("------->To: %s\n", &buf[6]);		fprintf(mailer, "Subject: address update rec'd\n");		fprintf(mailer,"\n\n--- begin ---\n");		continue;		}	if (hdr == 0)		continue;	fprintf(mailer,"> %s\n", buf);	if ( (c = index(buf,'#')) != NULL)		*c = 0;	if ( (c = index(buf,';')) != NULL)		*c = 0;	if ( (c = index(buf,'\r')) != NULL)		*c = 0;	c = buf;	while (*c)		{		if (isupper(*c))			*c = tolower(*c);		c++;		}	nf = sscanf(buf, "%s %s %s %s %s",		dat[1], dat[2], dat[3], dat[4], dat[5]);		if (nf < 2)		{		fprintf(mailer,"---> ignored\n");		continue;		}	if (dat[1][strlen(dat[1])-1] == '.')		{		fprintf(mailer,"---> error: trailing period in field 1\n");		continue;		}	if (dat[2][strlen(dat[2])-1] == '.')		{		fprintf(mailer,"---> error: trailing period in field 2\n");		continue;		}		if (!strncmp(dat[1],"44.",3))	/* must be host table fmt */		{		lc++;		fprintf(mailer,"%d ---> ADD/CHANGE: %s\tIN\tA\t%s\n",				lc, dat[2], dat[1]);		sprintf(keybuf,"A-%s", dat[2]);		key.dptr = keybuf;		key.dsize = strlen(key.dptr) + 1;		sprintf(valbuf, "%s\tIN\tA\t%s\n",				dat[2], dat[1]);		val.dptr = valbuf;		val.dsize = strlen(val.dptr) + 1;		dbm_store(db, key, val, DBM_REPLACE);		continue;		}		if (nf == 4 && !strcmp(dat[2],"in") && !strcmp(dat[3],"a"))		{		lc++;		sprintf(keybuf,"A-%s", dat[1]);		key.dptr = keybuf;		key.dsize = strlen(key.dptr) + 1;		sprintf(valbuf, "%s\tIN\tA\t%s\n", 				dat[1], dat[4]);		val.dptr = valbuf;		val.dsize = strlen(val.dptr) + 1;		if (strcmp(dat[4], "delete"))			{			dbm_store(db, key, val, DBM_REPLACE);			fprintf(mailer,"%d ---> ADD/CHANGE: %s\tIN\tA\t%s\n", 				lc, dat[1], dat[4]);			}		else			{			dbm_delete(db,key);			fprintf(mailer,"%d ---> DELETED: %s\tIN\tA\t%s\n", 				lc, dat[1], dat[4]);			}		continue;		}		if (nf == 4 && !strcmp(dat[2],"in") && !strcmp(dat[3],"cname"))		{		lc++;		fprintf(mailer,"%d:\t%s\tIN\tCNAME\t%s\n", 				lc, dat[1], dat[4]);		sprintf(keybuf,"C-%s", dat[1]);		key.dptr = keybuf;		key.dsize = strlen(key.dptr) + 1;		sprintf(valbuf, "%s\tIN\tCNAME\t%s\n", 				dat[1], dat[4]);		val.dptr = valbuf;		val.dsize = strlen(val.dptr) + 1;		if (strcmp(dat[4], "delete"))			{			dbm_store(db, key, val, DBM_REPLACE);			fprintf(mailer,"%d ---> ADD/CHANGE: %s\tIN\tA\t%s\n", 				lc, dat[1], dat[4]);			}		else			{			dbm_delete(db,key);			fprintf(mailer,"%d ---> DELETED: %s\tIN\tA\t%s\n", 				lc, dat[1], dat[4]);			}		continue;		}		if (nf == 5 && !strcmp(dat[2],"in") && !strcmp(dat[3],"mx")	&& isdigit(dat[4][0]))		{		lc++;		fprintf(mailer,"%d:\t%s\tIN\tMX %s\t%s\n", 				lc, dat[1], dat[4], dat[5]);		sprintf(keybuf,"M%s-%s", dat[4], dat[1]);		key.dptr = keybuf;		key.dsize = strlen(key.dptr) + 1;		sprintf(valbuf, "%s\tIN\tMX %s\t%s\n", 				dat[1], dat[4], dat[5]);		val.dptr = valbuf;		val.dsize = strlen(val.dptr) + 1;		if (strcmp(dat[5], "delete"))			{			dbm_store(db, key, val, DBM_REPLACE);			fprintf(mailer,"%d ---> ADD/CHANGE: %s\tIN\tMX %s\t%s\n", 				lc, dat[1], dat[4], dat[5]);			}		else			{			dbm_delete(db,key);			fprintf(mailer,"%d ---> DELETED: %s\tIN\tMX %s\t%s\n", 				lc, dat[1], dat[4], dat[5]);			}		continue;		}		fprintf(mailer,"---> skipped: record format error\n");	}fprintf(mailer,"--- end ---\n");fflush(mailer);pclose(mailer);dbm_close(db);exit(0);}::::::::::::::/usr/ham/dbtofile.c::::::::::::::/* * dumps DBM database contents to stdout */#include <stdio.h>#include <ndbm.h>#include <sys/file.h>char buf[BUFSIZ];DBM *db;datum key, val;main(argc,argv)int argc;char **argv;	{	if (argc != 2)		{		fprintf(stderr,"Usage: dbtofile db \n");		exit(1);		}	if ((db = dbm_open(argv[1], O_RDONLY, 0)) < 0)		{		perror(argv[1]);		exit(1);		}	for (key = dbm_firstkey(db); key.dptr != NULL;				key = dbm_nextkey(db))		{		val = dbm_fetch(db, key);		puts(val.dptr);		}	}::::::::::::::/usr/ham/serial.c::::::::::::::#include <stdio.h>#include <sys/time.h>main()	{	struct tm *tm;	struct timeval tv;	struct timezone tz;	gettimeofday(&tv,&tz);	tm = gmtime(&tv.tv_sec);	printf("\t\t\t\t%02d%02d%02d%02d\t; Serial\n",		tm->tm_year, (tm->tm_mon + 1), tm->tm_mday, tm->tm_hour);	exit(0);	}::::::::::::::/usr/ham/newserial::::::::::::::#!/bin/shfor f in \	ham.head \	ham.rev.head \		; doex $f << EOF > /dev/null/Serial/d-r ham.serialwqEOFecho $f 'updated' ;done ;exit 0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -