]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.8.x' of git@gitorious.org:laconica/dev into 0.8.x
authorEvan Prodromou <evan@controlyourself.ca>
Tue, 26 May 2009 21:28:12 +0000 (17:28 -0400)
committerEvan Prodromou <evan@controlyourself.ca>
Tue, 26 May 2009 21:28:12 +0000 (17:28 -0400)
13 files changed:
README
classes/Group_inbox.php [changed mode: 0755->0644]
classes/Group_member.php [changed mode: 0755->0644]
classes/Related_group.php [changed mode: 0755->0644]
classes/Status_network.php [changed mode: 0755->0644]
classes/User_group.php [changed mode: 0755->0644]
classes/laconica.ini
config.php.sample
db/laconica.sql
index.php
lib/common.php
lib/snapshot.php [new file with mode: 0644]
scripts/reportsnapshot.php [new file with mode: 0644]

diff --git a/README b/README
index 4f93829601e267c2a381cbdf6bc068008c295aea..9207f3e900ddfa8251d530ac44e8c7e782fc6b7c 100644 (file)
--- a/README
+++ b/README
@@ -1136,6 +1136,32 @@ welcome: nickname of a user account that sends welcome messages to new
 If either of these special user accounts are specified, the users should
 be created before the configuration is updated.
 
