| 1 |
<?php
|
| 2 |
// $Id: ping_server.module,v 1.1 2005/10/24 20:16:20 breyten Exp $
|
| 3 |
|
| 4 |
function ping_server_help($section) {
|
| 5 |
switch ($section) {
|
| 6 |
case 'admin/modules#description':
|
| 7 |
return t('provides a ping server a la Weblogs.Com.');
|
| 8 |
case 'admin/help#ping_server':
|
| 9 |
return t('The ping_server module allows you to run a ping server like Weblogs.Com');
|
| 10 |
}
|
| 11 |
}
|
| 12 |
|
| 13 |
function ping_server_perm() {
|
| 14 |
return array('see latest received pings');
|
| 15 |
}
|
| 16 |
|
| 17 |
function ping_server_menu($may_cache) {
|
| 18 |
$items = array();
|
| 19 |
if ($may_cache) {
|
| 20 |
$items[] = array('path' => 'pings', 'title' => t('Recent pings'), 'callback' => 'ping_server_latest', 'access' => user_access('see latest received pings'), 'type' => MENU_NORMAL_ITEM);
|
| 21 |
}
|
| 22 |
|
| 23 |
return $items;
|
| 24 |
}
|
| 25 |
|
| 26 |
function ping_server_settings() {
|
| 27 |
$form = array();
|
| 28 |
$form['ping_server_checksum'] = array('#type' => 'checkbox', '#title' => t('Always compute checksum'), '#return_value' => 1, '#default_value' => variable_get('ping_server_checksum', 0));
|
| 29 |
$form['ping_server_dump_after'] = array('#type' => 'textfield', '#title' => t('Dump old data after'), '#suffix' => t('days'), '#default_value' => variable_get('ping_server_dump_after', 31), '#size' => 5, '#maxlength' => 5);
|
| 30 |
$form['ping_server_min_timespan'] = array('#type' => 'textfield', '#title' => t('Minimum timespan between checks'), '#suffix' => t('hours'), '#default_value' => variable_get('ping_server_min_timespan', 1), '#size' => 5, '#maxlength' => 5);
|
| 31 |
return $form;
|
| 32 |
}
|
| 33 |
|
| 34 |
function ping_server_site_load($param = array()) {
|
| 35 |
$sql = "SELECT * FROM {ping_server} WHERE ";
|
| 36 |
if (!is_array($param)) {
|
| 37 |
$sql .= "url = '". db_escape_string($param) ."'";
|
| 38 |
}
|
| 39 |
else {
|
| 40 |
$cond = array();
|
| 41 |
foreach ($param as $key => $val) {
|
| 42 |
$cond[] = db_escape_string($key) ." = '". db_escape_string($val) ."'";
|
| 43 |
}
|
| 44 |
$sql .= implode(' AND ', $cond);
|
| 45 |
}
|
| 46 |
return db_fetch_object(db_query($sql));
|
| 47 |
}
|
| 48 |
|
| 49 |
function ping_server_site_save(&$site) {
|
| 50 |
db_query("DELETE FROM {ping_server} WHERE url = '%s'", $site->url);
|
| 51 |
$fields = array('name', 'url', 'changeurl', 'created', 'updated', 'etag', 'modified', 'checksum', 'realm');
|
| 52 |
$sql = "INSERT INTO {ping_server} (". implode(',', $fields) .") VALUES (";
|
| 53 |
$valsd = array();
|
| 54 |
foreach ($fields as $field) {
|
| 55 |
$vals[] .= "'". db_escape_string($site->$field) ."'";
|
| 56 |
}
|
| 57 |
$sql .= implode(',', $vals) .")";
|
| 58 |
db_query($sql);
|
| 59 |
}
|
| 60 |
|
| 61 |
function _ping_server_site_check(&$site) {
|
| 62 |
// first check last update time
|
| 63 |
$old_time = time() - variable_get('ping_server_min_timespan', 1) * 3600;
|
| 64 |
if ($site->updated > $old_time) {
|
| 65 |
return t('Please only ping me once in every %hours hours.', array('%hours' => variable_get('ping_server_min_timespan', 1)));
|
| 66 |
}
|
| 67 |
|
| 68 |
// Generate conditional GET headers.
|
| 69 |
$headers = array();
|
| 70 |
if ($site->etag) {
|
| 71 |
$headers['If-None-Match'] = $site->etag;
|
| 72 |
}
|
| 73 |
if ($site->modified) {
|
| 74 |
$headers['If-Modified-Since'] = gmdate('D, d M Y H:i:s', $site->modified) .' GMT';
|
| 75 |
}
|
| 76 |
|
| 77 |
// Request feed.
|
| 78 |
$result = drupal_http_request($site->changeurl, $headers);
|
| 79 |
|
| 80 |
switch ($result->code) {
|
| 81 |
case 304: //site wasn't changed
|
| 82 |
return t('The site didn\'t change since your last ping ...');
|
| 83 |
break;
|
| 84 |
case 301: //permanent redirect
|
| 85 |
$site->changeurl = $result->redirect_url;
|
| 86 |
// no break
|
| 87 |
case 200:
|
| 88 |
case 302:
|
| 89 |
case 307:
|
| 90 |
if ($result->headers['Last-Modified']) {
|
| 91 |
$site->modified = strtotime($result->headers['Last-Modified']);
|
| 92 |
}
|
| 93 |
$site->etag = $result->headers['ETag'];
|
| 94 |
$make_checksum = variable_get('ping_server_checksum', 0) || (!$site->etag);
|
| 95 |
if ($make_checksum) {
|
| 96 |
$checksum = function_exists('sha1') ? sha1($response->data) : md5($response->data);
|
| 97 |
}
|
| 98 |
$is_spam = module_exist('spam') ? spam_content_filter('module', $site->url, $site->url, $site->name) : FALSE;
|
| 99 |
if ((!$make_checksum || ($checksum != $site->checksum)) && !$is_spam) {
|
| 100 |
if ($make_checksum) {
|
| 101 |
$site->checksum = $checksum;
|
| 102 |
}
|
| 103 |
$site->updated = time();
|
| 104 |
ping_server_site_save($site);
|
| 105 |
}
|
| 106 |
break;
|
| 107 |
default:
|
| 108 |
return t("The site could not be reached by this ping server.");
|
| 109 |
}
|
| 110 |
}
|
| 111 |
|
| 112 |
function ping_server_weblogs_updates_ping($name, $url, $changesurl = '', $category = 'none') {
|
| 113 |
$update_url = ($changesurl == '') ? $url : $changesurl;
|
| 114 |
$realm = ($category == 'none') ? '' : $category;
|
| 115 |
$site = ping_server_site_load(array("url" => $url));
|
| 116 |
|
| 117 |
if (!$site) {
|
| 118 |
$site = new stdClass();
|
| 119 |
$site->url = $url;
|
| 120 |
$site->name = $name;
|
| 121 |
$site->changeurl = $update_url;
|
| 122 |
$site->realm = $realm;
|
| 123 |
}
|
| 124 |
|
| 125 |
$result = _ping_server_site_check($site);
|
| 126 |
|
| 127 |
return array('flerror' => ($result) ? 1 : 0, 'message' => ($result) ? $result : t('Thanks for the ping.'));
|
| 128 |
}
|
| 129 |
|
| 130 |
function ping_server_latest($realm = '') {
|
| 131 |
$old_time = time() - variable_get('ping_server_time_frame', 3600);
|
| 132 |
$sql = "SELECT * FROM {ping_server} WHERE updated >= %d";
|
| 133 |
if ($realm != '') {
|
| 134 |
$sql .= " AND realm = '%s'";
|
| 135 |
$result = db_query($sql ." ORDER BY updated DESC", $old_time, $realm);
|
| 136 |
}
|
| 137 |
else {
|
| 138 |
$result = db_query($sql ." ORDER BY updated DESC", $old_time);
|
| 139 |
}
|
| 140 |
$sites = array();
|
| 141 |
while ($site = db_fetch_object($result)) {
|
| 142 |
$sites[] = $site;
|
| 143 |
}
|
| 144 |
|
| 145 |
return theme_ping_server_list($sites, $realm);
|
| 146 |
}
|
| 147 |
|
| 148 |
/**
|
| 149 |
* Themes a list of sites.
|
| 150 |
*
|
| 151 |
* @param $entries
|
| 152 |
* An array of sites to display.
|
| 153 |
* @param $realm
|
| 154 |
* A specific realm(category) of sites.
|
| 155 |
*
|
| 156 |
* @return
|
| 157 |
* The HTML to use.
|
| 158 |
*
|
| 159 |
* @ingroup Themeable
|
| 160 |
*/
|
| 161 |
function theme_ping_server_list($entries = array(), $realm = '') {
|
| 162 |
$sites = array();
|
| 163 |
|
| 164 |
foreach ($entries as $entry) {
|
| 165 |
$sites[] = '<a href="'. check_url($entry->url) .'">'. check_markup($entry->name) .'</a>';
|
| 166 |
}
|
| 167 |
$header = t('Recently updated sites');
|
| 168 |
if ($realm != '') {
|
| 169 |
$header .= ' '. t('in the category') .' "'. check_markup($realm) .'"';
|
| 170 |
}
|
| 171 |
$output = theme_item_list($sites, $header);
|
| 172 |
|
| 173 |
return $output;
|
| 174 |
}
|
| 175 |
|
| 176 |
function ping_server_cron() {
|
| 177 |
$old_time = time() - variable_get('ping_server_dump_after', 31) * 86400;
|
| 178 |
$old_time = $old_time - ($old_time % 86400);
|
| 179 |
db_query("DELETE FROM {ping_server} WHERE updated < %d", $old_time);
|
| 180 |
}
|
| 181 |
|
| 182 |
function ping_server_xmlrpc() {
|
| 183 |
return array('weblogUpdates.ping' => 'ping_server_weblogs_updates_ping');
|
| 184 |
}
|