Article 9857 of comp.lang.perl: Xref: feenix.metronet.com comp.infosystems.www:6285 comp.lang.perl:9857 rec.arts.comics.strips:2686 Newsgroups: comp.infosystems.www,comp.lang.perl,clari.net.talk,rec.arts.comics.strips Path: feenix.metronet.com!news.utdallas.edu!wupost!galileo.cc.rochester.edu!ub!news.kei.com!sol.ctr.columbia.edu!howland.reston.ans.net!vixen.cso.uiuc.edu!news.acns.nwu.edu!news.eecs.nwu.edu!jmyers From: jmyers@eecs.nwu.edu (Jennifer Myers) Subject: ANNOUNCE: CGI Script for Dilbert Message-ID: Sender: usenet@eecs.nwu.edu Supersedes: Organization: Northwestern University, Evanston, Illinois Date: Mon, 17 Jan 1994 20:45:11 GMT Lines: 398 This article supersedes the announcement of "dilbert," version 0.1. I've been informed that the script cannot be named "dilbert" because it is a registered trademark. Therefore, I announce version 0.11 of "read-comics". Please update your version. Thanks! Announcing Version 0.11 of 'read-comics', a Common Gateway Interface World Wide Web gateway to clari.feature.dilbert. 'read-comics' is a Common Gateway Interface (CGI) script for CGI-compliant HTTP (World Wide Web) servers (e.g., NSCA httpd 1.0). 'read-comics' generates a hypertext interface to the clari.feature.dilbert newsgroup. It does this by querying the NNTP server for a list of active articles in the clari.feature.dilbert newsgroup and then generates from this, a list of hyperlinks. When a link is selected, the article is retrieved from the NNTP server and then uudecoded on-the-fly. There is a special link: http://www-server.domain/cgi-bin/read-comics?today which will always point to the most recent comic strip. Connecting hosts not in the specified domain are denied access. Retrieval instructions: Version 0.11 of 'read-comics' is appended to the end of this article. The latest version of 'read-comics' may also be retrieved from the WWW as http://www.eecs.nwu.edu:8001/jmyers/cgi-src/read-comics or by anonymous ftp as eecs.nwu.edu:/pub/jmyers/cgi-src/read-comics Installation: Configure $domain, $nntphost, and $group as appropriate. Put this script in your CGI bin directory. For example, on my server, I have this script installed as: http://www.eecs.nwu.edu:8001/cgi-bin/read-comics Acknowledgments: The NNTP code is adopted from code for a NNTP client written by Eric Young The uudecode algorithm comes from _Programming_Perl_, (Wall/Schwartz), p. 198. Revision History: 1/17/94: Version 0.11. Changed name of script to not interfere with trademark restrictions. (Dilbert is a registered trademark of Scott Adams and United Media). 1/16/94: Version 0.1. Initial release. Please contact me by email if you have any difficulties installing or using this package. Thanks, -Jennifer -- Jennifer Myers jmyers@eecs.nwu.edu #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'read-comics' <<'END_OF_FILE' X#!/usr/local/bin/perl X# X# read-comics X# X# Version 0.11, (January 17, 1994) X# X# Author: Jennifer Myers X# X# 'read-comics' is a Common Gateway Interface (CGI) script for CGI-compliant X# HTTP servers (e.g., NSCA httpd 1.0). 'read-comics' generates a hypertext X# interface to the clari.feature.dilbert newsgroup. It does this by X# querying the NNTP server for a list of active articles in the X# clari.feature.dilbert newsgroup and then generates from this, a list of X# hyperlinks. When a link is selected, the article is retrieved from the X# NNTP server and then uudecoded on-the-fly. X# X# There is a special link: http://www-server.domain/cgi-bin/read-comics?today X# which will always point to the most recent comic strip. X# X# Connecting hosts not in $domain are denied access. X# X# Retrieval instructions: X# X# The latest version of 'read-comics' may be retrieved from the WWW as X# http://www.eecs.nwu.edu:8001/jmyers/cgi-src/read-comics X# or by anonymous ftp as X# eecs.nwu.edu:/pub/jmyers/cgi-src/read-comics X# X# Installation: X# X# Configure $domain, $nntphost, and $group as appropriate. X# X# Put this script in your CGI bin directory. For example, on my X# server, I have this script installed as: X# http://www.eecs.nwu.edu:8001/cgi-bin/read-comics X# X# Acknowledgements: X# X# The NNTP code is adopted from code for a NNTP client written by X# Eric Young X# The uudecode algorithm comes from _Programming_Perl_, X# (Wall/Schwartz), p. 198. X# X# Revision History: X# X# 1/17/94: Version 0.11. Changed name of script to not interfere X# with trademark restrictions. (Dilbert is a registered X# trademark of Scott Adams and United Media). X# X# 1/16/94: Version 0.1. Initial release. X# X####################################################################### X X# Change these variables to suit your environment. X$domain = "nwu.edu"; X$nntphost = "news.acns.nwu.edu"; X$group = "clari.feature.dilbert"; X X# You should not need to change anything after this line. X$date = `/bin/date`; X$query_string = $ENV{'QUERY_STRING'}; X$remote_host = $ENV{'REMOTE_HOST'}; X$script_name = $ENV{'SCRIPT_NAME'}; X Xrequire 'sys/socket.ph'; X Xif ($remote_host =~ /\.$domain$/) { X do startnntp("$nntphost"); X do read_nntp_header(); X ($first, $last) = &group_cmd(); X do xhdr_cmd($first,$last); X} X Xif ($query_string eq "") { # Make index X print <<"EOM"; XContent-Type: text/html X X read-comics, a gateway to clari.feature.dilbert X X

clari.feature.dilbert gateway


