pull.php 11 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
$dmasterversion = preg_match('/number:.*"(.*)"/', $outputmv, $version) ? $version[1] : '';
David Morley's avatar
David Morley committed
20
_debug('Diaspora Masterversion', $dmasterversion);
dmorley's avatar
dmorley committed
21

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

dmorley's avatar
dmorley committed
32 33 34 35 36 37 38
//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
39
$hmasterversion = preg_match('/define.*\'STD_VERSION\'.*\'(.*)\'/', $outputmv, $version) ? $version[1] : '' ;
dmorley's avatar
dmorley committed
40 41
_debug('Hubzilla Masterversion: ' . $hmasterversion);

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

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

David Morley's avatar
David Morley committed
57 58 59 60 61 62 63 64 65
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());
66

David Morley's avatar
David Morley committed
67
  _debug('Domain', $domain);
noplanman's avatar
noplanman committed
68

David Morley's avatar
David Morley committed
69 70 71 72 73 74 75
  $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'];
76
    }
David Morley's avatar
David Morley committed
77 78 79
  }
  $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
80

David Morley's avatar
David Morley committed
81 82 83
  if ($admindb == -1) {
    $admin_rating = -1;
  }
84

David Morley's avatar
David Morley committed
85 86 87 88 89 90 91 92 93
  $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);
94
  $ttl            = curl_getinfo($chss, CURLINFO_CONNECT_TIME);
dmorley's avatar
dmorley committed
95
  $sslexpire      = $info[0]['Expire date'] ?? null;
David Morley's avatar
David Morley committed
96
  curl_close($chss);
97

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

dmorley's avatar
dmorley committed
106
  if (!$jsonssl) {    
dmorley's avatar
dmorley committed
107
    _debug('Connection', 'Can not connect to pod');
David Morley's avatar
David Morley committed
108

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

David Morley's avatar
David Morley committed
114
  if ($jsonssl !== null) {
115
    $sql_checks    = 'INSERT INTO checks (domain, online, ttl) VALUES ($1, $2, $3)';
dmorley's avatar
dmorley committed
116
    $result_checks = pg_query_params($dbh, $sql_checks, [$domain, 1, $ttl]);
dmorley's avatar
dmorley committed
117
    $result_checks || die('Error in SQL query: ' . pg_last_error());
dmorley's avatar
dmorley committed
118 119
    
    (!$jsonssl->software->version) || $score += 1;
David Morley's avatar
David Morley committed
120 121 122 123
    $xdver        = $jsonssl->software->version ?? 0;
    $dverr        = explode('-', trim($xdver));
    $shortversion = $dverr[0];
    _debug('Version code', $shortversion);
dmorley's avatar
dmorley committed
124
    $signup                = ($jsonssl->openRegistrations === true);
David Morley's avatar
David Morley committed
125 126 127 128 129 130 131 132 133 134 135
    $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
136
    $service_xmpp          = $jsonssl->metadata->xmppChat === true ?? false;
David Morley's avatar
David Morley committed
137 138 139 140 141 142 143
  } else {
    $score -= 1;
    $dver         = '.connect error';
    $shortversion = 0;
  }

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

  $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_RETURNTRANSFER, 1);
  curl_setopt($ping, CURLOPT_CONNECTTIMEOUT, 8);
  $uptr = json_decode(curl_exec($ping));
  curl_close($ping);
  _debug('Uptime Robot', $uptr, true);
dmorley's avatar
dmorley committed
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
  
  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
202
  }
noplanman's avatar
noplanman committed
203

David Morley's avatar
David Morley committed
204 205 206 207
  if ($softwarename === 'diaspora') {
    $masterversion = $dmasterversion;
  } elseif ($softwarename === 'friendica') {
    $masterversion = $fmasterversion;
dmorley's avatar
dmorley committed
208 209
  } elseif ($softwarename === 'redmatrix') {
    $masterversion = $hmasterversion;
David Morley's avatar
David Morley committed
210 211 212 213 214 215 216 217 218 219 220
  }
  $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
221

David Morley's avatar
David Morley committed
222 223
  $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
224
  $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
225 226 227
  $result_set || die('Error in SQL query3: ' . pg_last_error());

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

David Morley's avatar
David Morley committed
229
  echo 'Success';
dmorley's avatar
dmorley committed
230
  
David Morley's avatar
David Morley committed
231 232 233
  echo $newline;
  echo $newline;
}
234

David Morley's avatar
David Morley committed
235 236 237 238 239 240 241 242 243
/**
 * 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;
244

David Morley's avatar
David Morley committed
245 246
  if (!$debug) {
    return;
dmorley's avatar
dmorley committed
247
  }
David Morley's avatar
David Morley committed
248 249 250 251 252 253 254 255 256 257
  
  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);
258
}