Files
oc-server3/htdocs/util/notification/run_notify.php
T
2012-08-16 21:04:13 +02:00

254 lines
7.1 KiB
PHP

#!/usr/local/bin/php -q
<?php
/***************************************************************************
./util/notification/run_notify.php
-------------------
begin : August 25 2006
For license information see doc/license.txt
***************************************************************************/
/***************************************************************************
Unicode Reminder メモ
Ggf. muss die Location des php-Binaries angepasst werden.
Arbeitet die Tabelle `notify_waiting` ab und verschickt
Benachrichtigungsmails ueber neue Caches.
***************************************************************************/
// needs absolute rootpath because called as cronjob
$rootpath = dirname(__FILE__) . '/../../';
// chdir to proper directory (needed for cronjobs)
chdir(substr(realpath($_SERVER['PHP_SELF']), 0, strrpos(realpath($_SERVER['PHP_SELF']), '/')));
require_once($rootpath . 'lib/clicompatbase.inc.php');
require_once('settings.inc.php');
require_once($rootpath . 'lib/consts.inc.php');
// use posix pid-files to lock process
if (!CreatePidFile($notifypid))
{
CleanupAndExit($notifypid, "Another instance is running!");
exit;
}
/* begin with some constants */
$sDateformat = 'Y-m-d H:i:s';
/* end with some constants */
/* begin db connect */
db_connect();
if ($dblink === false)
{
echo 'Unable to connect to database';
exit;
}
/* end db connect */
$rsNotify = sql(" SELECT `notify_waiting`.`id`, `notify_waiting`.`cache_id`, `notify_waiting`.`type`,
`user`.`username`,
`user2`.`email`, `user2`.`username` as `recpname`, `user2`.`latitude` as `lat1`, `user2`.`longitude` as `lon1`, `user2`.`user_id` as `recid`,
`caches`.`name` as `cachename`, `caches`.`date_hidden`, `caches`.`latitude` as `lat2`, `caches`.`longitude` as `lon2`, `caches`.`wp_oc`,
`cache_type`.`de` as `cachetype`,
`cache_size`.`de` as `cachesize`
FROM `notify_waiting`, `caches`, `user`, `user` `user2`, `cache_type`, `cache_size`, `cache_status`
WHERE `notify_waiting`.`cache_id`=`caches`.`cache_id`
AND `notify_waiting`.`user_id`=`user2`.`user_id`
AND `caches`.`user_id`=`user`.`user_id`
AND `caches`.`type`=`cache_type`.`id`
AND `caches`.`status`=`cache_status`.`id`
AND `caches`.`size`=`cache_size`.`id`
AND `cache_status`.`allow_user_view`=1");
while($rNotify = sql_fetch_array($rsNotify))
{
sql("DELETE FROM `notify_waiting` WHERE `id` ='&1'", $rNotify['id']);
process_new_cache($rNotify);
}
mysql_free_result($rsNotify);
CleanupAndExit($notifypid);
/* end send out everything that has to be sent */
function process_new_cache($notify)
{
global $notify_text, $mailfrom, $mailsubject, $debug, $debug_mailto, $rootpath;
//echo "process_new_cache(".$notify['id'].")\n";
$fehler = false;
// mail-template lesen
switch($notify['type'])
{
case notify_new_cache: // Type: new cache
$mailbody = read_file($rootpath . 'util/notification/notify_newcache.email');
break;
default:
$fehler = true;
break;
}
if(!$fehler)
{
$mailbody = mb_ereg_replace('{username}', $notify['recpname'], $mailbody);
$mailbody = mb_ereg_replace('{date}', date('d.m.Y', strtotime($notify['date_hidden'])), $mailbody);
$mailbody = mb_ereg_replace('{cacheid}', $notify['cache_id'], $mailbody);
$mailbody = mb_ereg_replace('{wp_oc}', $notify['wp_oc'], $mailbody);
$mailbody = mb_ereg_replace('{user}', $notify['username'], $mailbody);
$mailbody = mb_ereg_replace('{cachename}', $notify['cachename'], $mailbody);
$mailbody = mb_ereg_replace('{distance}', round(calcDistance($notify['lat1'], $notify['lon1'], $notify['lat2'], $notify['lon2'], 1), 1), $mailbody);
$mailbody = mb_ereg_replace('{unit}', 'km', $mailbody);
$mailbody = mb_ereg_replace('{bearing}', Bearing2Text(calcBearing($notify['lat1'], $notify['lon1'], $notify['lat2'], $notify['lon2'])), $mailbody);
$mailbody = mb_ereg_replace('{cachetype}', $notify['cachetype'], $mailbody);
$mailbody = mb_ereg_replace('{cachesize}', $notify['cachesize'], $mailbody);
$subject = mb_ereg_replace('{cachename}', $notify['cachename'], $mailsubject);
/* begin send out everything that has to be sent */
$email_headers = 'From: "' . $mailfrom . '" <' . $mailfrom . '>';
// mail versenden
if ($debug == true)
$mailadr = $debug_mailto;
else
$mailadr = $notify['email'];
if (is_existent_maildomain(getToMailDomain($mailadr)))
mb_send_mail($mailadr, $subject, $mailbody, $email_headers);
}
else
{
echo "Unbekannter Notification-Typ: " . $notify['type'] . "<br />";
}
// logentry($module, $eventid, $userid, $objectid1, $objectid2, $logtext, $details)
logentry('notify_newcache', 5, $notify['recid'], $notify['cache_id'], 0, 'Sending mail to ' . $mailadr, array());
return 0;
}
function is_existent_maildomain($domain)
{
$smtp_serverlist = array();
$smtp_serverweight = array();
if (getmxrr($domain, $smtp_serverlist, $smtp_serverweight) != false)
if (count($smtp_serverlist)>0)
return true;
// check if A exists
$a = dns_get_record($domain, DNS_A);
if (count($a) > 0)
return true;
return false;
}
function getToMailDomain($mail)
{
if ($mail == '')
return '';
if (strrpos($mail, '@') === false)
$domain = 'localhost';
else
$domain = substr($mail, strrpos($mail, '@') + 1);
return $domain;
}
//
// checks if other instance is running, creates pid-file for locking
//
function CreatePidFile($PidFile)
{
if(!CheckDaemon($PidFile))
{
return false;
}
if(file_exists($PidFile))
{
echo "Error: Pidfile (".$PidFile.") already present at ".__FILE__.":".__LINE__."!\n";
return false;
}
else
{
if($pidfile = @fopen($PidFile, "w"))
{
fputs($pidfile, posix_getpid());
fclose($pidfile);
return true;
}
else
{
echo "can't create Pidfile $PidFile at ".__FILE__.":".__LINE__."!\n";
return false;
}
}
}
//
// checks if other instance of process is running..
//
function CheckDaemon($PidFile)
{
if($pidfile = @fopen($PidFile, "r"))
{
$pid_daemon = fgets($pidfile, 20);
fclose($pidfile);
$pid_daemon = (int)$pid_daemon;
// process running?
if(posix_kill($pid_daemon, 0))
{
// yes, good bye
echo "Error: process already running with pid=$pid_daemon!\n";
false;
}
else
{
// no, remove pid_file
echo "process not running, removing old pid_file (".$PidFile.")\n";
unlink($PidFile);
return true;
}
}
else
{
return true;
}
}
//
// deletes pid-file
//
function CleanupAndExit($PidFile, $message = false)
{
if($pidfile = @fopen($PidFile, "r"))
{
$pid = fgets($pidfile, 20);
fclose($pidfile);
if($pid == posix_getpid())
unlink($PidFile);
}
else
{
echo "Error: can't delete own pidfile (".$PidFile.") at ".__FILE__.":".__LINE__."!\n";
}
if($message)
{
echo $message . "\n";
}
}
?>