1 #!/usr/bin/perl 2 #deps: pkg_add p5-libwww p5-XML-Simple p5-Net-DBus 3 4 #str2time 5 use HTTP::Date; 6 use LWP::Simple; 7 use XML::Simple; 8 #splitname 9 use OpenBSD::PackageName; 10 use Net::DBus; 11 use strict; 12 use warnings; 13 14 my $timeout=8000; 15 16 # exit if d-bus is not running 17 exit unless defined glob "/tmp/dbus-*"; 18 # make sure we find d-bus session bus from crontab 19 $ENV{'DBUS_SESSION_BUS_ADDRESS'}="unix:path=".glob "/tmp/dbus-*"; 20 $ENV{'DISPLAY'}=":0.0"; 21 my $dbus_session = Net::DBus->session; 22 my $notification_service = $dbus_session->get_service('org.freedesktop.Notifications'); 23 my $notification_obj = $notification_service->get_object('/org/freedesktop/Notifications', 'org.freedesktop.Notifications'); 24 25 # get latest read package in previous rss 26 my $latest; 27 my $file ='/var/tmp/update-notifier'; 28 if (open (FH,'<', $file)) 29 {$latest = <FH> ; chomp $latest} 30 else 31 {$latest = 0} 32 close (FH); 33 34 # get data with LWP 35 my $xml = XML::Simple->new(SuppressEmpty => 1); 36 my $url="http://openports.se/rss/all"; 37 my $page = get($url); 38 exit unless defined $page; 39 40 # get XML from data 41 my $result = $xml->XMLin($page); 42 43 my (@updated, @new, @removed); 44 my ($body, $title) = ("",""); 45 my $item; 46 my $str; 47 48 # loop/parse 49 foreach $item (@{$result->{channel}->{'item'}}) 50 { 51 last if (str2time($item->{'dc:date'}) <= $latest); 52 # print "cur:".$item->{title}."\n"; 53 if ($item->{title} =~ /Updated, (.*) to (.*)/) 54 { 55 # get pkg name 56 my ($pkg, $ver) = OpenBSD::PackageName::splitname($1); 57 my (undef, $newver) = OpenBSD::PackageName::splitname($2); 58 $str = "<a href='$item->{link}'><i>$pkg</i></a><b> ($ver->$newver)</b>"; 59 $str .= ":$item->{description}" if ($item->{description}); 60 push @updated, $str; 61 } 62 elsif ($item->{title} =~ /Removed, (.*)/) 63 { 64 my $pkg = OpenBSD::PackageName::splitname($1); 65 $str = "<a href='$item->{link}'><i>$pkg</i></a>"; 66 $str .= ":$item->{description}" if ($item->{description}); 67 push @removed, $str; 68 } 69 elsif ($item->{title} =~ /New package, (.*)/) 70 { 71 my ($pkg, $ver) = OpenBSD::PackageName::splitname($1); 72 $str = "<a href='$item->{link}'><i>$pkg</i></a><b> $ver</b>"; 73 $str .= ":$item->{description}" if ($item->{description}); 74 push @new, $str; 75 } 76 } 77 78 # write last read package 79 open (FH, ">", $file) or die "can't open $file for writing: $!"; 80 print FH str2time($result->{channel}->{item}->[0]->{'dc:date'})."\n"; 81 close (FH); 82 83 # create title and body 84 $title=""; 85 if ($#updated > 0) 86 { 87 $title.= "$#updated updated"; 88 $body.="<b>Updated:\n</b>"; 89 $body.="$_\n" foreach @updated; 90 } 91 92 if ($#new > 0) 93 { 94 $title.=", " if ($title ne ""); 95 $title.= "$#new new"; 96 $body.="\n<b>New:</b>\n"; 97 $body.="$_\n" foreach @new; 98 } 99 100 if ($#removed > 0) 101 { 102 $title.=", " if ($title ne ""); 103 $title.= "$#removed removed"; 104 $body.="\n<b>Removed:</b>\n"; 105 $body.="$_\n\t" foreach @removed; 106 } 107 $title.="."; 108 109 #print "title=$title\n\n"; 110 #print "body=$body\n\n"; 111 # send notification 112 #exec "/usr/local/bin/notify-send" ,"--expire-time=$timeout", "--icon=system-software-update", "$title", "$body" unless ($title eq "."); 113 $notification_obj->Notify($ARGV[0], 0, 'system-software-update', $title, $body, undef, undef, $timeout) unless ($title eq ".");