Utility intended to provide the user access to the previous day's The Tcler's Wiki chatroom log.
Author: LV
#!/bin/sh # \ exec tclsh "$0" ${1+"$@"} # Name: grabchat # Author: [lvirden] # Version: 4 # Purpose: to grab yesterday's tcler's wiki chat room log # v2: [Csan]: added proxy support (thx [RS]) and script header. # Give the proxy:port or just proxy as the cmdline arg # [PT]: implemented proxy Basic Authentication. # usage: grabchat ?proxy:port? ?username password? # v3: [lvirden]: fixed chatlog date format differences ( 2001-12-1.txt ) # - will have to fix each time format changes. # v4: [lvirden]: couple minor tweaks to match my local copy - no bugs. package require http package require base64 namespace eval http {} proc proxyset { proxy {port 80} } { if {[string equal $port ""]} { set port 80 } ::http::config -proxyhost $proxy -proxyport $port } proc buildProxyHeaders {login passwd} { lappend ::headers "Proxy-Authorization" \ [concat "Basic" \ [base64::encode $login:$passwd]] return $headers } set proxy [lindex $argv 0] proxyset [lindex [split $proxy :] 0] [lindex [split $proxy :] 1] set headers [list "Pragma" "no-cache"] if {$argc > 1} { buildProxyHeaders [lindex $argv 1] [lindex $argv 2] } proc ::http::geturl_followRedirects {url args} { while {1} { set token [eval [list http::geturl $url] -headers [list $::headers] $args] switch -glob -- [http::ncode $token] { 30[1237] { ### redirect - see below ### } default { return $token } } upvar #0 $token state array set meta [set ${token}(meta)] if {![info exist meta(Location)]} { return $token } set url $meta(Location) unset meta } } proc ::http::copy { url file {chunk 4096} } { set out [open $file "w"] set token [::http::geturl $url -channel $out \ -progress ::http::Progress \ -blocksize $chunk -headers $::headers] close $out # This ends the line started by ::http::Progress puts stderr "" upvar #0 $token state set max 0 foreach {name value} $state(meta) { if {[string length $name] > $max} { set max [string length $name] } if {[regexp -nocase -- ^location$ $name]} { # Handle URL redirects puts stderr "Location:$value" return [copy [string trim $value] $file $chunk] } } incr max foreach {name value} $state(meta) { puts [format "%-*s %s" $max $name: $value] } return $token } proc ::http::Progress {args} { puts -nonewline stderr "." ; flush stderr } # goal: grab yesterday's tcler's wiki chat log # filename YYYY-M-D.txt scan [clock format [clock scan "yesterday"] -format "%e %m %Y"] "%d %d %d" day month year set chatfile [format "%s-%s-%s.txt" $year $month $day] # Verify that the site is up set token [::http::geturl_followRedirects http://mini.net/tchat/logs/$chatfile] if {[regexp -nocase -- {ok} [::http::code $token]]} { ::http::copy http://mini.net/tchat/logs/$chatfile chat.$chatfile } else { puts "site http://mini.net/tchat/logs/$chatfile is dead: [::http::code $token]" } ::http::cleanup $token