diff --git a/calendar-import.plx b/calendar-import.plx index 0edc9af..d1da138 100644 --- a/calendar-import.plx +++ b/calendar-import.plx @@ -1,9 +1,13 @@ #!/usr/bin/perl -w # calendar-import.plx -*- Perl -*- # ==================================================================== +# NOTE: Overall license of this file is GPLv3-only, due (in part) to Software +# Freedom Law Center copyrights (see below). Kuhn's personal copyrights are +# licensed GPLv3-or-later. # -# The sub's "safe_read_from_pipe" and read_from_process are: # ==================================================================== +# The sub's "safe_read_from_pipe" and read_from_process are: + # Copyright (c) 2000-2004 CollabNet. All rights reserved. # # This software is licensed as described in the file COPYING, which @@ -48,6 +52,24 @@ # along with this program in a file in the toplevel directory called # "GPLv3". If not, see . +# ==================================================================== +# The functions DoLog, BinarySearchForTZEntry, PrivatizeMergeAndTZIcalFile, +# BuildTZList, MergeLists, PrivacyFilterICalFiles, and FilterEmacsToICal material +# copyrighted and licensed as below: + +# Copyright © 2006 Software Freedom Law Center, Inc. +# +# This software gives you freedom; it is licensed to you under version 3 +# of the GNU General Public License. +# +# This software is distributed WITHOUT ANY WARRANTY, without even the +# implied warranties of MERCHANTABILITY and FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for further details. +# +# You should have received a copy of the GNU General Public License, +# version 3. If not, see + + use strict; use warnings; @@ -58,6 +80,67 @@ if (@ARGV != 1) { exit 1; } ############################################################################### +my $CALENDAR_LOCK_FILE = "$ENV{HOME}/.emacs-calendar-to-ics-lock"; + +my $LOCK_CLEANUP_CODE = sub { + return (unlink($CALENDAR_LOCK_FILE) != 1) ? + "Failed unlink of $CALENDAR_LOCK_FILE. Could cause trouble." : + ""; +}; +############################################################################### +{ + my %messageHistory; + + sub DoLog ($$$;$) { + my($type, $user, $message, $cleanupCode) = @_; + + use Date::Manip; + my $NOW = ParseDate("now"); + + my $lastTime = $messageHistory{$message}; + + my $sendIt = 0; + if (not defined $lastTime) { + $sendIt = 1; + } else { + my $err; + my $sinceLast = DateCalc($lastTime,"+ 10 minutes",\$err); + $sendIt = 1 if ($NOW gt $sinceLast); + } + if ($sendIt) { + my $fh = File::Temp->new(); + $fh->unlink_on_destroy( 1 ); + my $fname = $fh->filename; + print $fh "Calendar Export Failure: $message\n"; + $fh->close(); + system('/home/bkuhn/bin/myosd', $fname); + unless (-f "$ENV{HOME}/.silent-running") { + open(ESPEAK, "-|", "/usr/bin/espeak", '-p', '45', '-s', '130', '-f', $fname, "--stdout"); + open(PAPLAY, "|-", "/usr/bin/paplay"); + my $data; + while (read(ESPEAK, $data, 8) == 8) { + print PAPLAY $data; + } + close PAPLAY; close ESPEAK; + } + system('/usr/bin/notify-send', '-u', 'critical', '-t', '300000', + 'Failure', "Calendar export failure: $message"); + $messageHistory{$message} = $NOW; + } + my $more; + $more = &$cleanupCode if defined $cleanupCode and ref $cleanupCode; + $message .= " $more" if (defined $more and $more !~ /^\s*$/); + croak $message if $type eq "die"; + warn $message; + } + sub DieLog ($;$) { + DoLog("die", undef, $_[0], $_[1]); + } + sub WarnLog ($$) { + DoLog("warn", $_[0], $_[1]); + } +} +############################################################################### # Start a child process safely without using /bin/sh. sub safe_read_from_pipe {