#!/usr/bin/perl -w use strict; use Frontier::Client; use Data::Dumper; use XML::RSS; use Date::Manip; my $HOST = 'xmlrpc.rhn.redhat.com'; my $startdate = ParseDate("30 days ago"); my $rss; my $client = new Frontier::Client(url => "https://$HOST/rpc/api"); #print "User to check ? "; #chomp(my $user = ); #print "Passwd to login with ? "; #chomp(my $pass = ); my $user = ""; my $pass = ""; my @channelList = ( 'rhel-i386-as-4', 'rhel-i386-es-4', 'rhel-i386-ws-4', 'rhel-i386-as-3', 'rhel-i386-es-3', 'rhel-i386-ws-3', 'rhel-i386-as-4-extras', 'rhel-i386-as-3-extras', 'rh-i386-desktop-4', 'rhel-i386-desktop-3', 'redhat-advanced-server-i386', 'redhat-ent-linux-i386-es-2.1', 'redhat-ent-linux-i386-ws-2.1' ); my $session = $client->call('auth.login', $user, $pass); my $start_tag = "<"; my $end_tag = ">"; foreach (@channelList) { &processChannel($_); } sub processChannel($) { my $channel = shift; my $channelDetails = $client->call('channel.software.getDetails', $session, $channel); $rss = new XML::RSS (version => '2.0'); # Create rss channel for the software channel $rss->channel(title => $channelDetails->{channel_summary}, link => "http://rhn.redhat.com/", description => "", language => 'en', pubDate => localtime(time) ); my $errataList = $client->call('channel.software.list_errata', $session, $channel, $startdate); &processErrata($errataList); $rss->save($channel . ".rss"); } sub processErrata($) { my $errata = shift; for my $erratas (@$errata) { # get the details about each errata my $errataDetails = $client->call('errata.getDetails', $session, $erratas->{errata_advisory}); my $url = $erratas->{errata_advisory}; # URLs on RHN do not have :'s $url =~ s/\:/\-/; # format description properly $errataDetails->{errata_description} =~ s/\n/\<br\>/g; my $desc = createDescription($erratas, $errataDetails); # add the errata to the feed $rss->add_item(title => $errataDetails->{errata_synopsis}, description => $desc, link => "https://rhn.redhat.com/errata/$url.html", pubDate => UnixDate(ParseDate($errataDetails->{errata_update_date}),"%g") ); } } sub createDescription($) { my $errata = shift; my $details = shift; my $cves; my $bzs; my $bugzilla; my $bzDisc; my $description; my $url = $errata->{errata_advisory}; # Advisory URLs do not have :'s in them $url =~ s/\:/\-/; $description .= $start_tag . "a href=\"https://rhn.redhat.com/errata/$url.html\"" . $end_tag . $errata->{errata_advisory} . $start_tag . "/a" . $end_tag . $start_tag . "br" . $end_tag . $start_tag . "br" . $end_tag; $description .= $details->{errata_description} . "\n"; # add CVEs to the description $cves = $client->call('errata.listCves', $session, $errata->{errata_advisory}); if (@$cves > "0") { $description .= $start_tag . "br" . $end_tag . "\n\tCVEs (" . $start_tag . "a href=\"http://cve.mitre.org\"" . $end_tag . "cve.mitre.org" . $start_tag . "/a" . $end_tag . "):"; for my $cve (@$cves) { $description .= $start_tag . "a href=\"http://cve.mitre.org/cgi-bin/cvename.cgi?name=$cve\"" . $end_tag . "$cve" . $start_tag . "/a" . $end_tag . "\n"; } } # add BZs to the description $bzs = $client->call('errata.bugzillaFixes', $session, $errata->{errata_advisory}); if (keys %$bzs > "0") { $description .= $start_tag . "br" . $end_tag . "\n\tBugzillas (" . $start_tag . "a href=\"http://bugzilla.redhat.com/bugzilla\"" . $end_tag . "bugzilla.redhat.com" . $start_tag . "/a" . $end_tag . "):\n"; while ( ($bugzilla, $bzDisc) = each (%$bzs) ) { $description .= $start_tag . "a href=\"http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=$bugzilla\" title=\"$bzDisc\" " . $end_tag . "$bugzilla" . $start_tag . "/a" . $end_tag . "\n"; } } return $description; }