1#!/usr/local/bin/perl 2 3# before anything else, the script needs to find out its own name 4# 5# some servers (notably IIS on windows) don't set the cwd to the script's 6# directory before executing it. So we get that information 7# from $0 (the full name & path of the script). 8BEGIN{($_=$0)=~s![\\/][^\\/]+$!!;push@INC,$_} 9 10$name = $0; 11$name =~ s/.+\/.+\///; # for unix 12$name =~ s/.+\\.+\\//; # for windows 13$path = $0; 14$path =~ s/(.+\/).+/$1/g; # for unix 15$path =~ s/(.+\\).+/$1/g; # for windows 16 17 18 19# check for required modules. 20require "includes.pl"; 21 22$module_found=0; 23foreach $temp_path (@INC) { 24 if (-e "$temp_path/JSON") { 25$module_found=1;} 26} 27if ($module_found == 0) { 28 $fatal_error=1; 29 $error_info .= "unable to locate required module <b>JSON</b>!\n"; 30} else { 31 require "JSON/PP58.pm"; 32 use JSON::PP; 33} 34 35if ($fatal_error == 1) { 36 &fatal_error(); # print error and bail out 37} 38 39my $new_lines = ""; 40my @events_in_file = (); 41 42&load_calendars(); 43local $current_cal_id = 0; 44 45 46# load upcoming event data 47open (FH, "$options{email_reminders_datafile}") || ($debug_info .="\nUnable to open file $options{email_reminders_datafile}"); 48flock FH,2; 49my @lines=<FH>; 50close datafile; 51 52foreach $line (@lines) { # need pre-load to ensure we only need one call to normalize_timezone 53 if ($line !~ /\w/) {next}; # skip blank spaces 54 55 my $temp_line = $line; 56 $temp_line =~ s/<\/?email_reminder>//g; 57 my ($evt_id) = &xml_quick_extract($temp_line, "evt_id"); 58 my ($before) = &xml_quick_extract($temp_line, "before"); 59 my ($script_url) = &xml_quick_extract($temp_line, "script_url"); 60 $script_url = &decode($script_url); 61 my ($extra_text) = &xml_quick_extract($temp_line, "extra_text"); 62 $extra_text = &decode($extra_text); 63 my ($to_address) = &xml_quick_extract($temp_line, "email_address"); 64 $to_address = &decode($to_address); 65 66 &load_event($evt_id); 67 push @events_in_file, {evt_id => $evt_id, 68 before => $before, 69 script_url => $script_url, 70 extra_text => $extra_text, 71 to_address => $to_address, 72 line => $line}; 73 74 #push @events_to_remind, $evt_id; 75} 76&normalize_timezone(); 77 78my $results = ""; 79 80foreach $event_reminder_ref (@events_in_file) { 81 my %event_reminder_stuff = %{$event_reminder_ref}; 82 my $evt_id = $event_reminder_stuff{evt_id}; 83 84 %current_event = %{$events{$evt_id}}; 85 my $current_cal_id = $current_event{cal_ids}[0]; 86 87 %current_calendar = %{$calendars{$current_cal_id}}; 88 89 $rightnow = time() + 3600 * $current_calendar{gmtime_diff}; 90 91 my $to_address = $event_reminder_stuff{to_address}; 92 my $extra_text = $event_reminder_stuff{extra_text}; 93 my $script_url = $event_reminder_stuff{script_url}; 94 my $before = $event_reminder_stuff{before}; 95 96 my $event_timestamp = $current_event{start}; 97 $date_string = &nice_date_range_format($current_event{start}, $current_event{end}, " - "); 98 99 my $event_time = ""; 100 if ($current_event{all_day_event} ne "1") { 101 $event_time = &nice_time_range_format($current_event{start}, $current_event{end}); 102 } 103 104 my $reminder_text = $lang{email_reminder_text}; 105 106 $reminder_text =~ s/###time###/$event_time/g; 107 $reminder_text =~ s/###title###/$current_event{title}/g; 108 $reminder_text =~ s/###date###/$date_string/g; 109 $reminder_text =~ s/###details###/$current_event{details}/g; 110 $reminder_text =~ s/###extra text###/$extra_text/g; 111 $reminder_text =~ s/###link###/$script_url?view_event=1&evt_id=$current_event{id}/g; 112 113 my $check_timestamp = $event_timestamp; 114 $check_timestamp -= $calendars{$current_event{cal_ids}[0]}{gmtime_diff}; 115 116 if (($check_timestamp - $rightnow) < $before) { 117 if ($current_event{title} ne "") { # blank title == deleted event 118 $test_reminder_results = &send_email_reminder(\%current_event, $to_address, $reminder_text); 119 if ($test_reminder_results eq "1") { 120 $results .= "Reminder for event $evt_id ($current_event{title}) sent successfully to <i>$to_address</i>!\n"; 121 } else { 122 $results .= "Reminder not sent to <i>$to_address</i>:<br/><br/>($test_reminder_results)\n"; 123 } 124 } 125 } else { 126 $new_lines .= $event_reminder_stuff{line}; 127 } 128} 129 130open (FH, ">$options{email_reminders_datafile}") || ($debug_info .="\nUnable to open file $options{email_reminders_datafile} for writing!"); 131flock FH,2; 132print FH $new_lines; 133close datafile; 134 135$results = "No email reminders to send!" if ($results eq ""); 136 137$results =~ s/\n/<br\/>\n/g; 138$debug_info =~ s/\n/<br\/>\n/g; 139 140print <<p1; 141Cache-control: no-cache,no-store,private 142Content-Type: text/html; charset=iso-8859-1\n 143<html> 144<body> 145$results 146$debug_info 147</html> 148</body> 149p1 150 151sub fatal_error() { 152 $error_info =~ s/\n/<br>/g; 153 154 $html_output .=<<p1; 155Cache-control: no-cache,no-store,private 156Content-Type: text/html; charset=iso-8859-1\n 157<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 158<html> 159<head> 160<title>Plans error!</title> 161</head> 162<body> 163 164<b>Plans error:</b><br> 165$error_info 166p1 167 if ($debug_info ne "") { 168 $debug_info =~ s/\n/<br>/g; 169 $html_output .=<<p1; 170<hr> 171Debug info:<br> 172$debug_info 173p1 174 175 } 176 177 $html_output .=<<p1; 178</body> 179</html> 180p1 181 182 print $html_output; 183 exit(0); 184} 185 186 187