pull.php 11.2 KB
Newer Older
MatrixCrawler's avatar
MatrixCrawler committed
1
<?php
2
//* Copyright (c) 2011, David Morley. This file is licensed under the Affero General Public License version 3 or later. See the COPYRIGHT file. */
3

David Morley's avatar
David Morley committed
4 5 6
$debug   = isset($_GET['debug']) || (isset($argv) && in_array('debug', $argv, true));
$newline = PHP_SAPI === 'cli' ? "\n" : '<br>';

7 8 9
// Other parameters.
$_domain = $_GET['domain'] ?? '';

10
require_once __DIR__ . '/../config.php';
dmorley's avatar
dmorley committed
11

dmorley's avatar
dmorley committed
12
//get master code version for diaspora pods
dmorley's avatar
dmorley committed
13
$mv = curl_init();
14
curl_setopt($mv, CURLOPT_URL, 'https://raw.githubusercontent.com/diaspora/diaspora/master/config/defaults.yml');
dmorley's avatar
dmorley committed
15 16 17 18
curl_setopt($mv, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($mv, CURLOPT_RETURNTRANSFER, 1);
$outputmv = curl_exec($mv);
curl_close($mv);
dmorley's avatar
dmorley committed
19
preg_match('/number:.*"(.*)"/', $outputmv, $version);
dmorley's avatar
dmorley committed
20
$dmasterversion = trim($version[1], '"');
David Morley's avatar
David Morley committed
21
_debug('Diaspora Masterversion', $dmasterversion);
dmorley's avatar
dmorley committed
22

dmorley's avatar
dmorley committed
23
//get master code version for friendica pods
dmorley's avatar
dmorley committed
24
$mv = curl_init();
25
curl_setopt($mv, CURLOPT_URL, 'https://raw.githubusercontent.com/friendica/friendica/master/boot.php');
dmorley's avatar
dmorley committed
26 27 28 29
curl_setopt($mv, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($mv, CURLOPT_RETURNTRANSFER, 1);
$outputmv = curl_exec($mv);
curl_close($mv);
dmorley's avatar
dmorley committed
30
preg_match('/define.*\'FRIENDICA_VERSION\'.*\'(.*)\'/', $outputmv, $version);
dmorley's avatar
dmorley committed
31
$fmasterversion = trim($version[1], '"');
David Morley's avatar
David Morley committed
32
_debug('Friendica Masterversion: ' . $fmasterversion);
33

dmorley's avatar
dmorley committed
34 35 36 37 38 39 40
//get master code version for hubzilla pods
$mv = curl_init();
curl_setopt($mv, CURLOPT_URL, 'https://raw.githubusercontent.com/redmatrix/hubzilla/master/boot.php');
curl_setopt($mv, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($mv, CURLOPT_RETURNTRANSFER, 1);
$outputmv = curl_exec($mv);
curl_close($mv);
dmorley's avatar
dmorley committed
41
preg_match('/define.*\'STD_VERSION\'.*\'(.*)\'/', $outputmv, $version);
dmorley's avatar
dmorley committed
42 43 44
$hmasterversion = trim($version[1], '"');
_debug('Hubzilla Masterversion: ' . $hmasterversion);

45 46
$dbh = pg_connect("dbname=$pgdb user=$pguser password=$pgpass");
$dbh || die('Error in connection: ' . pg_last_error());
MatrixCrawler's avatar
MatrixCrawler committed
47

dmorley's avatar
dmorley committed
48
//foreach pod check it and update db
49
if ($_domain) {
David Morley's avatar
David Morley committed
50
  $sql = 'SELECT domain,stats_apikey,score,date_created,adminrating,weight FROM pods WHERE domain = $1';
51 52
  $result = pg_query_params($dbh, $sql, [$_domain]);
} elseif (PHP_SAPI === 'cli') {
David Morley's avatar
David Morley committed
53
  $sql = 'SELECT domain,stats_apikey,score,date_created,adminrating,weight FROM pods';
dmorley's avatar
dmorley committed
54
  $result = pg_query($dbh, $sql);
55 56
} else {
  die('No valid input');
dmorley's avatar
dmorley committed
57
}
58 59
$result || die('Error in SQL query1: ' . pg_last_error());

David Morley's avatar
David Morley committed
60 61 62 63 64 65 66 67 68
while ($row = pg_fetch_assoc($result)) {
  $domain    = $row['domain'];
  $score     = (int) $row['score'];
  $dateadded = $row['date_created'];
  $admindb   = (int) $row['adminrating'];
  $weight    = $row['weight'];
  $sqlforr   = 'SELECT admin,rating FROM rating_comments WHERE domain = $1';
  $ratings   = pg_query_params($dbh, $sqlforr, [$domain]);
  $ratings || die('Error in SQL query2: ' . pg_last_error());
69

David Morley's avatar
David Morley committed
70
  _debug('Domain', $domain);
noplanman's avatar
noplanman committed
71

David Morley's avatar
David Morley committed
72 73 74 75 76 77 78
  $user_ratings  = [];
  $admin_ratings = [];
  while ($rating = pg_fetch_assoc($ratings)) {
    if ($rating['admin'] == 0) {
      $user_ratings[] = $rating['rating'];
    } elseif ($rating['admin'] == 1) {
      $admin_ratings[] = $rating['rating'];
79
    }
David Morley's avatar
David Morley committed
80 81 82
  }
  $user_rating  = empty($user_ratings) ? 0 : max(10, round(array_sum($user_ratings) / count($user_ratings), 2));
  $admin_rating = empty($admin_ratings) ? 0 : max(10, round(array_sum($admin_ratings) / count($admin_ratings), 2));
noplanman's avatar
noplanman committed
83

David Morley's avatar
David Morley committed
84 85 86
  if ($admindb == -1) {
    $admin_rating = -1;
  }
87

David Morley's avatar
David Morley committed
88 89 90 91 92 93 94 95 96
  $chss = curl_init();
  curl_setopt($chss, CURLOPT_URL, 'https://' . $domain . '/nodeinfo/1.0');
  curl_setopt($chss, CURLOPT_CONNECTTIMEOUT, 9);
  curl_setopt($chss, CURLOPT_TIMEOUT, 9);
  curl_setopt($chss, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($chss, CURLOPT_CERTINFO, 1);
  $outputssl      = curl_exec($chss);
  $outputsslerror = curl_error($chss);
  $info           = curl_getinfo($chss, CURLINFO_CERTINFO);
97
  $ttl            = curl_getinfo($chss, CURLINFO_CONNECT_TIME);
dmorley's avatar
dmorley committed
98
  $sslexpire      = $info[0]['Expire date'] ?? null;
David Morley's avatar
David Morley committed
99
  curl_close($chss);
100

David Morley's avatar
David Morley committed
101 102
  _debug('Nodeinfo output', $outputssl, true);
  _debug('Nodeinfo output error', $outputsslerror, true);
103 104 105
  _debug('Cert expire date', $sslexpire);
  _debug('TTL', $ttl);
  
David Morley's avatar
David Morley committed
106 107
  //get new json from nodeinfo
  $jsonssl = json_decode($outputssl);
noplanman's avatar
noplanman committed
108

dmorley's avatar
dmorley committed
109
  if (!$jsonssl) {    
dmorley's avatar
dmorley committed
110
    _debug('Connection', 'Can not connect to pod');
David Morley's avatar
David Morley committed
111

112
    $sql_errors    = 'INSERT INTO checks (domain, online, error, ttl) VALUES ($1, $2, $3, $4)';
dmorley's avatar
dmorley committed
113
    $result_errors = pg_query_params($dbh, $sql_errors, [$domain, 0, $outputsslerror, $ttl]);
dmorley's avatar
dmorley committed
114
    $result_errors || die('Error in SQL query: ' . pg_last_error());
David Morley's avatar
David Morley committed
115
  }
noplanman's avatar
noplanman committed
116

David Morley's avatar
David Morley committed
117
  if ($jsonssl !== null) {
118
    $sql_checks    = 'INSERT INTO checks (domain, online, ttl) VALUES ($1, $2, $3)';
dmorley's avatar
dmorley committed
119
    $result_checks = pg_query_params($dbh, $sql_checks, [$domain, 1, $ttl]);
dmorley's avatar
dmorley committed
120
    $result_checks || die('Error in SQL query: ' . pg_last_error());
dmorley's avatar
dmorley committed
121 122
    
    (!$jsonssl->software->version) || $score += 1;
David Morley's avatar
David Morley committed
123 124 125 126
    $xdver        = $jsonssl->software->version ?? 0;
    $dverr        = explode('-', trim($xdver));
    $shortversion = $dverr[0];
    _debug('Version code', $shortversion);
dmorley's avatar
dmorley committed
127
    $signup                = ($jsonssl->openRegistrations === true);
David Morley's avatar
David Morley committed
128 129 130 131 132 133 134 135 136 137 138
    $softwarename          = $jsonssl->software->name ?? 'null';
    $name                  = $jsonssl->metadata->nodeName ?? 'null';
    $total_users           = $jsonssl->usage->users->total ?? 0;
    $active_users_halfyear = $jsonssl->usage->users->activeHalfyear ?? 0;
    $active_users_monthly  = $jsonssl->usage->users->activeMonth ?? 0;
    $local_posts           = $jsonssl->usage->localPosts ?? 0;
    $comment_counts        = $jsonssl->usage->localComments ?? 0;
    $service_facebook      = in_array('facebook', $jsonssl->services->outbound, true);
    $service_twitter       = in_array('twitter', $jsonssl->services->outbound, true);
    $service_tumblr        = in_array('tumblr', $jsonssl->services->outbound, true);
    $service_wordpress     = in_array('wordpress', $jsonssl->services->outbound, true);
dmorley's avatar
dmorley committed
139
    $service_xmpp          = $jsonssl->metadata->xmppChat === true ?? false;
David Morley's avatar
David Morley committed
140 141 142 143 144 145 146
  } else {
    $score -= 1;
    $dver         = '.connect error';
    $shortversion = 0;
  }

  _debug('Signup Open', $signup);
147
  $ip6 = exec(escapeshellcmd('dig @74.82.42.42 +nocmd ' . $domain . ' aaaa +noall +short'));
148
  $iplookup = [];
149
  exec(escapeshellcmd('delv @74.82.42.42 ' . $domain), $iplookup);
dmorley's avatar
dmorley committed
150
  if ($iplookup) {
dmorley's avatar
dmorley committed
151
    _debug('Iplookup', $iplookup, true);
dmorley's avatar
dmorley committed
152
    $dnssec = in_array('; fully validated', $iplookup) ?? false ;
153 154
    $getaonly = array_values(preg_grep('/A\s.*/', $iplookup));
    preg_match('/A\s(.*)/', $getaonly[0], $version);
dmorley's avatar
dmorley committed
155 156
    $ip   = trim($version[1]);
  }
dmorley's avatar
dmorley committed
157
  $ip || $score -= 2;
David Morley's avatar
David Morley committed
158 159
  $ipv6 = strpos($ip6, ':') !== false;
  _debug('IP', $ip);
dmorley's avatar
dmorley committed
160
  _debug('IPv6', $ip6);
David Morley's avatar
David Morley committed
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185

  $location = geoip_record_by_name($ip);
  _debug('Location', $location, true);

  if ($location) {
    $country = !empty($location['country_code']) ? iconv('UTF-8', 'UTF-8//IGNORE', $location['country_code']) : null;
    $city    = !empty($location['city']) ? iconv('UTF-8', 'UTF-8//IGNORE', $location['city']) : null;
    $state   = !empty($location['region']) ? iconv('UTF-8', 'UTF-8//IGNORE', $location['region']) : null;
    $lat     = !empty($location['latitude']) ? $location['latitude'] : null;
    $long    = !empty($location['longitude']) ? $location['longitude'] : null;
  }
  echo $newline;
  $statslastdate = date('Y-m-d H:i:s');
  $ping          = curl_init();
  curl_setopt($ping, CURLOPT_URL, 'https://api.uptimerobot.com/getMonitors?format=json&noJsonCallback=1&customUptimeRatio=7-30-60-90&responseTimes=1&responseTimesAverage=86400&apiKey=' . $row['stats_apikey']);
  curl_setopt($ping, CURLOPT_POST, 0);
  curl_setopt($ping, CURLOPT_HEADER, 0);
  curl_setopt($ping, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ping, CURLOPT_CONNECTTIMEOUT, 8);
  curl_setopt($ping, CURLOPT_NOBODY, 0);
  curl_setopt($ping, CURLOPT_MAXCONNECTS, 5);
  curl_setopt($ping, CURLOPT_FOLLOWLOCATION, true);
  $uptr = json_decode(curl_exec($ping));
  curl_close($ping);
  _debug('Uptime Robot', $uptr, true);
dmorley's avatar
dmorley committed
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
  
  if ($uptr->stat === 'ok') {
    $responsetime    = $uptr->monitors->monitor{'0'}->responsetime{'0'}->value ?? 'n/a';
    $uptimerobotstat = $uptr->stat;
    $uptime          = $uptr->monitors->monitor{'0'}->alltimeuptimeratio;
    $uptime_custom   = $uptr->monitors->monitor{'0'}->customuptimeratio;
    $diff            = (new DateTime())->diff(new DateTime($dateadded));
    $months          = $diff->m + ($diff->y * 12);
    if ($uptr->monitors->monitor{'0'}->status == 2) {
      $status = 'Up';
    }
    if ($uptr->monitors->monitor{'0'}->status == 0) {
      $status = 'Paused';
    }
    if ($uptr->monitors->monitor{'0'}->status == 1) {
      $status = 'Not Checked Yet';
    }
    if ($uptr->monitors->monitor{'0'}->status == 8) {
      $status = 'Seems Down';
    }
    if ($uptr->monitors->monitor{'0'}->status == 9) {
      $status = 'Down';
    }
      $statslastdate = date('Y-m-d H:i:s');
David Morley's avatar
David Morley committed
210
  }
noplanman's avatar
noplanman committed
211

David Morley's avatar
David Morley committed
212 213 214 215
  if ($softwarename === 'diaspora') {
    $masterversion = $dmasterversion;
  } elseif ($softwarename === 'friendica') {
    $masterversion = $fmasterversion;
dmorley's avatar
dmorley committed
216 217
  } elseif ($softwarename === 'redmatrix') {
    $masterversion = $hmasterversion;
David Morley's avatar
David Morley committed
218 219 220 221 222 223 224 225 226 227 228
  }
  $hidden = $score <= 70;
  _debug('Hidden', $hidden ? 'yes' : 'no');
  // lets cap the scores or you can go too high or too low to never be effected by them
  if ($score > 100) {
    $score = 100;
  } elseif ($score < 0) {
    $score = 0;
  }
  $weightedscore = ($uptime + $score + ($active_users_monthly / 19999) - ((10 - $weight) * .12));
  //sql it
noplanman's avatar
noplanman committed
229

David Morley's avatar
David Morley committed
230 231
  $timenow = date('Y-m-d H:i:s');
  $sql_set     = 'UPDATE pods SET secure = $2, hidden = $3, ip = $4, ipv6 = $5, monthsmonitored = $6, uptime_alltime = $7, status = $8, date_laststats = $9, date_updated = $10, responsetime = $11, score = $12, adminrating = $13, country = $14, city = $15, state = $16, lat = $17, long = $18, userrating = $19, shortversion = $20, masterversion = $21, signup = $22, total_users = $23, active_users_halfyear = $24, active_users_monthly = $25, local_posts = $26, name = $27, comment_counts = $28, service_facebook = $29, service_tumblr = $30, service_twitter = $31, service_wordpress = $32, weightedscore = $33, service_xmpp = $34, softwarename = $35, sslvalid = $36, uptime_custom = $37, dnssec = $38, sslexpire = $39 WHERE domain = $1';
dmorley's avatar
dmorley committed
232
  $result_set  = pg_query_params($dbh, $sql_set, [$domain, 1, (int) $hidden, $ip, (int) $ipv6, $months, $uptime, $status, $statslastdate, $timenow, $responsetime, $score, $admin_rating, $country, $city, $state, $lat, $long, $user_rating, $shortversion, $masterversion, (int) $signup, $total_users, $active_users_halfyear, $active_users_monthly, $local_posts, $name, $comment_counts, (int) $service_facebook, (int) $service_tumblr, (int) $service_twitter, (int) $service_wordpress, $weightedscore, (int) $service_xmpp, $softwarename, $outputsslerror, $uptime_custom, (int) $dnssec, $sslexpire]);
David Morley's avatar
David Morley committed
233 234 235
  $result_set || die('Error in SQL query3: ' . pg_last_error());

  _debug('Score out of 100', $score);
MatrixCrawler's avatar
MatrixCrawler committed
236

David Morley's avatar
David Morley committed
237
  echo 'Success';
dmorley's avatar
dmorley committed
238
  
David Morley's avatar
David Morley committed
239 240 241
  echo $newline;
  echo $newline;
}
242

David Morley's avatar
David Morley committed
243 244 245 246 247 248 249 250 251
/**
 * Output a debug message and variable value
 * 
 * @param string $label
 * @param mixed  $var
 * @param bool   $dump
 */
function _debug($label, $var = null, $dump = false) {
  global $debug, $newline;
252

David Morley's avatar
David Morley committed
253 254
  if (!$debug) {
    return;
dmorley's avatar
dmorley committed
255
  }
David Morley's avatar
David Morley committed
256 257 258 259 260 261 262 263 264 265
  
  if ($dump || is_array($var)) {
    $output = print_r($var, true); 
  } elseif (is_bool($var)) {
    $output = $var ? 'true' : 'false';
  } else {
    $output = (string) $var;
  }
  
  printf('%s: %s%s', $label, $output, $newline);
266
}