]> pd.if.org Git - newsd/commitdiff
Added program to set up an outgoing newsfeed.
authorNathan Wagner <nw@hydaspes.if.org>
Fri, 28 Sep 2012 19:05:44 +0000 (19:05 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Fri, 28 Sep 2012 19:05:44 +0000 (19:05 +0000)
feed [new file with mode: 0755]

diff --git a/feed b/feed
new file mode 100755 (executable)
index 0000000..bae65b1
--- /dev/null
+++ b/feed
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use DBI;
+
+my $dsn = $ENV{'DBI_DSN'};
+$dsn = 'dbi:Pg:dbname=news' unless defined $dsn;
+
+my $db = DBI->connect($dsn,'','',{AutoCommit => 0,RaiseError=>1});
+
+die unless $db;
+
+$db->do("set CLIENT_ENCODING to 'SQL_ASCII'");
+
+
+sub wildmat_to_re {
+        my ($wildmat) = @_;
+
+        $wildmat =~ s/\./\\\./g;
+        $wildmat =~ s/\?/\./g;
+        $wildmat =~ s/\*/\.\*/g;
+        return $wildmat;
+}
+
+sub wildmat {
+        my ($wildmat) = @_;
+
+        my @pats = split(/,/,$wildmat); # TODO look for escaped commas
+
+        my $sql = '';
+        # TODO special case '*' since it always matches
+
+        while ($pats[0] =~ /^!/) { shift @pats } # init neg can't match
+
+       my $negated;
+        foreach (@pats) {
+                $negated = s/^!//;
+                my $like = wildmat_to_re($_);
+               if (!$negated) {
+                       $sql .= '|' . $like;
+               } else {
+                       $sql =~ s/^\|//;
+                       $sql = "(^(?!$like)($sql)\$)";
+               }
+        }
+       $sql =~ s/^\|//;
+       $sql = "^($sql)\$" unless $negated;
+        return $sql;
+}
+
+my ($peer, $feed, $port) = @ARGV;
+
+$feed = '*,!control,!junk' unless $feed;
+my $feedre = wildmat($feed);
+
+my $add = $db->prepare('insert into feeds (name) values (?)');
+my $setport = $db->prepare('update feeds set port = ? where name = ?');
+my $setfeed = $db->prepare('update feeds set wildmat = ?, wildmatre = ? where name = ?');
+my $exists = $db->prepare('select * from feeds where name = ?');
+
+$exists->execute($peer);
+
+if (!$exists->fetchrow_array) {
+       $add->execute($peer);
+};
+
+$setport->execute($port,$peer) if $port;
+$setfeed->execute($feed,$feedre,$peer) if $feed;
+
+$db->commit;
+$db->disconnect;
+
+__END__
+
+create table feeds (
+        host    text primary key, -- TODO just make this a url? mailto:
+        port    integer default 119,
+        enabled boolean not null default true,
+        stream  boolean not null default false, -- use CHECK/TAKETHIS
+        groups  text default '*', -- wildmat
+        wildmat text default '*',
+        wildmatre       text default '.', -- parsed wildmat
+        noxposts        text,
+        noxpostsre      text,
+        distribution    text,
+        distributionre  text,
+        -- TODO feed moderated/unmoderated
+        -- see http://www.faqs.org/docs/linux_network/x18341.html
+        maxsize integer, -- maximum article size to feed
+        localonly       boolean default false,
+        path    text, -- regular expression default host?
+        frequency       interval default '1 hour'::interval, -- int secs?
+        feedtime        timestamp
+
+);
+