index : archweb32 | |
Archlinux32 website | gitolite user |
summaryrefslogtreecommitdiff |
author | Erich Eckner <git@eckner.net> | 2019-05-22 13:07:33 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2019-05-22 13:07:33 +0200 |
commit | a81b7c142b680d5d5526a6e4c1865dcad245600f (patch) | |
tree | 70b862cfebcd92a5289bf2efadbdcd3561207b05 /feeds.php | |
parent | 862c6228c1d4e167aff65ab5bbb6ec78b99f173e (diff) |
-rw-r--r-- | feeds.php | 490 |
diff --git a/feeds.php b/feeds.php new file mode 100644 index 0000000..70320e9 --- /dev/null +++ b/feeds.php @@ -0,0 +1,490 @@ +<?php + +require_once "init.php"; + +require_once BASE . "/lib/mysql.php"; + +$uri_parts = explode('/', $_SERVER['REQUEST_URI']); + +if ($uri_parts[0] != '' || $uri_parts[1] != 'feeds') + throw_http_error(422, 'Unprocessable Entity'); + +$last = array_pop($uri_parts); +if ($last != '') + array_push($uri_parts, $last); + +array_splice( + $uri_parts, + 0, 2 +); + +if (count($uri_parts) == 0) { // index page + + require_once BASE . "/lib/style.php"; + require_once BASE . "/lib/format.php"; + + print_header("RSS - Feeds"); + + $result = mysql_run_query( + "SELECT DISTINCT `architectures`.`name` FROM `architectures`" . + mysql_join_architectures_repositories() . + " WHERE `repositories`.`is_on_master_mirror`" . + " ORDER BY `name`" + ); + $archs = array(); + while ($row = $result -> fetch_assoc()) + $archs[$row['name']] = $row['name'] . '/'; + + $print_archs = array_merge( + array( + '' => '', + 'All Arches' => 'all/' + ), + $archs + ); + + $result = mysql_run_query( + "SELECT DISTINCT `repositories`.`name` FROM `repositories` WHERE `repositories`.`is_on_master_mirror` ORDER BY `name`" + ); + $repos = array(); + while ($row = $result -> fetch_assoc()) + $repos[$row['name']] = $row['name'] . '/'; + + $print_repos = array_merge( + array( + 'All Repos' => '' + ), + $repos + ); + + $bugtracker_projects = array( + 0 => 'All Projects', + 1 => 'Arch Linux 32' + ); + + $bugtracker_operations = array( + 'Opened' => '', + 'Edited' => 'topic=edit&', + 'Closed' => 'topic=clo&' + ); + + function print_arches_header() { + global $print_archs; + foreach ($print_archs as $arch => $dummy) { + print " <th>\n"; + print " " . $arch . "\n"; + print " </th>\n"; + }; + } + + function print_feeds($prefix) { + global $print_archs; + global $print_repos; + foreach ($print_repos as $repo => $dummy) { + print " <tr>\n"; + print " <td>\n"; + print " <strong>" . $repo . "</strong>\n"; + print " </td>\n"; + foreach ($print_archs as $arch => $dummy) { + if ($arch == '') + continue; + print " <td>\n"; + print " <a href=\"/feeds/packages/" . $prefix . $print_archs[$arch] . $print_repos[$repo] . "\" class=\"rss\">Feed</a>\n"; + print " </td>\n"; + } + print " </tr>\n"; + } + } + + function print_feeds_table($prefix) { + print " <table class=\"pretty2\">\n"; + print " <thead>\n"; + print " <tr>\n"; + print_arches_header(); + print " </tr>\n"; + print " </thead>\n"; + print " <tbody>\n"; + print_feeds($prefix); + print " </tbody>\n"; + print " </table>\n"; + } + + ?> + <div id="rss-feeds" class="box"> + <h2> + RSS Feeds + </h2> + <p> + Several RSS feeds are available for consumption from the Arch32 website. + The majority of these are package-related and allow feeds to be customized for the updates you care about. + </p> + <h3> + News Feed + </h3> + <p> + Grab the + <a href="https://news.archlinux32.org/rss.php" class="rss" title="Arch Linux news feed">news item feed</a> + to keep up-to-date with the latest news from the Arch Linux development staff. + </p> + <h3> + Package Feeds + </h3> + <p> + If you are interested in + <a href="/feeds/packages/" class="rss" title="Arch Linux 32 package updates feed">all package updates</a>, + then grab this feed. + <?php + + print_feeds_table(''); + + ?> + <p> + <s>Recently added packages.</s> (to be implemented) + </p> + <?php + + // print_feeds_table('added/'); + + ?> + <p> + <s>Recently removed packages.</s> (to be implemented) + </p> + <?php + + // print_feeds_table('removed/'); + + ?> + <h3> + Release Feed + </h3> + <p> + Grab the + <a href="/feeds/releases/" class="rss" title="Arch Linux release feed">ISO release feed</a> + if you want to help seed the ISO release torrents as they come out. + </p> + <h3> + Development Feeds + </h3> + <p> + Subscribe to any of the following to track bug tickets and feature requests from the + <a href="https://bugs.archlinux32.org/" title="Arch Linux 32 Bugs">Arch Linux 32 Bugtracker</a>: + </p> + <table class="pretty2"> + <thead> + <tr> + <th> + Project + </th> + <?php + + foreach ($bugtracker_operations as $label => $dummy) { + print " <th>\n"; + print " Recently " . $label . " Tasks\n"; + print " </th>\n"; + } + + ?> + </tr> + </thead> + <tbody> + <?php + + foreach ($bugtracker_projects as $id => $project) { + print " <tr>\n"; + print " <td>\n"; + print " " . $project . "\n"; + print " </td>\n"; + foreach ($bugtracker_operations as $label => $option) { + print " <td>\n"; + print " <a href=\"https://bugs.archlinux.org/feed.php?feed_type=rss2&" . $option . "project=" . $id . "\" class=\"rss\">Feed</a>\n"; + print " </td>\n"; + } + print " </tr>\n"; + } + + ?> + </tbody> + </table> + </div> + <?php + + print_footer(); + + die(); + +} // index page + +if ($uri_parts[0] == 'releases') { + if (count($uri_parts) != 1) + throw_http_error(501, "Not Implemented", '/feeds/' . implode('/',$uri_parts)); + $available_isos = apcu_fetch('available_isos', $apcu_success); + if ($apcu_success == false || true) { + $ch = curl_init("https://mirror.archlinux32.org/archisos/"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $listing = curl_exec($ch); + curl_close($ch); + preg_match_all( + ',<a href="(archlinux-([0-9]{4}\.[0-9]{2}\.[0-9]{2})-([^.]+)\.iso)">\1</a>\s+(\S+)\s+\S+\s+([0-9]+)\s*\n,', + $listing, + $matches, + PREG_SET_ORDER + ); + $available_isos = array(); + foreach ($matches as $match) { + $available_isos[] = array( + 'file' => $match[1], + 'title' => $match[2] . '-' . $match[3], + 'build_date' => strtotime(str_replace('.', '-', $match[2])), + 'build_type' => $match[3], + 'release_date' => $match[4], + 'size' => $match[5] + ); + } + apcu_store('available_isos', $available_isos, 3600); + } + + header('Content-Type: application/rss+xml; charset=utf-8'); + print "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; + print "<rss version=\"2.0\">"; + print "<channel>"; + print "<title>"; + print "Arch Linux 32: Releases"; + print "</title>"; + print "<link>"; + print "https://www.archlinux32.org/download/"; + print "</link>"; + print "<description>"; + print "Release ISOs"; + print "</description>"; + print "<atom:link href=\"https://www.archlinux32.org/feeds/releases/\" rel=\"self\">"; + print "</atom:link>"; + print "<language>"; + print "en-us"; + print "</language>"; + print "<lastBuildDate>"; + print date('Y-m-d', $available_isos[0]['build_date']); + print "</lastBuildDate>"; + foreach ($available_isos as $available_iso) { + print "<item>"; + print "<title>"; + print $available_iso['title']; + print "</title>"; + // TODO: link to iso description (do we want that?) + print "<description>"; + print "</description>"; + print "<pubDate>"; + print date('Y-m-d', $available_iso['release_date']); + print "</pubDate>"; + // TODO: guid + print "<enclosure length=\""; + print date('Y-m-d', $available_iso['size']); + print "\" type=\"application/x-bittorrent\">"; + // TODO: url=\"https://www.archlinux32.org/iso/2019.02.01/archlinux-2019.02.01-x86_64.iso.torrent\">"; + print "</enclosure>"; + print "</item>"; + } + print "</channel>"; + print "</rss>"; + + die(); +} // releases + +if ($uri_parts[0] == 'packages') { + + array_splice( + $uri_parts, + 0, 1 + ); + +// TODO: implement "added" and "removed" - but how? +// $actions = array('' => '', 'added' => 'added', 'removed' => 'removed'); + $actions = array('' => ''); + $archs = array('all' => 'all'); + $result = mysql_run_query( + "SELECT DISTINCT `architectures`.`name` FROM `architectures`" . + mysql_join_architectures_repositories() . + " WHERE `repositories`.`is_on_master_mirror`" . + " ORDER BY `name`" + ); + while ($row = $result -> fetch_assoc()) + $archs[$row['name']] = $row['name']; + $repos = array('' => ''); + $result = mysql_run_query( + "SELECT DISTINCT `repositories`.`name` FROM `repositories` WHERE `repositories`.`is_on_master_mirror` ORDER BY `name`" + ); + while ($row = $result -> fetch_assoc()) + $repos[$row['name']] = $row['name']; + + if (count($uri_parts) > 0 && array_key_exists($uri_parts[0], $actions)) { + $action = $uri_parts[0]; + $action_filter = 'unimplemented'; + array_splice( + $uri_parts, + 0, 1 + ); + } + else { + $action = ''; + $action_filter = '`repositories`.`is_on_master_mirror`'; + } + + if (count($uri_parts) > 0) { + if (!array_key_exists($uri_parts[0], $archs)) + throw_http_error(501, "Not Implemented", implode('/',$uri_parts)); + $arch = $uri_parts[0]; + $arch_filter = ' AND `r_a`.`name`="' . $arch . '"'; + array_splice( + $uri_parts, + 0, 1 + ); + } + else { + $arch = ''; + $arch_filter = ''; + } + + if (count($uri_parts) > 0) { + if (!array_key_exists($uri_parts[0], $repos)) + throw_http_error(501, "Not Implemented", implode('/',$uri_parts)); + $repo = $uri_parts[0]; + $repo_filter = ' AND `repositories`.`name`="' . $repo . '"'; + array_splice( + $uri_parts, + 0, 1 + ); + } + else { + $repo = ''; + $repo_filter = ''; + } + + if (count($uri_parts) != 0) + throw_http_error(501, "Not Implemented", implode('/',$uri_parts)); + + $result = mysql_run_query( + "SELECT MAX(`build_assignments`.`return_date`) AS `max_build_date`" . + " FROM `build_assignments`" . + mysql_join_build_assignments_binary_packages() . + mysql_join_binary_packages_binary_packages_in_repositories() . + mysql_join_binary_packages_in_repositories_repositories() . + mysql_join_repositories_architectures("", "r_a") . + " WHERE " . $action_filter . $repo_filter . $arch_filter + ); + $max_build_date = $result -> fetch_assoc(); + $max_build_date = $max_build_date['max_build_date']; + + $result = mysql_run_query( + "SELECT `binary_packages`.`pkgname`," . + "`binary_packages`.`epoch`," . + "`binary_packages`.`pkgver`," . + "`binary_packages`.`pkgrel`," . + "`binary_packages`.`sub_pkgrel`," . + "`binary_packages`.`sub_pkgrel_omitted`," . + "`architectures`.`name` AS `architecture`," . + "`repositories`.`name` AS `repo`," . + "`r_a`.`name` AS `r_a`," . + "`binary_packages_in_repositories`.`last_moved`" . + " FROM `binary_packages`" . + mysql_join_binary_packages_binary_packages_in_repositories() . + mysql_join_binary_packages_in_repositories_repositories() . + mysql_join_repositories_architectures("", "r_a") . + mysql_join_binary_packages_architectures() . + " WHERE " . $action_filter . $repo_filter . $arch_filter . + " ORDER BY `binary_packages_in_repositories`.`last_moved` DESC" . + " LIMIT 50" + ); + $packages = array(); + while ($row = $result -> fetch_assoc()) + $packages[] = $row; + + header('Content-Type: application/rss+xml; charset=utf-8'); + + print "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; + print "<rss version=\"2.0\">"; + print "<channel>"; + print "<title>"; + print "Arch Linux 32: "; + switch ($action) { + case '': + print "Recent package updates"; + break; + case 'added': + print "Recent added packages"; + break; + case 'removes': + print "Recent removed packages"; + break; + } + if ($arch != 'all') + print " (" . $arch; + if ($repo != '') + print " [" . $repo . "]"; + if ($arch != '') + print ")"; + print "</title>"; + print "<link>"; + print "https://www.archlinux32.org/packages/"; + print "</link>"; + print "<description>"; + switch ($action) { + case '': + print "Recently updated packages in the Arch Linux 32 package repositories"; + break; + case 'added': + print "Recently added packages to the Arch Linux 32 package repositories"; + break; + case 'removes': + print "Recently removed packages from the Arch Linux 32 package repositories"; + break; + } + if ($arch != 'all') + print " for the '" . $arch . "' architecture (including 'any' packages)"; + else + print " for all architectures"; + if ($repo != '') + print " in the [" . $repo . "] repository"; + print "."; + print "</description>"; + print "<atom:link href=\"https://www.archlinux32.org" . $_SERVER['REQUEST_URI'] . "\" rel=\"self\">"; + print "</atom:link>"; + print "<language>"; + print "en-us"; + print "</language>"; + print "<lastBuildDate>"; + print $max_build_date; + print "</lastBuildDate>"; + foreach ($packages as $package) { + print "<item>"; + print "<title>"; + print $package['pkgname']; + if ($package['epoch'] != 0) + print $package['epoch'] . ":"; + print $package['pkgver'] . "-" . $package['pkgrel']; + if (!$package['sub_pkgrel_omitted']) + print '.' . $package['sub_pkgrel']; + print ' ' . $package['architecture']; + print "</title>"; + print "<link>"; + print "https://www.archlinux32.org/packages/" . $package['repo'] . "/" . $package['r_a'] . "/" . $package['pkgname'] . "/"; + print "</link>"; +// TODO: description + print "<pubDate>"; + print $package['last_moved']; + print "</pubDate>"; +// TODO: guid + print "<category>"; + print $package['repo']; + print "</category>"; + print "<category>"; + print $package['r_a']; + print "</category>"; + print "</item>"; + } + print "</channel>"; + print "</rss>"; + + die(); + +} // packages + +throw_http_error(501, "Not Implemented"); |