X Please note that the Dilbert comic strip is copyrighted by X United Media, and you may not pass copies to others. Access to the X Dilbert comic strip is restricted to hosts in the X $domain domain. X

See ftp.clarinet.com:help/dilbert for more information.


XEOM X X if ($remote_host =~ /\.$domain$/) { # Access permitted X do getlinks(@subject); X } else { # Deny access X print <<"EOM"; X

Access Restricted:

X Your host is not recognized as belonging in the X $domain domain. Copyright restrictions X limit our distribution of this comic strip to hosts in the X $domain domain.

read-comics, a gateway to the newsgroup X clari.feature.dilbert, is a Common Gateway Interface X (CGI) script, written in Perl, which X queries the news server via NNTP, generates a list of X hyperlinked articles, and retrieves and uudecodes selected X articles on-the-fly. XEOM X } X X print <<"EOM"; X


X This page was automatically generated on $date
X This script, read-comics, was written by Jennifer Myers X XEOM X X} else { # Query provided X if ($remote_host =~ /\.$domain$/) { # Access permitted X print STDOUT "Content-Type: image/gif\n\n"; X X if ($query_string eq "today") { X $query_string = $last; X } X X @txt=&body_cmd($query_string); X X # X # uudecode algorithm X # X $_=shift(@txt) until ($mode,$file)=/^begin\s*(\d*)\s*(\S*)/; X while ($_ = shift(@txt)) { X last if /^end/; X next if /[a-z]/; X next unless int((((ord() - 32) & 077) + 2) / 3) == X int(length() / 4); X print unpack("u", $_); X } X } else { # Deny access X X print <<"EOM"; XContent-Type: text/html X X Access Denied X

Access Denied


X Sorry! The Dilbert comic is distributed by ClariNet. X Copyright restrictions limit our distribution of this comic strip to X hosts in the $domain domain.

read-comics, a gateway to the newsgroup X clari.feature.dilbert, is a Common Gateway Interface (CGI) X script, written in Perl, which queries the news server via NNTP, generates a list X of hyperlinked articles, and retrieves and uudecodes selected X articles on-the-fly.


This script, read-comics, was written by Jennifer Myers X XEOM X } X} # End of main program X Xsub getlinks { X local(@articles) = @_; X local(@i); X print STDOUT ""; X print STDOUT "

Archived:

"; X print STDOUT "
    "; X while ($_=shift(@articles)) { X split; X $num=shift(@_); X @subj=@_; X if (@subj[0] eq "Dilbert:") { X print STDOUT "
  • @subj"; X } X } X print STDOUT "
"; X} X Xsub body_cmd { X local($name)=@_; X local(@ret); X X print NNTP "BODY $name\n"; X $_=; X if (!/^222 /) X { X# print STDOUT "body cmd problems ($name):$_"; X do quit_cmd(1); X } X @ret=&getlines(); X return(@ret); X } X Xsub xhdr_cmd { X local($a,$b)=@_; X X print NNTP "XHDR Subject $a-$b\n"; X $_=; X if (!/^221 /) { X# print STDOUT "xhdr cmd problems\n"; X if (/^500 /) { X do manual_xhdr_cmd($a,$b); X } else { X do quit_cmd(); X } X return; X } X @subject=&getlines(); X} X Xsub manual_xhdr_cmd { X local($a,$b)=@_; X local($i,@s,$j); X X $#subject=$[; X foreach $i ($a .. $b) { X print NNTP "HEAD $i\n"; X $_=; X if (/^221 /) { X @s=grep(/^Subject: /,&getlines()); X# print STDOUT "no Subject: line in article $i\n" X# if ($#s < 0); X $s[0] =~ /^Subject: (.*)/; X push(@subject,"$i $1"); X } else { X print "$_"; X } X } X} X Xsub getlines { X local(@ret); X X while () { X if (/^\./ && (!/^\.\./)) { X chop; X last; X } X s/\015//g; X push(@ret,$_); X } X return(@ret); X} X Xsub quit_cmd { X local($code)=@_; X print NNTP "QUIT\n"; X $_=; X# print STDOUT "close bad:$_" unless (/^205 /); X exit($code); X} X Xsub group_cmd { X print NNTP "GROUP $group\n"; X $_=; X X split; X ($code,$num,$first,$last,$group)=@_; X if ($code != 211) { X# print STDOUT "group cmd problems:$_"; X do quit_cmd(1); X } X return($first,$last); X} X Xsub dokill { X kill(9,$child) if $child; X} X Xsub startnntp { X local($name)=@_; X X $SIG{'INT'}='dokill'; X X $sockaddr='Sna4x8'; X chop($hostname=`hostname`); X X ($n,$aliases,$proto)=getprotobyname('tcp'); X ($n,$aliases,$port)=getservbyname('nntp','tcp'); X ($n,$aliases,$type,$len,$thisaddr)=gethostbyname($hostname); X ($n,$aliases,$type,$len,$thataddr)=gethostbyname($name); X $this=pack($sockaddr,&AF_INET,0,$thisaddr); X $that=pack($sockaddr,&AF_INET,$port,$thataddr); X X socket(NNTP,&PF_INET,&SOCK_STREAM,$proto) || die "socket: $!"; X bind(NNTP,$this) || die "bind: $!"; X connect(NNTP,$that) || die "connect: $!"; X X select(NNTP); $|=1; X select(STDIN); $|=1; X select(STDOUT); $|=1; X} X Xsub read_nntp_header { X while () { X last if (/^200 /); X last if (/^201 /); X exit(1) if (/^400 /); X } X} END_OF_FILE if test 9256 -ne `wc -c <'read-comics'`; then echo shar: \"'read-comics'\" unpacked with wrong size! fi chmod +x 'read-comics' # end of 'read-comics' fi echo shar: End of shell archive. exit 0