]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/snapshot.php
Merge branch '0.9.x' of git://gitorious.org/statusnet/mainline into 0.9.x
[quix0rs-gnu-social.git] / lib / snapshot.php
index 4f9bb3f62ec5834588f7ee7e9b75e5f6b19dfacd..2a10c6b9359d503dce7c7829f8d5aeff2c4b2f10 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Laconica, the distributed open-source microblogging tool
+ * StatusNet, the distributed open-source microblogging tool
  *
  * A snapshot of site stats that can report itself to headquarters
  *
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  * @category  Stats
- * @package   Laconica
- * @author    Evan Prodromou <evan@controlyourself.ca>
- * @copyright 2009 Control Yourself, Inc.
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2009 StatusNet, Inc.
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link      http://laconi.ca/
+ * @link      http://status.net/
  */
 
-if (!defined('LACONICA')) {
+if (!defined('STATUSNET') && !defined('LACONICA')) {
     exit(1);
 }
 
@@ -36,37 +36,45 @@ if (!defined('LACONICA')) {
  *
  * This class will collect statistics on the site and report them to
  * a statistics server of the admin's choice. (Default is the big one
- * at laconi.ca.)
+ * at status.net.)
  *
  * It can either be called from a cron job, or run occasionally by the
  * Web site.
  *
  * @category Stats
- * @package  Laconica
- * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link     http://laconi.ca/
+ * @link     http://status.net/
  *
  */
 
-class Snapshot {
+class Snapshot
+{
+    var $stats = null;
+
+    /**
+     * Constructor for a snapshot
+     */
 
     function __construct()
     {
     }
 
-    function take()
-    {
-    }
-
-    function report()
-    {
-    }
+    /**
+     * Static function for reporting statistics
+     *
+     * This function checks whether it should report statistics, based on
+     * the current configuation settings. If it should, it creates a new
+     * Snapshot object, takes a snapshot, and reports it to headquarters.
+     *
+     * @return void
+     */
 
     static function check()
     {
         switch (common_config('snapshot', 'run')) {
-         case 'web':
+        case 'web':
             // skip if we're not running on the Web.
             if (!isset($_SERVER) || !array_key_exists('REQUEST_METHOD', $_SERVER)) {
                 break;
@@ -76,26 +84,127 @@ class Snapshot {
             // hits
             if (rand() % common_config('snapshot', 'frequency') == 0) {
                 $snapshot = new Snapshot();
-                if ($snapshot->take()) {
-                    $snapshot->report();
-                }
+                $snapshot->take();
+                $snapshot->report();
             }
             break;
-         case 'cron':
+        case 'cron':
             // skip if we're running on the Web
             if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
                 break;
             }
+            common_log(LOG_INFO, 'Running snapshot from cron job');
             // We're running from the command line; assume
+
             $snapshot = new Snapshot();
-            if ($snapshot->take()) {
-                $snapshot->report();
-            }
+            $snapshot->take();
+            common_log(LOG_INFO, count($snapshot->stats) . " statistics being uploaded.");
+            $snapshot->report();
+
             break;
-         case 'never':
+        case 'never':
             break;
-         default:
+        default:
             common_log(LOG_WARNING, "Unrecognized value for snapshot run config.");
         }
     }
+
+    /**
+     * Take a snapshot of the server
+     *
+     * Builds an array of statistical and configuration data based
+     * on the local database and config files. We avoid grabbing any
+     * information that could be personal or private.
+     *
+     * @return void
+     */
+
+    function take()
+    {
+        $this->stats = array();
+
+        // Some basic identification stuff
+
+        $this->stats['version']    = STATUSNET_VERSION;
+        $this->stats['phpversion'] = phpversion();
+        $this->stats['name']       = common_config('site', 'name');
+        $this->stats['root']       = common_root_url();
+
+        // non-identifying stats on various tables. Primary
+        // interest is size and rate of activity of service.
+
+        $tables = array('user',
+                        'notice',
+                        'subscription',
+                        'remote_profile',
+                        'user_group');
+
+        foreach ($tables as $table) {
+            $this->tableStats($table);
+        }
+
+        // stats on some important config options
+
+        $this->stats['theme']     = common_config('site', 'theme');
+        $this->stats['dbtype']    = common_config('db', 'type');
+        $this->stats['xmpp']      = common_config('xmpp', 'enabled');
+        $this->stats['inboxes']   = common_config('inboxes', 'enabled');
+        $this->stats['queue']     = common_config('queue', 'enabled');
+        $this->stats['license']   = common_config('license', 'url');
+        $this->stats['fancy']     = common_config('site', 'fancy');
+        $this->stats['private']   = common_config('site', 'private');
+        $this->stats['closed']    = common_config('site', 'closed');
+        $this->stats['memcached'] = common_config('memcached', 'enabled');
+        $this->stats['language']  = common_config('site', 'language');
+        $this->stats['timezone']  = common_config('site', 'timezone');
+
+    }
+
+    /**
+     * Reports statistics to headquarters
+     *
+     * Posts statistics to a reporting server.
+     *
+     * @return void
+     */
+
+    function report()
+    {
+        // XXX: Use OICU2 and OAuth to make authorized requests
+
+        $reporturl = common_config('snapshot', 'reporturl');
+        $request = HTTPClient::start();
+        $request->post($reporturl, null, $this->stats);
+    }
+
+    /**
+     * Updates statistics for a single table
+     *
+     * Determines the size of a table and its oldest and newest rows.
+     * Goal here is to see how active a site is. Note that it
+     * fills up the instance stats variable.
+     *
+     * @param string $table name of table to check
+     *
+     * @return void
+     */
+
+    function tableStats($table)
+    {
+        $inst = DB_DataObject::factory($table);
+
+        $inst->selectAdd();
+        $inst->selectAdd('count(*) as cnt, '.
+                         'min(created) as first, '.
+                         'max(created) as last');
+
+        if ($inst->find(true)) {
+            $this->stats[$table.'count'] = $inst->cnt;
+            $this->stats[$table.'first'] = $inst->first;
+            $this->stats[$table.'last']  = $inst->last;
+        }
+
+        $inst->free();
+        unset($inst);
+    }
 }