script to renew websub subscriptions v0.2.0
authorChristian Weiske <cweiske@cweiske.de>
Fri, 25 Nov 2016 06:54:49 +0000 (07:54 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Fri, 25 Nov 2016 06:56:16 +0000 (07:56 +0100)
README.rst
bin/renew-subscriptions.php [new file with mode: 0755]
bin/subscribe.php
src/phinde/Subscriptions.php

index e34cd15..1008361 100644 (file)
@@ -30,6 +30,7 @@ Features
   - or use the ``site`` GET parameter:
     ``/?q=foo&site=example.org/dir``
 - OpenSearch support with HTML and Atom result lists
+* Instant indexing with WebSub (formerly PubSubHubbub)
 
 
 ============
@@ -42,6 +43,16 @@ Dependencies
 - Net_URL2
 
 
+=====
+Setup
+=====
+This section is incomplete.
+
+Cron job
+========
+Run ``bin/renew-subscriptions.php`` once a day with cron.
+
+
 ============
 About phinde
 ============
diff --git a/bin/renew-subscriptions.php b/bin/renew-subscriptions.php
new file mode 100755 (executable)
index 0000000..16bc11b
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/env php
+<?php
+namespace phinde;
+/**
+ * Renew subscriptions
+ * Call this once a day with cron.
+ */
+require_once __DIR__ . '/../src/init.php';
+
+chdir(__DIR__);
+$subDb = new Subscriptions();
+foreach ($subDb->getExpiring() as $sub) {
+    Log::info('Expires soon: ' . $sub['sub_topic']);
+    passthru('./subscribe.php ' . escapeshellarg($sub['sub_topic']));
+}
+?>
index 768ee10..411fa86 100755 (executable)
@@ -43,12 +43,16 @@ if ($topic != $url) {
 }
 
 $sub = $subDb->get($topic);
-if ($sub !== false) {
-    Log::error('Topic exists already in subscription table');
-    Log::info('Current status: ' . $sub->sub_status);
-    exit(3);
+if ($sub === false) {
+    $subDb->create($topic);
+} else {
+    Log::info(
+        'Topic exists already in subscription table with status '
+        . $sub->sub_status
+    );
+    Log::info('Renewing subscription...');
+    $subDb->renew($sub->sub_id);
 }
-$subDb->create($topic);
 $sub = $subDb->get($topic);
 
 $callbackUrl = $GLOBALS['phinde']['baseurl'] . 'push-subscription.php'
index 5aac9b2..87119c8 100644 (file)
@@ -60,6 +60,23 @@ class Subscriptions
     }
 
     /**
+     * Get all topics that either expired or expire soon
+     *
+     * @return \PDOStatement Result iterator
+     */
+    public function getExpiring()
+    {
+        $stmt = $this->db->prepare(
+            'SELECT * FROM subscriptions'
+            . ' WHERE sub_status IN ("active", "expired")'
+            . ' AND DATEDIFF(sub_expires, NOW()) <= 2'
+        );
+        $stmt->execute();
+
+        return $stmt;
+    }
+
+    /**
      * Create a new subscription entry in database.
      * Automatically generates secret, capkey and lease seconds.
      *
@@ -95,6 +112,23 @@ class Subscriptions
     }
 
     /**
+     * Renew a subscription: Set its status to "subscribing"
+     *
+     * @param integer $subId Subscription ID
+     *
+     * @return void
+     */
+    public function renew($subId)
+    {
+        $this->db->prepare(
+            'UPDATE subscriptions'
+            . ' SET sub_status  = "subscribing"'
+            . '   , sub_updated = NOW()'
+            . ' WHERE sub_id = :id'
+        )->execute([':id' => $subId]);
+    }
+
+    /**
      * A subscription has been confirmed by the hub - mark it as active.
      *
      * @param integer $subId        Subscription ID
@@ -137,6 +171,14 @@ class Subscriptions
         )->execute([':id' => $subId]);
     }
 
+    /**
+     * Subscription has been cancelled/denied for some reason
+     *
+     * @param integer $subId  Subscription ID
+     * @param string  $reason Cancellation reason
+     *
+     * @return void
+     */
     public function denied($subId, $reason)
     {
         $this->db->prepare(
@@ -148,6 +190,13 @@ class Subscriptions
         )->execute([':id' => $subId, ':reason' => $reason]);
     }
 
+    /**
+     * Topic update notification has been received
+     *
+     * @param integer $subId  Subscription ID
+     *
+     * @return void
+     */
     public function pinged($subId)
     {
         $this->db->prepare(