+snapshot
+--------
+
+The software will, by default, send statistical snapshots about the
+local installation to a stats server on the laconi.ca Web site. This
+data is used by the developers to prioritize development decisions. No
+identifying data about users or organizations is collected. The data
+is available to the public for review. Participating in this survey
+helps Laconica developers take your needs into account when updating
+the software.
+
+run: string indicating when to run the statistics. Values can be 'web'
+     (run occasionally at Web time), 'cron' (run from a cron script),
+     or 'never' (don't ever run). If you set it to 'cron', remember to
+     schedule the script to run on a regular basis.
+frequency: if run value is 'web', how often to report statistics.
+           Measured in Web hits; depends on how active your site is.
+           Default is 10000 -- that is, one report every 10000 Web hits,
+           on average.
+reporturl: URL to post statistics to. Defaults to Laconica developers'
+           report system, but if they go evil or disappear you may
+           need to update this to another value. Note: if you
+           don't want to report stats, it's much better to
+           set 'run' to 'never' than to set this value to something
+           nonsensical.
+
 Troubleshooting
 ===============
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 316923af023f9153bb5899a3a8e4ed66f987136d..92bbb35d4c1c4b27d09de5de1ba2827e311fedba 100644 (file)
@@ -46,6 +46,64 @@ modified = 384
 notice_id = K
 user_id = K
 
+[file]
+id = 129
+url = 2
+mimetype = 2
+size = 1
+title = 2
+date = 1
+protected = 1
+
+[file__keys]
+id = N
+
+[file_oembed]
+id = 129
+file_id = 1
+version = 2
+type = 2
+provider = 2
+provider_url = 2
+width = 1
+height = 1
+html = 34
+title = 2
+author_name = 2
+author_url = 2
+url = 2
+
+[file_oembed__keys]
+id = N
+
+[file_redirection]
+id = 129
+url = 2
+file_id = 1
+redirections = 1
+httpcode = 1
+
+[file_redirection__keys]
+id = N
+
+[file_thumbnail]
+id = 129
+file_id = 1
+url = 2
+width = 1
+height = 1
+
+[file_thumbnail__keys]
+id = N
+
+[file_to_post]
+id = 129
+file_id = 1
+post_id = 1
+
+[file_to_post__keys]
+id = N
+
 [foreign_link]
 user_id = 129
 foreign_id = 129
@@ -392,63 +450,3 @@ modified = 384
 [user_openid__keys]
 canonical = K
 display = U
-
-[file]
-id = 129
-url = 2
-mimetype = 2
-size = 1
-title = 2
-date = 1
-protected = 1
-
-[file__keys]
-id = N
-
-[file_oembed]
-id = 129
-file_id = 129
-version = 2
-type = 2
-provider = 2
-provider_url = 2
-width = 1
-height = 1
-html = 34
-title = 2
-author_name = 2
-author_url = 2
-url = 2
-
-[file_oembed__keys]
-id = N
-
-[file_redirection]
-id = 129
-url = 2
-file_id = 129
-redirections = 1
-httpcode = 1
-
-[file_redirection__keys]
-id = N
-
-[file_thumbnail]
-id = 129
-file_id = 129
-url = 2
-width = 1
-height = 1
-
-[file_thumbnail__keys]
-id = N
-
-[file_to_post]
-id = 129
-file_id = 129
-post_id = 129
-
-[file_to_post__keys]
-id = N
-
-
index 4f438dc5e179bbca9bf7bd71ca6864c7436b463b..282826a7fb075957c32098c8753e0c277d88c911 100644 (file)
@@ -206,3 +206,12 @@ $config['sphinx']['port'] = 3312;
 //        print "Error\n";
 //        exit(1);
 // }
+
+// How often to send snapshots; in # of web hits. Ideally,
+// try to do this once per month (that is, make this equal to number
+// of hits per month)
+// $config['snapshot']['frequency'] = 10000;
+// If you don't want to report statistics to the central server, uncomment.
+// $config['snapshot']['run'] = 'never';
+// If you want to report statistics in a cron job instead.
+// $config['snapshot']['run'] = 'cron';
index 344f0ff723e1dcc5b1a3dbd5a617596c3d35d34e..0b20bc172c2bdda55940fcdc82e97abad1f47064 100644 (file)
@@ -426,12 +426,12 @@ create table group_inbox (
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
 create table file (
-    id integer primary key auto_increment, 
-    url varchar(255), mimetype varchar(50), 
-    size integer, 
-    title varchar(255), 
-    date integer(11), 
-    protected integer(1), 
+    id integer primary key auto_increment,
+    url varchar(255), mimetype varchar(50),
+    size integer,
+    title varchar(255),
+    date integer(11),
+    protected integer(1),
 
     unique(url)
 ) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
@@ -447,40 +447,38 @@ create table file_oembed (
     height integer,
     html text,
     title varchar(255),
-    author_name varchar(50), 
-    author_url varchar(255), 
-    url varchar(255), 
+    author_name varchar(50),
+    author_url varchar(255),
+    url varchar(255),
 
     unique(file_id)
 ) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
 
 create table file_redirection (
-    id integer primary key auto_increment, 
-    url varchar(255), 
-    file_id integer, 
-    redirections integer, 
-    httpcode integer, 
+    id integer primary key auto_increment,
+    url varchar(255),
+    file_id integer,
+    redirections integer,
+    httpcode integer,
 
     unique(url)
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
 create table file_thumbnail (
-    id integer primary key auto_increment, 
-    file_id integer, 
-    url varchar(255), 
-    width integer, 
-    height integer, 
+    id integer primary key auto_increment,
+    file_id integer,
+    url varchar(255),
+    width integer,
+    height integer,
 
-    unique(file_id), 
+    unique(file_id),
     unique(url)
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
 create table file_to_post (
-    id integer primary key auto_increment, 
-    file_id integer, 
-    post_id integer, 
+    id integer primary key auto_increment,
+    file_id integer,
+    post_id integer,
 
     unique(file_id, post_id)
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
-
-
index c2972ec5fe0b7c5da12277bf40a78340e8d59702..4eff99dff5b67ec8607c8315816fce069f9a32ee 100644 (file)
--- a/index.php
+++ b/index.php
@@ -69,6 +69,8 @@ function main()
     }
     global $user, $action, $config;
 
+    Snapshot::check();
+    
     if (!_have_config()) {
         $msg = sprintf(_("No configuration file found. Try running ".
                          "the installation program first."));
index 3feba1d8bd95dd845045ac506ca700f722097268..0ce46442deb99e3d928aed6bfa16c96b1a488401 100644 (file)
@@ -159,6 +159,10 @@ $config =
         'newuser' =>
         array('subscribe' => null,
               'welcome' => null),
+        'snapshot' =>
+        array('run' => 'web',
+              'frequency' => 10000,
+              'reporturl' => 'http://laconi.ca/stats/report'),
         );
 
 $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options');
diff --git a/lib/snapshot.php b/lib/snapshot.php
new file mode 100644 (file)
index 0000000..4b05b50
--- /dev/null
@@ -0,0 +1,227 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * A snapshot of site stats that can report itself to headquarters
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * 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.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * A snapshot of site stats that can report itself to headquarters
+ *
+ * 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.)
+ *
+ * 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>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://laconi.ca/
+ *
+ */
+
+class Snapshot
+{
+    var $stats = null;
+
+    /**
+     * Constructor for a snapshot
+     */
+
+    function __construct()
+    {
+    }
+
+    /**
+     * 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':
+            // skip if we're not running on the Web.
+            if (!isset($_SERVER) || !array_key_exists('REQUEST_METHOD', $_SERVER)) {
+                break;
+            }
+            // Run once every frequency hits
+            // XXX: do frequency by time (once a week, etc.) rather than
+            // hits
+            if (rand() % common_config('snapshot', 'frequency') == 0) {
+                $snapshot = new Snapshot();
+                $snapshot->take();
+                $snapshot->report();
+            }
+            break;
+        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();
+            $snapshot->take();
+            common_log(LOG_INFO, count($snapshot->stats) . " statistics being uploaded.");
+            $snapshot->report();
+
+            break;
+        case 'never':
+            break;
+        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']    = LACONICA_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
+
+        $postdata = http_build_query($this->stats);
+
+        $opts =
+          array('http' =>
+                array(
+                      'method'  => 'POST',
+                      'header'  => 'Content-type: '.
+                                   'application/x-www-form-urlencoded',
+                      'content' => $postdata,
+                      'user_agent' => 'Laconica/'.LACONICA_VERSION
+                      )
+                );
+
+        $context = stream_context_create($opts);
+
+        $reporturl = common_config('snapshot', 'reporturl');
+
+        $result = @file_get_contents($reporturl, false, $context);
+
+        return $result;
+    }
+
+    /**
+     * 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);
+    }
+}
diff --git a/scripts/reportsnapshot.php b/scripts/reportsnapshot.php
new file mode 100644 (file)
index 0000000..e332d85
--- /dev/null
@@ -0,0 +1,37 @@
+#!/usr/bin/env php
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2009, Control Yourself, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+# Abort if called from a web server
+if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
+    print "This script must be run from the command line\n";
+    exit(1);
+}
+
+ini_set("max_execution_time", "0");
+ini_set("max_input_time", "0");
+set_time_limit(0);
+mb_internal_encoding('UTF-8');
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+define('LACONICA', true);
+
+require_once(INSTALLDIR . '/lib/common.php');
+
+Snapshot::check();