#!/usr/bin/perl # # add an entry to my web log # # $dotat: scripts/blog,v 1.41 2011/09/14 08:57:33 fanf2 Exp $ use warnings; use strict; use IO::Socket; use POSIX; sub aargh ($); chdir "/home/fanf2/doc/web/cgi" or die "chdir ~/doc/web/cgi: $!\n"; my $doirc = 1; if ($ARGV[0] eq "noirc") { shift; $doirc = 0; } die "usage: $0 \n" unless @ARGV == 2; my ($url,$comment) = @ARGV; die "already blogged\n" if 0 == system "/usr/bin/egrep", "<".quotemeta($url).">", "url"; my $key = ""; while ($key !~ /[0-9]/) { my $random; open RANDOM, "< /dev/urandom" or aargh "open < /dev/random"; sysread RANDOM, $random, 4 or aargh "read /dev/random"; close RANDOM; $random = unpack "V", $random; my @char = qw( B C D F G H J K L M N P R T V W X Y Z 2 5 6 7 8 9 ); $key = ""; for my $i (1..5) { use integer; my $j = $random % @char; $random /= @char; $key .= $char[$j]; } $key = "" if 0 == system "grep $key url"; } my $reader = "url"; my $writer = "url.new"; open READER, "< $reader" or aargh "open < $reader"; open WRITER, "> $writer" or aargh "open > $writer"; while (defined (my $line = )) { print WRITER $line; next unless $line =~ /INSERT HERE/; my $date = strftime "%Y-%m-%dT%H:%M:%SZ", gmtime; print WRITER <, \$TEXT{"$key"} = q<$comment>, "$key"), END } close READER or aargh "close $reader"; close WRITER or aargh "close $writer"; rename $writer, $reader or aargh "rename $writer to $reader"; system "/usr/bin/cvs", "ci", "-m", $comment, $reader; system "/usr/bin/scp", "-i", "/home/fanf2/.ssh/id_link_log", $reader, "chiark:public-cgi/url"; ######################################## if ($doirc) { my $s = IO::Socket::INET->new(PeerAddr => "irc.chiark.greenend.org.uk", PeerPort => 6667); aargh "open irc" unless defined $s; aargh "unblock irc" unless defined $s->blocking(0); sub slurp { my $r = ""; for (;;) { my $n = sysread $s, my $l, 1000; aargh "read irc" if not defined $n and $! != EAGAIN; return undef if $r eq "" and defined $n and $n == 0; return $r if $l eq ""; print $l; $r .= $l; } } sub say { print my $l = join "", @_, "\r\n"; aargh "write irc" if not defined syswrite $s, $l; } say "user fanf 0 * :Tony Finch"; say "nick fanf-url"; for (;;) { my $r = slurp; say "pong $1" if $r =~ /PING :(\d+)\s*/; last if $r =~ / NOTICE fanf-url :on /; sleep 0.1 if $r eq ""; } say "privmsg #chiark :$url - $comment"; say "quit"; while (defined slurp) { sleep 0.1; } close $s; } ######################################## sub enc { my $it = shift; $it =~ s/([^A-Za-z0-9._~-])/sprintf "%%%02x", ord $1/eg; return $it; } $comment =~ s/<[^>]*>//g; my $q = "\x27"; my $tweet = "http://dotat.at/:/$key - $comment"; my $twenc = enc $tweet; $tweet =~ s/$q/$q"$q"$q/g; my $consumer_key = 'XXXXXXXXXXXXXXXXXXXXXX'; my $consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; my $token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; my $secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; my $twit = "https://api.twitter.com/1/statuses/update.json"; my $oauth = qx(/home/fanf2/bin/oauth_sign $consumer_key $consumer_secret $token $secret POST $twit status=$q$tweet$q); chomp $oauth; system "/usr/local/bin/wget", "--output-document=-", "--no-verbose", "--header=Authorization: $oauth", "--post-data=status=$twenc", $twit; my $comenc = enc $comment; my $urlenc = enc $url; system "/usr/local/bin/wget", "--output-document=-", "--no-verbose", "--http-user=fanf", "--http-password=".'XXXXXXXX', "https://api.del.icio.us/v1/posts/add?url=$urlenc&description=$comenc"; sub aargh ($) { my $msg = "@_: $!\n"; unlink $writer; die $msg; } ########################################