portdb: added uncommitted changes including cacher python rewrite

This should get the repo in sync with the last live versions of the
cacher and index on the previous crux.nu server.
This commit is contained in:
Matt Housh 2024-03-02 14:12:06 -06:00
parent 5b625116b0
commit 3cbee22952
Signed by: jaeger
GPG Key ID: F9DE89ED1BFADFD7
5 changed files with 774 additions and 591 deletions

View File

@ -1,13 +1,12 @@
create table ports (
id integer primary key,
portname varchar,
collection varchar
);
CREATE TABLE collections (
collid integer primary key,
collname varchar,
maintainer varchar,
colltype varchar,
url varchar,
pubkey varchar);
create table collections (
collid integer primary key,
collname varchar,
maintainer varchar,
colltype varchar,
url varchar
);
CREATE TABLE ports (
id integer primary key,
portname varchar,
collection varchar);

View File

@ -1,247 +0,0 @@
#!/usr/bin/php
<?php
require('DB.php');
# Collect port info from 3rd-party repositories into a sqlite database
# Written by Simone Rota <sip@crux.nu>
#
# Configuration #############################################################
#
# Collections: name|Maintainer <email>|type|url
# Supported types: httpup, rsync
$version = "3.2";
$collections = array (
"core|core-ports@crux.nu|rsync|crux.nu::ports/crux-".$version."/core/",
"opt|crux@crux.nu|rsync|crux.nu::ports/crux-".$version."/opt/",
"xorg|xorg-ports@crux.nu|rsync|crux.nu::ports/crux-".$version."/xorg/",
"compat-32|compat-32-ports@crux.nu|rsync|crux.nu::ports/crux-".$version."/compat-32/",
"contrib|crux@crux.nu|rsync|crux.nu::ports/crux-".$version."/contrib/",
#"kde|alan+crux@mizrahi.com.ve|rsync|crux.nu::ports/crux-2.5/kde/",
#"kde4|alan+crux@mizrahi.com.ve|rsync|crux.nu::ports/crux-3.0/kde4/",
"kde4|alan+crux@mizrahi.com.ve|rsync|crux.nu::ports/kde/kde4/",
"xfce|sepen@crux.nu|rsync|crux.nu::ports/crux-".$version."/xfce/",
"enlightenment|pitillo@ono.com|rsync|crux.nu::ports/crux-".$version."/enlightenment/",
"6c37|kori@openmailbox.org|httpup|https://raw.githubusercontent.com/6c37/crux-ports/3.2/", #Luiz De Milon
"6c37-git|kori@openmailbox.org|httpup|https://raw.githubusercontent.com/6c37/crux-ports-git/3.2/", # Luiz De Milon
"aba|abaumann@yahoo.com|httpup|http://www.andreasbaumann.cc/crux/ports/", #Andreas Baumann
"ako|alexko256@gmail.com|httpup|http://ports.ako.serveftp.org/", #Alex Kostrewa
"alan|alan+crux@mizrahi.com.ve|httpup|http://www.mizrahi.com.ve/crux/pkgs/",
"alexmat|alexmat@gmail.com|httpup|http://crux.nnto.net/", #Alexander Matviychuk
"alexta|oleksii.tkachuk@gmail.com|httpup|http://alexta.googlecode.com/git/", #Oleksii Tkachuk
"andrew|hello@andrewrose.co.uk|httpup|http://crux.andrewrose.co.uk/pkgs/", #Andrew Rose
"asie|kontakt@asie.pl|httpup|http://crux.asie.pl/", #Adrian Siekierka
"aubic|ales@hushmail.com|httpup|http://crux.org.pl/ports/aubic/",
"augustao|augustao@augustao.org|httpup|http://augustao.org/ports/", #Augusto Pereira
#"bashy|ronny.kornexl@t-online.de|httpup|http://ronny-kornexl.homepage.t-online.de/crux/ports/", #Ronny Kornexl
"baguette|cmburget@gmail.com|httpup|https://raw.githubusercontent.com/baguette/crux-ports/master/", #Cory Burgett
"bitpuffin|contact@bitpuffin.com|httpup|http://cruxports.bitpuffin.com/bitpuffin/", #Isak Andersson
"bdfy|jean@mosk.ru|httpup|http://bdfy.googlecode.com/svn/trunk/", #Ivan Rodionov
"captlloyd|captlloyd@gmail.com|httpup|http://lloyd.is.an.evil-genius.net/crux/ports/", #Justin W. Lloyd
"chw|chw@tks6.net|httpup|http://iacs.epfl.ch/~winkelma/crux_ports/", # Christoph Winkelmann
"cpmtw|wodachm@gmail.com|httpup|https://raw.githubusercontent.com/mwsoft69/cpmtw/master/", # Mitchell Wodach
"crshd|crshd@mail.com|httpup|http://crshd.users.anapnea.net/linux/crux/ports/", #Christian Brassat
"cruxab|abaranov.anton@gmail.com|httpup|http://cruxab.comlu.com/crux/ports/", #Anton Baranov
"cruxpl|sirmacik@crux.org.pl|httpup|http://sirmacik.net/static/download/cruxpl-ports/", # CRUX Poland (Marcin Karpezo)
"darthlukan|darthlukan@gmail.com|httpup|http://ports.brianctomlinson.com/", #Brian Tomlinson
"dbrooke|crux@dbrooke.me.uk|httpup|http://crux-ports.dbrooke.me.uk/", #David Brooke
"deepthought|erich@eckner.net|httpup|http://crux.eckner.net/", # Erich Eckner
"df|wyatt@prairieturtle.ca|httpup|http://home.cc.umanitoba.ca/~fonsecah/crux/ports/", # Daryl Fonseca-Holt (nthwyatt)
"dokpm0|Kevin@RawFedDogs.net|httpup|http://crux.RawFedDogs.net/", #Kevin Monceaux
"doom|dxm@openmailbox.org|httpup|https://raw.github.com/Doomicide/crux-ports/master/", #Maximilian Dietrich (doomicide)
"ecarux|kontakt@ecarux.de|httpup|http://ecarux.de/ports/", #Hannes Mayer
"emulators|nogagplz@gmail.com|httpup|http://crux.ster.zone/ports/emulators/", #Neville Phillips (responsible: Danny Rawlins)
"emulators-i686|crux@romster.me|httpup|http://crux.ster.zone/ports/emulators-i686/", #Danny Rawlins
"falcony|falcony@users.sourceforge.net|httpup|http://falcony.googlecode.com/svn/trunk/falcony/", #Maxim Falcony
"fho|holler_f@informatik.haw-hamburg.de|httpup|http://users.informatik.haw-hamburg.de/~holler_f/crux_ports/", # Fabian Holler
"fillo|fillo@fillo.me|httpup|http://fillo.pw/cruxports/", # Dimitry (fillo)
"flaveur|grim@asu.ntu-kpi.kiev.ua|httpup|http://flaveur.googlecode.com/svn/trunk/ports/", #Oleksiy Khilkevich
"f1y|dwanasciegroszy@o2.pl|httpup|http://pierwszeliceum.bedzin.pl:8080/~f1y/httpup/", #Bartosz Sobel
"haikob|haiko.brandes@stud.uni-goettingen.de|httpup|http://www.stud.uni-goettingen.de/~s462320/crux/",
"haskell|moritz+crux@wzff.de|rsync|rsync.wzff.de::crux-haskell/", #Moritz Wilhelmy's haskell collection
"hnc|bile@landofbile.com|httpup|http://www.landofbile.com/crux_ports/", #Antonio SJ Musumeci
"ix|arcetera@openmailbox.org|httpup|https://arcetera.moe/dl/3.2/", #Abraham Levine
"jaeger|jaeger@morpheus.net|rsync|morpheus.net::cruxports/", #Matt Housh
"jdolan|jasonthomasdolan@yahoo.com|httpup|http://jdolan.dyndns.org/jaydolan/ports/",
"joacim|joacim@joac.im|httpup|http://raw.github.com/joacimot/CRUX-Ports/master/", #Joacim Olsen Tangen
"joe9|joe9mail@gmail.com|httpup|http://crux.ster.zone/ports/joe9/", #Joe M
"jturner|james@calminferno.net|httpup|http://calminferno.net/crux/", #James Turner
"jue|jue@jue.li|httpup|http://jue.li/crux/ports/",
"juef|juef@openmailbox.org|httpup|http://chiselapp.com/user/juef/repository/crux-ports/doc/tip/", #Svyatoslav Mishyn
"j_v|jvogel4@stny.rr.com|httpup|http://stygian.me/crux/ports/", #John Vogel
"jw|jw@smts.ch|httpup|http://jw.smts.ch/files/crux/ports/",
"karpunix|sirmacik@gmail.com|httpup|http://download.sirmacik.lin4all.org/crux/ports/", # Marcin Karpezo
#"kori|kori@openmailbox.org|httpup|https://raw.github.com/kori/crux-ports/master/", #Kori Ayakashi
"kp4|vs@kp4.ru|httpup|http://crux.kp4.ru/", # Vitaly Sinilin
"kris|email@zero-io.net|httpup|https://raw.githubusercontent.com/krleh/ports/master/", # Kris Lehmann
"larryn|wawrzek@gmail.com|httpup|http://wawrzek.name/Crux/Ports/",
"lennart|devel@lennart.sauerbeck.org|rsync|code-monkey.de::lennarts-crux-ports/", #Lennart Sauerbeck
"leo-unglaub|leo@leo-unglaub.net|rsync|leo-unglaub.net::crux-ports-leo-unglaub/", # Leo Unglaub
"linoports|benemue@googlemail.com|rsync|karif.server-speed.net::linoports/", #Benedikt Muller
#"l00nix|l00nixcdoc@gmail.com|httpup|http://l00nix.com/repo/crux/", #Cody
"lxde|rotwang@crux.org.pl|httpup|http://crux.org.pl/ports/lxde/", #Bartlomeij Palmowski
"malster|clover@mail.nnov.ru|httpup|http://malster.nnov.ru/ports/",
"mason|msonderegger@aon.at|httpup|http://www.tip9ug.jp/who/dude/webdir/lunix/CRUX/", #Markus Sonderegger
"mechaniputer|beadleha@clarkson.edu|httpup|http://people.clarkson.edu/~beadleha/crux/ports/", #Herbert A. Beadle
"mhedenskog|mattias@hedenskog.se|httpup|http://magog.se/crux/",
"mike_attic|mike@openbunker.org|httpup|http://www.openbunker.org/crux/ports/mike_attic/", #Mikhail Kolesnik
"mike|mike@openbunker.org|httpup|http://openbunker.org/crux/ports/mike/", #Mikhail Kolesnik
"mikejsavage|mike@mikejsavage.co.uk|httpup|http://mikejsavage.co.uk/crux/", #Mike Savage
#"mono|nymacro@gmail.com|httpup|http://members.optusnet.com.au/dfmarks/crux/mono/",
#"mruiz|manuel.tienza@gmail.com|httpup|http://www.tienza.es/crux/ports/", #Manuel Tienza
#"namenlos|richard.poettler@gmail.com|httpup|http://www.sti2.at/~richardp/ports/", #Richard Poettler
"nexscrp|jkr@nex.scrapping.cc|httpup|http://nex.scrapping.cc/crux/ports/", #Jonas Kramer
"nwe|niklas@netsplit.nu|rsync|www.netsplit.nu::ports/", #Niklas Wennerstrand
"nilp|mytchel@openmailbox.org|httpup|http://raw.github.com/mytch444/crux-ports/master/", #Mytchel Hammond
"ninuzzo|ant@venus.deis.unical.it|httpup|http://monitor.deis.unical.it/ant/crux/",
"nipul|lucas@die.net.au|httpup|http://nipul.die.net.au/ports/", #Lucas Hazel
"nogagplz|nogagplz@gmail.com|httpup|http://crux.ster.zone/ports/nogagplz/", #Neville Phillips (responsible: Danny Rawlinks)
"nym|nymacro@gmail.com|httpup|http://members.optushome.com.au/dfmarks/crux/ports/",
#"omfgroflbboq|omfgroflbboq@spam4.me|httpup|https://github.com/omfgroflbbq/crux-ports/",
"patroclo7|patroclo7@gmail.com|httpup|http://www.patroclo7.org/crux/ports/patroclo7/", #Giorgio Lando
"pitillo|pitillo@ono.com|rsync|vjml.es::ports/pitillo/", #Victor Martinez
"pitman|mad.skipjack@mail.ru|httpup|http://raw.github.com/KonstantinLepa/crux-ports/master/", #Konstantin Lepa
"predatorfreak|predatorfreak@dcaf-security.org|httpup|http://www.dcaf-security.org/ports/", #Brett Andrew Goulder
"prologic|prologic@shortcircuit.net.au|httpup|http://crux.shortcircuit.net.au/", #James Mills
"qba|teoqba@gmail.com|httpup|http://escher.unige.ch/~qba/crux/ports/", #Kuba Kaminski
#"rehabdoll|fredrik@obra.se|rsync|obra.se::ports/", #Fredrik Rinnest
"rexich|bjorn@krstarica.com|httpup|http://crux.ster.zone/ports/rexich/", #Filip Rex Dimovski
"rho|rho@thinkingspot.ch|httpup|http://www.thinkingspot.ch/crux/ports/",
"rines|richard@nespithal.com|httpup|http://crux.richardnespithal.com/", #Richard Nespithal
"rk|crux@roeschu.ch|httpup|http://www.roeschu.ch/ports/crux/",
#"rmull|rmmullen@gmail.com|httpup|http://lug.bu.edu/mirror/crux/ports/", #Ryan Mullen
"roliveira|crux@roliveira.eu|httpup|http://roliveira.eu/crux/ports/", #Ricardo Oliveira
"romster|crux@romster.me|httpup|http://crux.ster.zone/ports/romster/", #Danny Rawlins
"rotwang|rotwang@crux.org.pl|httpup|http://crux.org.pl/ports/rotwang/", #Bartlomiej Palmowski
"rugek|rugek@btcl.de|httpup|http://rugek.dirtyhack.net/crux-ports/rugek/",
"sepen|sepen@crux.nu|rsync|init.it.cx::ports/current/sepen/", #Jose V Beneyto
"sgtmcd|sgtmcd@sgtmcd.com|httpup|http://crux.sgtmcd.com/ports/",
"shin|shin@sterneck.asia|httpup|http://ports.sterneck.asia/shin/", #Shin Sterneck
"singular|arbor@mail.ru|httpup|http://singular.ru/ports/",
"slapdash|dave-slapdash@weller-fahy.com|httpup|http://slapdash.caterva.org/", #David J. Weller-Fahy
"stdevel|webmaster@stankowic-development.net|httpup|http://crux.stankowic-development.net/", #Christian Stankowic
"strw|strawi@googlemail.com|httpup|http://www.gnoedi.org/~straw/crux/ports/",
"swhitton|spw@sdf.org|httpup|http://spw.sdf.org/crux/", #Sean Whitton
"syl|syl@clyl.net|rsync|rsync.clyl.net::crux/", # Pierre Chaussee
"t0b1nux|simonthoby@live.fr|httpup|https://git.framasoft.org/t0b1nux/crux-ports/raw/master/", # Simon Thoby
"tadzik|tadzikes@gmail.com|httpup|http://mhroczny.abuser.eu/~tadzik/ports/", #Tadeus Sosnierz (irc handle: tadzik)
"teatime|teatime@kyber.io|httpup|http://kyber.io/crux/ports/teatime/", #teatime@irc.kyber.io
"thenschel|thenschel@henschelsoft.de|httpup|http://www.henschelsoft.de/cruxports/",
"ticklestix|npardoe@ticklestix.co.uk|httpup|http://www.ticklestix.co.uk/crux/", #Nathan Pardoe
"tillb|tillbiedermann@yahoo.de|httpup|http://still2come.net/crux/ports/tillb/", #Till Biedermann
"tilman|tilman@code-monkey.de|rsync|code-monkey.de::tilmans-crux-ports/",
"timcow|timcowchip@gmail.com|httpup|https://bitbucket.org/timcowchip/crux-ports/raw/master/", #Chris Farrell
"tsubasa|nickp102@gmail.com|httpup|http://tsubasa.googlecode.com/svn/trunk/tsubasa/", #Sasha Chernyavsky
"uhlu|crux@uhlu.com|httpup|http://ports.uhlu.com/repository/",
"u7knv9h|u7knv9h@openmailbox.org|httpup|https://raw.githubusercontent.com/u7knv9h/CRUX-ports/master/", #F.Kiroles
"vico|vico@bicisport.de|httpup|http://vico.kleinplanet.de/files/repo/",
#"vni|younghead@ukr.net|httpup|http://vni.org.ua/crux/ports/vni/", #Vasylchyshyn Nikolay
"wawrzek|main@wawrzek.name|httpup|http://wawrzek.name/crux/repos/wawrzek/", # Wawrzek Niewodniczanski
"wildefyr|wildefur@gmail.com|httpup|http://wildefyr.net/ports/", # Wildefyr
"wzff|moritz+crux@wzff.de|rsync|rsync.wzff.de::crux-wzff/", #Moritz Wilhelmy
"xen|syl@clyl.net|rsync|rsync.clyl.net::crux-xen/", # Pierre Chaussee
#"yhafri|ycrux@club-internet.fr|httpup|http://perso.club-internet.fr/yhafri/crux/",
"z3bra|willy@mailoo.org|httpup|http://dl.z3bra.org/crux/v3.1/" #Willy Goiffon
);
$dsn = 'sqlite:////home/crux/public_html/local/portdb.db';
# End of configuration ######################################################
$db =& DB::connect($dsn);
if (DB::isError($db)) die("Cannot connect to database");
$db->setFetchMode(DB_FETCHMODE_ASSOC);
# Clean existing entries
$sql = "delete from ports";
$res = $db->simpleQuery($sql);
if (DB::isError($res)) die("Query error (delete)");
$sql = "delete from collections";
$res = $db->simpleQuery($sql);
if (DB::isError($res)) die("Query error (delete)");
$sql = "vacuum";
$res = $db->simpleQuery($sql);
if (DB::isError($res)) die("Query error (delete)");
foreach ($collections as $coll) {
$ports = getCollection($coll);
if ($ports !== FALSE) {
storeCollection($coll, $ports);
} else {
$fields = explode('|', $coll);
echo "Errors while retrieving collection ". $fields[0]."\n";
}
}
function getCollection($coll) {
$fields = explode('|', $coll);
switch ($fields[2]) {
case "httpup":
return getHttpupCollection($coll);
break;
case "rsync":
return getRsyncCollection($coll);
break;
default:
return FALSE;
}
}
function getRsyncCollection($coll) {
$ports = array();
$out = array();
$fields = explode('|', $coll);
$res = -1;
exec("/usr/bin/rsync --list-only $fields[3]", $out, $res);
if ($res !== 0)
return FALSE;
foreach ($out as $line) {
if ($line[0] == "d") {
$sp = explode(' ', $line);
$portname = $sp[count($sp)-1];
if ($portname != ".")
$ports[] = $portname;
}
}
if (count($ports)>0)
return $ports;
return FALSE;
}
function getHttpupCollection($coll){
$ports = array();
$fields = explode('|', $coll);
$lines = file($fields[3]."REPO");
if ($lines === FALSE)
return FALSE;
foreach ($lines as $line) {
if (substr($line, 0, 2) == "d:") {
$ports[] = trim(substr($line,2));
}
}
if (count($ports)>0)
return $ports;
return FALSE;
}
function storeCollection($coll, $ports) {
global $db;
$fields = explode('|', $coll);
foreach ($ports as $port) {
$vals = array($port, $fields[0]);
$sth = $db->prepare("insert into ports values (NULL, ?, ?)");
$res = $db->execute($sth, $vals);
if (DB::isError($res)) die("Query error (port)");
}
$vals = explode('|', $coll);
$sth = $db->prepare("insert into collections values (NULL, ?, ?, ?, ?)");
$res = $db->execute($sth, $vals);
if (DB::isError($res)) die("Query error (collection)");
}
?>

299
portdb/cacher/portdb-cacher Executable file
View File

@ -0,0 +1,299 @@
#!/usr/bin/env python
import sqlite3
import subprocess
import sys
import urllib2
# global config
## current CRUX version
cruxver = "3.7"
prevver = "3.6"
## list of collections/repos to process
collections = [
"core|core-ports@crux.nu|rsync|crux.nu::ports/crux-"+cruxver+"/core/|RWRZAkQEVz8SoR2Tu7Nhnv8Fm91/Y+HLWq7iUtixzM2w8Vv0BSkAXB8C",
"opt|crux@crux.nu|rsync|crux.nu::ports/crux-"+cruxver+"/opt/|RWSBCSYknENWgnHabtCJT/hAohKr9ThZ/vEZ94BgT9vFCsSFZhFZgkNr",
"xorg|xorg-ports@crux.nu|rsync|crux.nu::ports/crux-"+cruxver+"/xorg/|RWRQdQmOIOqwe2/ZZuTSoQgMPPWm1YA/9H0L/1El2OVhj3+I4DWhKSjT",
"compat-32|compat-32-ports@crux.nu|rsync|crux.nu::ports/crux-"+cruxver+"/compat-32/|RWSKBMspqKIXKe5Sh37BEyxSuX/z/nzMQF8Mz1hNCNBJwCGu6ec8VRiB",
"contrib|crux@crux.nu|rsync|crux.nu::ports/crux-"+cruxver+"/contrib/|RWRg1hKiTWvlRYugeIBZSkPrlcxcgubttUMVWEsWsLNwX9naXZOrQYDn",
#"kde|alan+crux@mizrahi.com.ve|rsync|crux.nu::ports/crux-2.5/kde/|",
#"kde4|alan+crux@mizrahi.com.ve|rsync|crux.nu::ports/crux-3.0/kde4/|",
"kde4|alan+crux@mizrahi.com.ve|rsync|crux.nu::ports/kde/kde4/|",
#"xfce|sepen@crux.nu|rsync|crux.nu::ports/crux-"+cruxver+"/xfce/|RWR9WyI0iV+A2OP8DddY8QAhMjCpFX1PzIbdYw5sUTJ+4eMVHcJM/5jf", -- no such file or directory on rsync side
#"enlightenment|pitillo@crux-arm.nu|rsync|crux.nu::ports/crux-"+cruxver+"/enlightenment/|", -- no such file or directory on rsync side
"mate|jaeger@crux.ninja|httpup|https://raw.githubusercontent.com/mhoush/crux-mate/main/|RWTDGCtBFHpiORWkbsRYt/bh/2xereFAhv2a086UAOUw0nFAkpWmMuqR",
"3vbo|evan@burkey.co|httpup|https://raw.githubusercontent.com/3vbo/crux-ports/master/|", # Evan Burkey
#"6c37|camille@airmail.cc|httpup|https://raw.githubusercontent.com/6c37/crux-ports/master/|RWSsZdBvSzGVpdlpq0xABUClYAs6Em8YjkN+Y2MsDmfLPfkWoZNV6tT/", # Camille Scholtz
#"6c37-git|camille@airmail.cc|httpup|https://raw.githubusercontent.com/6c37/crux-ports-git/master/|RWQY8eVY1sSPFcvu0Usix5bJ/p43CuKclq8PUdRGn/vaOZlSqYoW4d9U", # Camille Scholtz
#"6c37-dropin|camille@airmail.cc|httpup|https://raw.githubusercontent.com/6c37/crux-ports-dropin/master/|RWSuX4fY9S2pNgHmGcysTDf0/0PsKKnJdXu5hClFYAZmpsRP/KrRGLy0", # Camille Scholtz
#"aba|abaumann@yahoo.com|httpup|http://www.andreasbaumann.cc/crux/ports/|", #Andreas Baumann -- 404
#"ako|alexko256@gmail.com|httpup|http://ports.ako.serveftp.org/|", #Alex Kostrewa -- DNS failure
"ak|abdullah@abdullah.today|httpup|https://abdullah.today/ports/|RWTXRFvdpfLnEDINYSyXHnDeYOLMvE+iGHnPQ0Gbx2hgZR9Yhw7Zdjhi", # Abdullah Khan
"alan|alan+crux@mizrahi.com.ve|httpup|https://www.mizrahi.com.ve/crux/ports/|RWSHHtGdlW9unGuKcA4PJdgmwJYRTcWgwvUPPkt3DRhVSb5U90KGOFyy", # Alan Mizrahi
#"alexmat|alexmat@gmail.com|httpup|http://crux.nnto.net/|", #Alexander Matviychuk -- DNS failure
#"alexta|oleksii.tkachuk@gmail.com|httpup|http://alexta.googlecode.com/git/|", #Oleksii Tkachuk -- googlecode is no longer
#"andrew|hello@andrewrose.co.uk|httpup|http://crux.andrewrose.co.uk/pkgs/|", #Andrew Rose -- HTTP timeout
"akosela|akosela@andykosela.com|httpup|https://raw.githubusercontent.com/akosela/crux-ports/master/|RWQL+NVTgarWb0dnxzwJZQYg6WtftuFzh+Kka2D4aDb/gQI0H7pPsmkO",
#Andy Kosela
#"asie|kontakt@asie.pl|httpup|http://crux.asie.pl/|", #Adrian Siekierka
#"aubic|ales@hushmail.com|httpup|http://crux.org.pl/ports/aubic/|", -- 403
#"augustao|augustao@augustao.org|httpup|http://augustao.org/ports/|", #Augusto Pereira -- DNS failure
"ax|ax@slackware.eu|httpup|https://raw.githubusercontent.com/aicsx/crux/master/ports/|RWRD0mQcBjizu7rxgRnZbPyoXTr58sJ2KEEpgH9Y1g5NrGQclK5+reue", # ax
#"bashy|ronny.kornexl@t-online.de|httpup|http://ronny-kornexl.homepage.t-online.de/crux/ports/|", #Ronny Kornexl
"baguette|cmburget@gmail.com|httpup|https://raw.githubusercontent.com/baguette/crux-ports/master/|", #Cory Burgett
#"bitpuffin|contact@bitpuffin.com|httpup|http://cruxports.bitpuffin.com/bitpuffin/|", #Isak Andersson
#"boo|booo@riseup.net|httpup|https://crux.cpp.ninja/|RWRYvK1jPgzAQjXgl6UaBs5z4cl8avF1pgkvmKMA6N+AOeeK/u/XcAKw", #boo
#"bri|bri@w1r3.net|httpup|http://amsel.is/ports/bri|", # Anselmo
#"brianlfs|bmadonnaster@gmail.com|httpup|http://cruxbrianlfs.org/ports/|", #Brian Madonna - disabled due to many failures
#"bdfy|jean@mosk.ru|httpup|http://bdfy.googlecode.com/svn/trunk/|", #Ivan Rodionov -- googlecode is no longer
"bubby|bubbyroosh@gmail.com|git|https://codeberg.org/BubbyRoosh/ports.git|", #Bubby Roosh
"captlloyd|captlloyd@gmail.com|httpup|http://lloyd.is.an.evil-genius.net/crux/ports/|", #Justin W. Lloyd
#"cbailey|conrad@cbailey.tech|httpup|https://cbailey.tech/crux/|RWTmUXmSZQGEkyAAmcA2oS2WWlypr+BtMN3F5jGcpA8YBpleeccvE/wx", #Conrad Bailey
"cc|chriswcav@gmail.com|rsync|chrcav.dev::ports/cc/|RWRNcKhyXwtIg0N9wDUZPfv7GeaxHIP1Nz8a7szIqBbxZVdS7ymSBsrD", # Christoper Cavanaugh
#"chw|chw@tks6.net|httpup|http://iacs.epfl.ch/~winkelma/crux_ports/|", # Christoph Winkelmann -- HTTP timeout/403
"covil|serpente@caverna.org|httpup|https://codeberg.org/serpent/crux/raw/branch/main/ports/|", # serpente
"cpmtw|wodachm@gmail.com|httpup|https://raw.githubusercontent.com/mwsoft69/cpmtw/master/|", # Mitchell Wodach
"crux-xfce|j@lngn.net|httpup|https://raw.githubusercontent.com/mac-a-r0ni/crux-xfce4/master/|", # Jay Lanagan / r0ni
#"crshd|crshd@mail.com|httpup|http://crshd.users.anapnea.net/linux/crux/ports/|", #Christian Brassat -- 404
#"cruxab|abaranov.anton@gmail.com|httpup|http://cruxab.comlu.com/crux/ports/|", #Anton Baranov -- 404
#"cruxpl|sirmacik@crux.org.pl|httpup|http://sirmacik.net/static/download/cruxpl-ports/|", # CRUX Poland (Marcin Karpezo) -- 301 but destination is 404
#"darthlukan|darthlukan@gmail.com|httpup|http://ports.brianctomlinson.com/|", #Brian Tomlinson
#"dbrooke|crux@dbrooke.me.uk|httpup|http://crux-ports.dbrooke.me.uk/|RWRPZlJ5BPZtIiXairiiywfqicwIVxKXabMTYYAx4KMu8mxXUxdun195", #David Brooke
"deepthought|crux@eckner.net|httpup|https://crux.eckner.net/|RWQxCptPusLGGhty8f34d9gQktoFFkK97A6PmRqluLVq6NQTHPMKEIKr", # Erich Eckner
"df|wyatt@prairieturtle.ca|httpup|https://prairieturtle.ca/crux/ports/|RWRwXQ8RDeaRjGvt8szOb7HWyjqUD5XN4S468WdfiH4/lDfc6ykV0HWg", # Daryl Fonseca-Holt (nthwyatt)
#"dlcusa|dlc.usa@gmail.com|httpup|http://dlcusa.net/CRUX/dlcusa/|", #David L. Craig - 20230417: URL no longer exists
#"dokpm0|Kevin@RawFedDogs.net|httpup|http://crux.RawFedDogs.net/|", #Kevin Monceaux -- 404
"domv|domv@posteo.net|httpup|http://domv.freeshell.org/crux/ports/|", #Dominykas Vycas
"doom|dxm@openmailbox.org|httpup|https://raw.github.com/Doomicide/crux-ports/master/|", #Maximilian Dietrich (doomicide)
#"ecarux|kontakt@ecarux.de|httpup|http://ecarux.de/ports/|", #Hannes Mayer -- 404
"emulators|nogagplz@gmail.com|httpup|https://crux.ster.zone/ports/emulators/|", #Neville Phillips (responsible: Danny Rawlins)
#"emulators-i686|crux@romster.me|httpup|https://crux.ster.zone/ports/emulators-i686/|", #Danny Rawlins
"ergo|nathaniel.horn@protonmail.com|httpup|https://raw.githubusercontent.com/ergo0/crux-ports/master/|", # Nathaniel Horn?
#"falcony|falcony@users.sourceforge.net|httpup|http://falcony.googlecode.com/svn/trunk/falcony/|", #Maxim Falcony -- googlecode is no longer
#"fho|holler_f@informatik.haw-hamburg.de|httpup|http://users.informatik.haw-hamburg.de/~holler_f/crux_ports/|", # Fabian Holler -- 404
#"fillo|fillo@fillo.me|httpup|http://fillo.pw/cruxports/|", # Dimitry (fillo) -- empty page
#"flaveur|grim@asu.ntu-kpi.kiev.ua|httpup|http://flaveur.googlecode.com/svn/trunk/ports/|", #Oleksiy Khilkevich -- googlecode is no longer
#"fyr|wildefur@gmail.com|httpup|http://fyrious.ninja/ports/|", # Wildefyr -- connection refused
#"f1y|dwanasciegroszy@o2.pl|httpup|http://pierwszeliceum.bedzin.pl:8080/~f1y/httpup/|", #Bartosz Sobel -- connection timed out
#"haikob|haiko.brandes@stud.uni-goettingen.de|httpup|http://www.stud.uni-goettingen.de/~s462320/crux/|", --generic uni blog page
#"haskell|moritz+crux@wzff.de|rsync|rsync.wzff.de::crux-haskell/|", #Moritz Wilhelmy's haskell collection -- DNS failure
#"hnc|bile@landofbile.com|httpup|http://www.landofbile.com/crux_ports/|", #Antonio SJ Musumeci -- 500
"isotop7|hendrik@hr94.de|httpup|http://crux.hr94.de/|", #Hendrik Roeder
#"ix|arcetera@openmailbox.org|httpup|https://arcetera.moe/dl/3.2/|", #Abraham Levine -- SSL cert problems
"jaeger|jaeger@crux.ninja|rsync|morpheus.net::cruxports/|RWSOnFyQeaNCyr25usfP+w0S6kTn69jVvZiHBIuog/UWi8kfIOZ0maBQ", #Matt Housh
#"jdolan|jasonthomasdolan@yahoo.com|httpup|http://jdolan.dyndns.org/jaydolan/ports/|", #Jay Dolan -- connection timed out
#"jmf|jmf@mesecons.net|httpup|http://cuttle.space/ports/crux-3.5/|RWQhc2QeFyS6e4TdZ+VpjKW/4peQMZPKwgzcTbIB75pO0pHokxnWrAyo", # john_cephalopoda
"jmq|jmcquah@disroot.org|httpup|https://git.sdf.org/jmq/cruxports/raw/branch/master/|", # John McQuah
"joacim|joacim@joac.im|httpup|http://raw.github.com/joacimot/CRUX-Ports/master/|RWSuLkDXHdtCNjV/cpyChi4zCbdFc7JqIHBhWC2Qgh4Yv3YeVuqbl8X5", #Joacim Olsen Tangen
"joe9|joe9mail@gmail.com|httpup|https://crux.ster.zone/ports/joe9/|", #Joe M
#"jturner|james@calminferno.net|httpup|http://calminferno.net/crux/|", #James Turner -- 404
"jue|jue@jue.li|httpup|http://jue.li/crux/ports/|RWQJfAOele67BfWv3WuheOZOdjo4/BWkevSIDmEjTLqKBocP8ChUFEGi",
#"juef|svyatoslav.mishyn@gmail.com|httpup|https://prt.juef.space/doc/trunk/|RWSqr+TXCnzKbZ5JnVEvfGg+bCZIKDoKw9IO1XkUflhzyLU0SR7gsDOS", #Svyatoslav Mishyn -- retired 2018-02-05
#"j_v|jvogel4@stny.rr.com|httpup|https://stygian.me/crux/ports/|RWQxYrjprOM1xOZADJf0tp1cyXIuNunkEOxVtDjN3zga6T+emgTRUhI2", #John Vogel
"jolupalabs|jlpavon@me.com|httpup|https://raw.githubusercontent.com/jolupa/jolupalabs/master/|RWRdPtfuMX7+XJL0Arvzwy9+AiDPfWa9/cJomHj+E8nLYjczL1PUmpkU", # Jose Luis Pavon
#"jw|jw@smts.ch|httpup|http://jw.smts.ch/files/crux/ports/|", -- 404
#"karpunix|sirmacik@gmail.com|httpup|http://download.sirmacik.lin4all.org/crux/ports/|", # Marcin Karpezo -- DNS failure
#"kori|kori@openmailbox.org|httpup|https://raw.github.com/kori/crux-ports/master/|", #Kori Ayakashi
#"kde5|thenschel@henschelsoft.de|httpup|https://www.henschelsoft.de/kde5ports/|", #Torsten Henschel
"kp4|vs@kp4.ru|httpup|http://crux.kp4.ru/|", # Vitaly Sinilin
#"kris|email@zero-io.net|httpup|https://raw.githubusercontent.com/krleh/ports/master/|", # Kris Lehmann
#"larryn|wawrzek@gmail.com|httpup|http://wawrzek.name/Crux/Ports/|", -- 404
#"lennart|devel@lennart.sauerbeck.org|rsync|code-monkey.de::lennarts-crux-ports/|", #Lennart Sauerbeck -- connection refused
#"leo-unglaub|leo@leo-unglaub.net|rsync|leo-unglaub.net::crux-ports-leo-unglaub/|", # Leo Unglaub -- rsync chroot failed
#"linoports|benemue@googlemail.com|rsync|karif.server-speed.net::linoports/|", #Benedikt Muller -- connection refused
#"l00nix|l00nixcdoc@gmail.com|httpup|http://l00nix.com/repo/crux/|", #Cody
"l25|ocb@l25.fi|httpup|http://l25.fi/crux/|RWQ0UT9dixVVPWhjTb2N+i9jEzXiAzEL02e3GaMenLSSdtKXIj+DuGgV", #ocb?
#"lxde|rotwang@crux.org.pl|httpup|http://crux.org.pl/ports/lxde/|", #Bartlomeij Palmowski -- 301 but destination access denied
"lxqt|timcowchip@gmail.com|httpup|https://raw.githubusercontent.com/timcowchip/LXQT/master/|", #Chris Farrell
"maraku|maraku@gmx.com|httpup|https://ports.maraku.xyz/|RWSULhFz4GjCNLSFtmPB8JIprGeeBPApK8HJ0TFVea0n7JazP/beg8yS" #Manu Kumar
#"malster|clover@mail.nnov.ru|httpup|http://malster.nnov.ru/ports/|", -- domain lapsed/parked
#"mason|msonderegger@aon.at|httpup|http://www.tip9ug.jp/who/dude/webdir/lunix/CRUX/|", #Markus Sonderegger -- 404
"mechaniputer|beadleha@clarkson.edu|httpup|http://people.clarkson.edu/~beadleha/crux/ports/|", #Herbert A. Beadle
#"mhedenskog|mattias@hedenskog.se|httpup|http://magog.se/crux/|", -- domain lapsed/parked
#"mike_attic|mike@openbunker.org|httpup|http://www.openbunker.org/crux/ports/mike_attic/|", #Mikhail Kolesnik -- 301 but destination 404
"mike|mike@openbunker.org|httpup|http://openbunker.org/crux/ports/mike/|", #Mikhail Kolesnik
"mikejsavage|mike@mikejsavage.co.uk|httpup|http://mikejsavage.co.uk/crux/|", #Mike Savage
#"misterbzr|hbezemer@kliksafe.nl|httpup|https://raw.githubusercontent.com/Allfifthstuning/misterbzr/master/|", #Hans Bezemer
#"mk|malte.kiefer@mailgermania.de|httpup|https://raw.githubusercontent.com/beli3ver/crux-ports/master/|", #Malte Kiefer
#"mono|nymacro@gmail.com|httpup|http://members.optusnet.com.au/dfmarks/crux/mono/|",
#"mruiz|manuel.tienza@gmail.com|httpup|http://www.tienza.es/crux/ports/|", #Manuel Tienza
#"namenlos|richard.poettler@gmail.com|httpup|http://www.sti2.at/~richardp/ports/|", #Richard Poettler
#"nexscrp|jkr@nex.scrapping.cc|httpup|http://nex.scrapping.cc/crux/ports/|", #Jonas Kramer -- 404
#"nwe|niklas@netsplit.nu|httpup|http://www.sigwait.se/ports/|", #Niklas Wennerstrand -- 404
"nilp|mytchel@openmailbox.org|httpup|http://raw.github.com/mytch444/crux-ports/master/|", #Mytchel Hammond
#"ninuzzo|ant@venus.deis.unical.it|httpup|http://monitor.deis.unical.it/ant/crux/|", -- DNS failure
#"nipul|lucas@die.net.au|httpup|http://nipul.die.net.au/ports/|", #Lucas Hazel -- DNS failure
#"nogagplz|nogagplz@gmail.com|httpup|https://crux.ster.zone/ports/nogagplz/|", #Neville Phillips (responsible: Danny Rawlins)
"nullspoon|nullspoon@oper.io|httpup|https://oper.io/crux-ports/|", #Aaron Ball
#"nym|nymacro@gmail.com|httpup|http://members.optushome.com.au/dfmarks/crux/ports/|", -- 404
#"omfgroflbboq|omfgroflbboq@spam4.me|httpup|https://github.com/omfgroflbbq/crux-ports/|",
#"patroclo7|patroclo7@gmail.com|httpup|http://www.patroclo7.org/crux/ports/patroclo7/|", #Giorgio Lando -- DNS failure
"pitillo|pitillo@crux-arm.nu|rsync|vjml.es::ports/pitillo/|", #Victor Martinez
#"pitman|mad.skipjack@mail.ru|httpup|http://raw.github.com/KonstantinLepa/crux-ports/master/|", #Konstantin Lepa -- 404
"poq|jbloomfield@live.com|httpup|https://raw.github.com/justinbloomfield/crux-ports/master/|", #Justin Bloomfield
"ppetrov|slackalaxy@gmail.com|httpup|https://raw.githubusercontent.com/slackalaxy/crux-ports/main/ppetrov/|RWToVVsIkzFIZebnqOd9r7OwjuCFjOdTN2ZMnVLflPnOV4ZBRwA/a1I6", #Petar Petrov
#"predatorfreak|predatorfreak@dcaf-security.org|httpup|http://www.dcaf-security.org/ports/|", #Brett Andrew Goulder -- 404
#"prologic|prologic@shortcircuit.net.au|httpup|http://crux.shortcircuit.net.au/|", #James Mills -- DNS failure
#"qba|teoqba@gmail.com|httpup|http://escher.unige.ch/~qba/crux/ports/|", #Kuba Kaminski -- HTTP timeout
"r4-modules|slackalaxy@gmail.com|httpup|https://raw.githubusercontent.com/slackalaxy/crux-ports/main/r4-modules/|RWQ2oTreAss89F4P3UyXbrsfxizgSIEW/g7Ukm9iy1NvcbI2lEzmXgHk", #Petar Petrov
#"rehabdoll|fredrik@obra.se|rsync|obra.se::ports/|", #Fredrik Rinnest
"rexich|bjorn@krstarica.com|httpup|https://crux.ster.zone/ports/rexich/|", #Filip Rex Dimovski
#"rho|rho@thinkingspot.ch|httpup|http://www.thinkingspot.ch/crux/ports/|", -- 404
#"rines|richard@nespithal.com|httpup|http://crux.richardnespithal.com/|", #Richard Nespithal -- DNS failure
"rk|crux@roeschu.ch|httpup|http://www.roeschu.ch/ports/crux/|",
#"rmull|rmmullen@gmail.com|httpup|http://lug.bu.edu/mirror/crux/ports/|", #Ryan Mullen
#"roliveira|crux@roliveira.eu|httpup|http://roliveira.eu/crux/ports/|", #Ricardo Oliveira -- 404
"romster|crux@romster.me|httpup|https://crux.ster.zone/ports/romster/|", #Danny Rawlins
#"rotwang|rotwang@crux.org.pl|httpup|http://crux.org.pl/ports/rotwang/|", #Bartlomiej Palmowski -- 403
#"rugek|rugek@btcl.de|httpup|http://rugek.dirtyhack.net/crux-ports/rugek/|", -- SSL certificate errors
"ruxr|r.oreshnikov@gmail.com|httpup|https://raw.githubusercontent.com/ruxr/CRUX/master/|RWST1RjWg2md34jIM/NoDVSsU/EIHqkCjrJo6d0kqdVPdTq4ooFgfCoK", # Roman Oreshnikov
"samsep10l|dark_bakura@protonmail.com|httpup|https://raw.githubusercontent.com/lazyfox77/crux-ports/master/|RWTPCqkVa80cesgtshVRqL2Mv9c4cTG72r5GM5fSDM6PsfnF9a/gisPd", #samsep10l
#"sepen|sepen@crux.nu|rsync|init.it.cx::ports/current/sepen/|", #Jose V Beneyto -- DNS failure
#"sgtmcd|sgtmcd@sgtmcd.com|httpup|http://crux.sgtmcd.com/ports/|",
#"shin|shin@sterneck.asia|httpup|http://ports.sterneck.asia/shin/|", #Shin Sterneck -- connection timed out
#"singular|arbor@mail.ru|httpup|http://singular.ru/ports/|", -- 404
#"slapdash|dave-slapdash@weller-fahy.com|httpup|http://slapdash.caterva.org/|", #David J. Weller-Fahy -- 404
"Samsky|samsky72@gmail.com|httpup|https://raw.githubusercontent.com/samsky72/CRUX/master/|", #Samat
"seiflek|seiflek@zoho.com|httpup|https://raw.githubusercontent.com/seiflek/crux-ports/master/|RWQQZSZZDgFXzrAKUr5rmTw/V71vtZGN9JapvERaBKjbno4J6PuQU8Aj", # Seif Lekbir
#"sigma|sigmw@protonmail.com|git|https://github.com/sigmw/crux-ports|", # Lucas Mazuco - 20230417: github repo no longer exists
#"spoofing|spoofing@crux.su|httpup|http://crux.su/~spoofing/crux/tree/|RWRksexN69MpA1oG3pjGzNF814ljxgcO7MnZ84rakz8Ii8vbps0eikGt", # Vanya Gaevskiy
"stdevel|webmaster@stankowic-development.net|httpup|http://crux.stankowic-development.net/|", #Christian Stankowic
"stenur|steffen@sdaoden.eu|httpup|https://www.sdaoden.eu/crux/ports/|RWR3vzfQxghE/sh0Z+7BIfmmalVzCFOHJQ+jjpst4mew+hyORlWWEKyd", # Steffen Nurpmeso
#"strw|strawi@googlemail.com|httpup|http://www.gnoedi.org/~straw/crux/ports/|", -- 404
"suwaports|suwako@076.moe|httpup|https://076.moe/repo/crux/ports/|", #Suwako Moriya?
"swhitton|spw@sdf.org|httpup|http://spw.sdf.org/crux/|", #Sean Whitton
#"syl|syl@clyl.net|rsync|rsync.clyl.net::crux/|", # Pierre Chaussee -- rsync server timed out
"t0b1nux|simonthoby@live.fr|httpup|https://git.framasoft.org/t0b1nux/crux-ports/raw/master/|", # Simon Thoby
"tb|tbier@posteo.de|httpup|https://raw.githubusercontent.com/TimB87/crux-ports/master/|RWSXjYMPO7mZwPCj6ECyo36osBkLz4cDXteNQlXYd0UnMkflOIDhSX2s", #Tim Biermann
#"tadzik|tadzikes@gmail.com|httpup|http://mhroczny.abuser.eu/~tadzik/ports/|", #Tadeus Sosnierz (irc handle: tadzik) -- DNS failure
"teatime|teatime@kyber.io|httpup|http://kyber.io/crux/ports/teatime/|", #teatime@irc.kyber.io
#"thenschel|thenschel@henschelsoft.de|httpup|https://www.henschelsoft.de/cruxports/|",
"theo|theodorehenson@protonmail.com|httpup|https://raw.githubusercontent.com/tteeoo/crux-ports/main/|", # Theo Henson
"therealfun|just.the.real.fun@gmail.com|httpup|https://gitlab.com/therealfun/crux-ports/raw/master/|RWTcI5d5qAlZ8u0wrrc4B6AbKFmqJgZWHnYQq+6HxIoFsKc5S0EJkJMm", #fun, no other name given
#"ticklestix|npardoe@ticklestix.co.uk|httpup|http://www.ticklestix.co.uk/crux/|", #Nathan Pardoe -- DNS failure
#"tillb|tillbiedermann@yahoo.de|httpup|http://still2come.net/crux/ports/tillb/|", #Till Biedermann -- DNS failure
#"tilman|tilman@code-monkey.de|rsync|code-monkey.de::tilmans-crux-ports/|", -- connection refused
"timcowchip|timcowchip@gmail.com|httpup|https://raw.githubusercontent.com/timcowchip/timcowchip/master/|RWQl8gtaJ/lzqrQPkgCq1zDexbN+po8wtyTon10xzNCIPbGQwPQXf8VR", #Chris Farrell
#"tsubasa|nickp102@gmail.com|httpup|http://tsubasa.googlecode.com/svn/trunk/tsubasa/|", #Sasha Chernyavsky -- googlecode is no longer
#"uhlu|crux@uhlu.com|httpup|http://ports.uhlu.com/repository/|", -- connection timed out
#"u7knv9h|u7knv9h@openmailbox.org|httpup|https://raw.githubusercontent.com/u7knv9h/CRUX-ports/master/|", #F.Kiroles -- 404
#"vico|vico@bicisport.de|httpup|http://vico.kleinplanet.de/files/repo/|", -- 404
"victorpr|victorpr@vivaldi.net|httpup|https://raw.githubusercontent.com/vicprk/ports/master/|RWR6lsXmtB/Ii2jibXqJjaqxeXKI44nTT+T1kuVOM1rBKclfpUQSsGoR", # Victor Campos
#"vni|younghead@ukr.net|httpup|http://vni.org.ua/crux/ports/vni/|", #Vasylchyshyn Nikolay
#"wawrzek|main@wawrzek.name|httpup|http://wawrzek.name/crux/repos/wawrzek/|", # Wawrzek Niewodniczanski -- 404
"wawrzek|main@wawrzek.name|httpup|http://wawrzek.name/crux/repo/|RWQXc2agtIcYBWpHqhhttRH+067uIV9sEkGPB2FT2uZRmFC712MDQF4Q", #Wawrzek Niewodniczanski
#"wzff|moritz+crux@wzff.de|rsync|rsync.wzff.de::crux-wzff/|", #Moritz Wilhelmy -- DNS failure
#"xcko|xcko@bitmessage.ch|httpup|https://raw.githubusercontent.com/xcko/ports/master/|", # xcko shrdlu, requested deactivation 2017-02-14
"xcko|xcko@airmail.cc|httpup|https://raw.githubusercontent.com/xcko/ports/master|RWRiSEuMHB8j9ZUmPQ/tUzXfzAiYh4rnmmYE30GiX+KsrGSwfIppWyHu", #requested readd 2017-11-17
#"xen|syl@clyl.net|rsync|rsync.clyl.net::crux-xen/|", # Pierre Chaussee -- rsync server timed out
#"xfce_4.16|dlc.usa@gmail.com|httpup|http://dlcusa.net/CRUX/xfce_4.16/|RWTAiBcEzIZ3JEQIhYdWLE6rPP2U3nkr/6cqUGDXfXVUt7tVd2y81mo+", # David L. Craig - 20230417: URL no longer exists
"yenjie|none|httpup|https://gitlab.com/SiFuh/yenjie/-/raw/master/|RWQ0NN0w0eo0uA1ZyDg9SfEttaSIb1hK3JlmIoPU0NaCton7nN/xMzAl", # SiFuh
#"yhafri|ycrux@club-internet.fr|httpup|http://perso.club-internet.fr/yhafri/crux/|",
#"z3bra|willy@mailoo.org|httpup|http://dl.z3bra.org/crux/v"+prevver+"/|" #Willy Goiffon - disabled due to many failures
]
## database file on disk
dbfile = '/home/crux/portdb/portdb.db.new'
# end config
# helper functions
def getCollection(parts):
"""Fetches a collection via httpup or rsync, returns a list of the ports contained therein."""
collname = parts[0]
colltype = parts[2]
url = parts[3]
ports = []
if colltype == 'httpup': # for httpup collections we can fetch and parse the REPO file
try:
resp = urllib2.urlopen(url + "REPO")
content = resp.read().strip().split('\n')
for line in content:
if line.find("d:") == 0:
ports.append(line.split(':')[1])
except urllib2.URLError as e:
print("Error fetching URL %s: %s" % (url, e))
elif colltype == 'rsync': # for rsync collections we call rsync and process its output
command = "/usr/bin/rsync --timeout 60 --list-only " + url
try:
content = subprocess.check_output(command.split()).strip().split('\n')
for line in content:
if line.find("d") == 0:
port = line.split()[4]
if port != '.':
ports.append(port)
except subprocess.CalledProcessError as e:
print("Error fetching rsync collection %s: %s" % (url, e))
else:
print("Unknown collection type: %s" % colltype)
return ports
def storeCollection(parts, ports, cur):
"""Stores a collection into the local sqlite3 database."""
collname = parts[0]
maintainer = parts[1]
colltype = parts[2]
url = parts[3]
pubkey = parts[4]
data = [(x,collname) for x in ports]
cur.executemany('INSERT INTO ports VALUES (NULL, ?, ?)', data)
cur.execute('INSERT INTO collections VALUES (NULL, ?, ?, ?, ?, ?)', (collname, maintainer, colltype, url, pubkey))
# main program
## create a connection and cursor to the sqlite3 database
conn = sqlite3.connect(dbfile)
cur = conn.cursor()
## create the collections table if needed
cur.execute('''CREATE TABLE IF NOT EXISTS collections (
collid integer primary key,
collname varchar,
maintainer varchar,
colltype varchar,
url varchar,
pubkey varchar);''')
## create the ports table if needed
cur.execute('''CREATE TABLE IF NOT EXISTS ports (
id integer primary key,
portname varchar,
collection varchar);''')
## clear out all previous data for repopulation
try:
cur.execute('DELETE FROM ports')
cur.execute('DELETE FROM collections')
cur.execute('VACUUM')
except sqlite3.OperationalError as e:
print("Error deleting records from database %s: %s" % (dbfile, e))
sys.exit(1)
## process collections listed above
for coll in collections:
parts = coll.split('|')
print("\nProcessing collection: %s" % parts[0])
## fetch
ports = getCollection(parts)
if len(ports) != 0:
print("Found %d ports: %s" % (len(ports), " ".join(ports)))
## store
storeCollection(parts, ports, cur)
## commit SQL changes
conn.commit()
## close sqlite3 database connection
conn.close()
# vim: set ts=2 et:

View File

@ -1,436 +1,562 @@
<?php
// some linting fixed - tb 20230909
// replaced md5sum references with signature - jaeger 20200528
// replace http with https for urls - frinnst 20170709
// $dbhandle = "sqlite://///var/www/htdocs/local/portdb.db";
// $dbhandle = "/var/www/htdocs/local/portdb.db";
$dbhandle = "/home/crux/portdb/portdb.db";
$version = "3.1";
function sqlite_open($location)
{
$handle = new SQLite3($location);
return $handle;
}
function sqlite_query($dbhandle,$query)
{
$array['dbhandle'] = $dbhandle;
$array['query'] = $query;
$result = $dbhandle->query($query);
return $result;
}
function sqlite_fetch_array(&$result)
{
// Get Columns
$i = 0;
while ($result->columnName($i))
{
$columns[ ] = $result->columnName($i);
$i++;
}
require('DB.php');
$dbhandle = "sqlite:////home/crux/public_html/local/portdb.db";
function nospam($mail) {
$mail = preg_replace("/\@/", " at ", $mail);
$mail = preg_replace("/\./", " dot ", $mail);
return htmlspecialchars($mail);
$resx = $result->fetchArray(SQLITE3_ASSOC);
return $resx;
}
function sanitize($str) {
return preg_replace("/[^[:alnum:][:space:]_+-\.]/ui", '', $str);
function nospam($mail)
{
$mail = preg_replace("/\@/", " at ", $mail);
$mail = preg_replace("/\./", " dot ", $mail);
return htmlspecialchars($mail);
}
function localrepo($name) {
if (is_dir("/home/crux/git-to-rsync-working-copy/crux-".$version."/{$name}")) {
return "http://crux.nu/ports/crux-".$version."/{$name}/";
}
else {
return "";
}
function sanitize($str)
{
return preg_replace("/[^[:alnum:][:space:]_+-\.]/ui", '', $str);
//return $str;
}
function localrepo($name)
{
if (is_dir("/home/crux/git-to-rsync-working-copy/crux-3.7/{$name}")) {
return "https://crux.nu/ports/crux-3.7/{$name}/";
}
else {
return "";
}
}
class Repo
{
public $name;
public $maintainer;
public $type;
public $url;
public $count;
public $name;
public $maintainer;
public $type;
public $url;
public $count;
public $pubkey;
function __construct($row) {
$this->name = trim($row["collname"]);
$this->maintainer = trim($row["maintainer"]);
$this->type = trim($row["colltype"]);
$this->url = trim($row["url"]);
$this->count = trim($row["tot"]);
}
function __construct($row)
{
$this->name = trim($row["collname"]);
$this->maintainer = trim($row["maintainer"]);
$this->type = trim($row["colltype"]);
$this->url = trim($row["url"]);
$this->count = trim($row["tot"]);
$this->pubkey = trim($row["pubkey"]);
}
function toHTML() {
return "<td><a href=\"?a=repo&q={$this->name}\">{$this->name}</a></td>
function toHTML()
{
if (strlen($this->pubkey) > 0) {
return "<td><a href=\"?a=repo&q={$this->name}\">{$this->name}</a></td>
<td>{$this->count}</td>
<td><a href=\"?a=getup&q={$this->name}\">{$this->type}</a></td>
<td>{$this->nospam()}</td>
<td>{$this->urlToHTML()}</td>";
}
<td>{$this->urlToHTML()}</td>
<td><a class='urllink' href='https://crux.nu/keys/{$this->name}.pub'>{$this->pubkey}</a></td>";
}
else {
return "<td><a href=\"?a=repo&q={$this->name}\">{$this->name}</a></td>
<td>{$this->count}</td>
<td><a href=\"?a=getup&q={$this->name}\">{$this->type}</a></td>
<td>{$this->nospam()}</td>
<td>{$this->urlToHTML()}</td>
<td></td>";
}
}
function toXML() {
return "<repo>
function toXML()
{
return "<repo>
<name>{$this->name}</name>
<maintainer>{$this->nospam()}</maintainer>
<type>{$this->type}</type>
<url>{$this->url}</url>
<ports>{$this->count}</ports>
<publickey>{$this->pubkey}</publickey>
</repo>";
}
function urlToHTML() {
if ($this->type == "httpup") {
return "<a href=\"{$this->url}\">{$this->url}</a>";
}
else {
return $this->url;
}
}
function nospam() {
return nospam($this->maintainer);
}
function urlToHTML()
{
if ($this->type == "httpup") {
return "<a href=\"{$this->url}\">{$this->url}</a>";
}
else {
return $this->url;
}
}
function nospam()
{
return nospam($this->maintainer);
}
}
class Port
{
public $name;
public $repo;
public $name;
public $repo;
function __construct($row) {
$this->name = trim($row["portname"]);
$this->repo = new Repo($row);
}
function __construct($row)
{
$this->name = trim($row["portname"]);
$this->repo = new Repo($row);
}
function toXML() {
return "<port>
function toXML()
{
return "<port>
<name>{$this->name}</name>
<repo>{$this->repo->name}</repo>
{$this->filesToXML()}
<command>{$this->downloadCommand()}</command>
</port>";
}
}
function toHTML() {
return "<td>{$this->name}</td>
function toHTML()
{
return "<td>{$this->name}</td>
<td><a href=\"?a=repo&q={$this->repo->name}\">{$this->repo->name}</a></td>
<td>{$this->filesToHTML()}</td>
<td>{$this->downloadCommand()}</td>";
}
}
function filesToXML() {
$xml = "";
if ($this->repo->type == "httpup") {
$base_url = "{$this->repo->url}";
function filesToXML()
{
$xml = "";
if ($this->repo->type == "httpup") {
$base_url = "{$this->repo->url}";
}
else {
$base_url = localrepo($this->repo->name);
}
if ($base_url != "") {
$base_url = chop($base_url, "/");
$xml = "<files>";
$xml .= "<pkgfile>{$base_url}/{$this->name}/Pkgfile</pkgfile>";
$xml .= "<footprint>{$base_url}/{$this->name}/.footprint</footprint>";
$xml .= "<signature>{$base_url}/{$this->name}/.signature</signature>";
$xml .= "</files>";
}
return $xml;
}
else {
$base_url = localrepo($this->repo->name);
}
if ($base_url != "") {
$base_url = chop($base_url, "/");
$xml = "<files>";
$xml .= "<pkgfile>{$base_url}/{$this->name}/Pkgfile</pkgfile>";
$xml .= "<footprint>{$base_url}/{$this->name}/.footprint</footprint>";
$xml .= "<md5sum>{$base_url}/{$this->name}/.md5sum</md5sum>";
$xml .= "</files>";
}
return $xml;
}
function filesToHTML() {
$html = "";
if ($this->repo->type == "httpup") {
$base_url = "{$this->repo->url}";
function filesToHTML()
{
$html = "";
if ($this->repo->type == "httpup") {
$base_url = "{$this->repo->url}";
}
else {
$base_url = localrepo($this->repo->name);
}
if ($base_url != "") {
$base_url = chop($base_url, "/");
$html = "<a href=\"{$base_url}/{$this->name}/Pkgfile\">P</a> ";
$html .= "<a href=\"{$base_url}/{$this->name}/.footprint\">F</a> ";
$html .= "<a href=\"{$base_url}/{$this->name}/.signature\">S</a>";
}
return $html;
}
else {
$base_url = localrepo($this->repo->name);
}
if ($base_url != "") {
$base_url = chop($base_url, "/");
$html = "<a href=\"{$base_url}/{$this->name}/Pkgfile\">P</a> ";
$html .= "<a href=\"{$base_url}/{$this->name}/.footprint\">F</a> ";
$html .= "<a href=\"{$base_url}/{$this->name}/.md5sum\">M</a>";
}
return $html;
}
function downloadCommand() {
switch ($this->repo->type) {
case "httpup":
return "httpup sync {$this->repo->url}#{$this->name} {$this->name}";
case "rsync":
return "rsync -aqz {$this->repo->url}{$this->name}/ {$this->name}";
default:
return "unknown repo type";
function downloadCommand()
{
switch ($this->repo->type) {
case "httpup":
return "httpup sync {$this->repo->url}#{$this->name} {$this->name}";
case "rsync":
return "rsync -aqz {$this->repo->url}{$this->name}/ {$this->name}";
default:
return "unknown repo type";
}
}
}
}
class Duplicate
{
public $name;
public $count;
public $name;
public $count;
function __construct($row) {
$this->name = $row["portname"];
$this->count = $row["dup"];
}
function __construct($row)
{
$this->name = $row["portname"];
$this->count = $row["dup"];
}
function toHTML() {
return "<td>{$this->name}</td>
function toHTML()
{
return "<td>{$this->name}</td>
<td>Found <a href=\"?a=search&q={$this->name}&s=true\">{$this->count} in repository</a></td>";
}
}
function toXML() {
return "<duplicate>
function toXML()
{
return "<duplicate>
<name>{$this->name}</name>
<count>{$this->count}</count>
</duplicate>";
}
}
}
class PortDb
{
public $db;
public $last_result;
public $db;
public $last_result;
public $dbhandle;
function __construct($dbhandle) {
$this->db =& DB::connect($dbhandle);
if (DB::isError($this->db)) die ("Can not connect to database");
$this->db->setFetchMode(DB_FETCHMODE_ASSOC);
}
function __construct($dbhandle)
{
/*
$this->db =& MDB2::connect($dbhandle);
if (MDB2::isError($this->db)) die ("Can not connect to database " . $dbhandle . "<br />\n" . $this->db->getMessage());
$this->db->setFetchMode(DB_FETCHMODE_ASSOC);
*/
$this->db = new SQLite3($dbhandle);
function lazy_programmer() {
die("LAZY PROGRAMMER ERROR");
}
function getQuery() {
try {
$sth = $this->db->prepare($this->sql);
$args = func_get_args();
$res = $this->db->execute($sth, $args);
if (DB::isError($res)) die ($res->getUserInfo());
$this->last_result = array();
while ($row =& $res->fetchRow()) {
array_push($this->last_result, $row);
}
return $this->last_result;
$this->dbhandle = $dbhandle;
}
catch (Exception $exception) {
die($exception->getMessage());
function lazy_programmer()
{
die("LAZY PROGRAMMER ERROR");
}
}
function doQuery() {
$this->lazy_programmer();
}
function getQuery()
{
try {
$stm = $this->db->prepare($this->sql);
$args = func_get_args();
$count = 0;
foreach ($args as $value) {
$stm->bindValue($count + 1, $args[$count]);
$count = $count + 1;
}
function htmlHeader() {
return file_get_contents("header.html");
}
$res = $stm->execute();
// if (MDB2::isError($res)) die ($res->getUserInfo());
function htmlFooter() {
return file_get_contents("footer.html");
}
$this->last_result = array();
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
array_push($this->last_result, $row);
}
function toHTML($start, $headers, $items) {
$html = $this->htmlHeader();
$html .= $start;
$html .= "<table class=\"listing\">";
$html .= "<thead><tr>";
foreach ($headers as $header) {
$html .= "<th>{$header}</th>";
return $this->last_result;
}
catch (Exception $exception) {
die($exception->getMessage());
}
}
$html .= "</tr></thead>";
foreach ($items as $item) {
$html .= "<tr>" . $item->toHTML() . "</tr>";
}
$html .= "</table>";
$html .= $this->htmlFooter();
return $html;
}
function toXML($root, $items) {
header("Content-type: text/xml");
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
$xml .= "<{$root}>";
foreach ($items as $item) {
$xml .= $item->toXML();
function doQuery()
{
$this->lazy_programmer();
}
function htmlHeader()
{
return file_get_contents("header.html");
}
function htmlFooter()
{
return file_get_contents("footer.html");
}
function toHTML($start, $headers, $items, $ports = -1)
{
$html = $this->htmlHeader();
$html .= $start;
$html .= "<table class=\"listing\">";
$html .= "<thead><tr>";
foreach ($headers as $header) {
$html .= "<th>{$header}</th>";
}
$html .= "</tr></thead>";
foreach ($items as $item) {
$html .= "<tr>" . $item->toHTML() . "</tr>";
}
if ($ports != -1) {
$html .= '<tr><td></td><td>' . $ports . ' (unique)</td><td></td<td></td<td></td><td></td>';
}
$html .= "</table>";
$html .= $this->htmlFooter();
return $html;
}
function toXML($root, $items)
{
header("Content-type: text/xml");
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
$xml .= "<{$root}>";
foreach ($items as $item) {
$xml .= $item->toXML();
}
$xml .= "</{$root}>";
return $xml;
}
$xml .= "</{$root}>";
return $xml;
}
}
class RepoList extends PortDb
{
public $sql = 'select collname,maintainer,colltype,url,count(*) as tot from collections
public $sql = 'select collname,maintainer,colltype,url,count(*) as tot,pubkey from collections
join ports on collection=collname
group by collname order by collections.collid';
function doQuery() {
$rows = $this->getQuery();
$repos = array();
foreach($rows as $row) {
$repo = new Repo($row);
array_push($repos, $repo);
function doQuery()
{
$rows = $this->getQuery();
$repos = array();
foreach($rows as $row) {
$repo = new Repo($row);
array_push($repos, $repo);
}
return $repos;
}
return $repos;
}
function toXML($repos) {
return parent::toXML("repos", $repos);
}
function toXML($repos)
{
return parent::toXML("repos", $repos);
}
function toHTML($repos) {
$start = "<h2>Overview of available repositories</h2>";
$headers = array("Repo Name", "# ports", "Type", "Maintainer", "Repo URL");
return parent::toHtml($start, $headers, $repos);
}
function toHTML($repos)
{
$unique = new UniquePorts($this->dbhandle);
$ports = $unique->getQuery();
$ports = $ports[0]['count(portname)'];
$start = "<h2>Overview of available repositories</h2>";
$headers = array("Repo Name", "# ports", "Type", "Maintainer", "Repo URL", "Public Key");
return parent::toHtml($start, $headers, $repos, $ports);
}
}
class PortList extends PortDb
{
public $sql = "select ports.portname as portname,
collections.collname as collname,
collections.maintainer as maintainer,
collections.colltype as colltype,
collections.url as url
from ports join collections on collection=collname
where collection = ? order by portname";
public $sql = "select ports.portname as portname,
collections.collname as collname,
collections.maintainer as maintainer,
collections.colltype as colltype,
collections.url as url
from ports join collections on collection=collname
where collection = ? order by portname";
function doQuery($repo) {
$rows = $this->getQuery($repo);
$ports = array();
foreach ($rows as $row) {
$port = new Port($row);
array_push($ports, $port);
function doQuery($repo)
{
$rows = $this->getQuery($repo);
$ports = array();
foreach ($rows as $row) {
$port = new Port($row);
array_push($ports, $port);
}
return $ports;
}
return $ports;
}
function toXML($ports) {
return parent::toXML("ports", $ports);
}
function toXML($ports)
{
return parent::toXML("ports", $ports);
}
function toHTML($ports) {
$repo = $ports[0]->repo->name;
$start = "<h2>Ports in repository $repo <a href=\"?a=getup&q={$repo}\">(get sync file)</a></h2>";
$headers = array("Port","Collection","Files","Download command");
return parent::toHTML($start, $headers, $ports);
}
function toHTML($ports)
{
$repo = $ports[0]->repo->name;
$start = "<h2>Ports in repository $repo <a href=\"?a=getup&q={$repo}\">(get sync file)</a></h2>";
$headers = array("Port","Collection","Files","Download command");
return parent::toHTML($start, $headers, $ports);
}
}
class SearchList extends PortList
{
public $strict = false;
public $query = '';
public $sql;
public $strict = false;
public $query = '';
public $sql;
function __construct($dbhandle, $strict) {
parent::__construct($dbhandle);
if ($strict == "true") $this->strict = true;
$sql = "select ports.portname as portname,
function __construct($dbhandle, $strict)
{
parent::__construct($dbhandle);
if ($strict == "true") { $this->strict = true;
}
$sql = "select ports.portname as portname,
collections.collname as collname,
collections.maintainer as maintainer,
collections.colltype as colltype,
collections.url as url
from ports join collections on collection=collname ";
if ($this->strict) {
$this->sql = $sql . "where portname=? ";
if ($this->strict) {
$this->sql = $sql . "where portname=? ";
}
else {
$this->sql = $sql . "where portname like ? ";
}
$this->sql .= "order by portname, collection";
}
else {
$this->sql = $sql . "where portname like ? ";
}
$this->sql .= "order by portname, collection";
}
function htmlHeader() {
$html = parent::htmlHeader();
$html .= '<h2>Simple port search</h2>
function htmlHeader()
{
$html = parent::htmlHeader();
$html .= '<h2>Simple port search</h2>
<p>Search for ports by name</p>
<form name="searchform" method="get" action="'.getenv("SCRIPT_NAME").'">
<input name="q" value="'.$this->query.'" />
<input type="hidden" name="a" value="search" />
<input value="search" type="submit" />
<input value="search" type="submit" />
</form>';
return $html;
}
function doQuery($query) {
$this->query = $query;
if ($query) {
if (! $this->strict) $query = "%{$query}%";
return parent::doQuery($query);
return $html;
}
return array();
}
function toHTML($ports) {
if ($this->query) {
$start = ""; #<h2>Search results for '{$this->query}'</h2>";
$headers = array("Port","Collection","Files","Download command");
return PortDb::toHTML($start, $headers, $ports);
function doQuery($query)
{
$this->query = $query;
if ($query) {
if (! $this->strict) { $query = "%{$query}%";
}
return parent::doQuery($query);
}
return array();
}
function toHTML($ports)
{
if ($this->query) {
$start = ""; // <h2>Search results for '{$this->query}'</h2>";
$headers = array("Port","Collection","Files","Download command");
return PortDB::toHTML($start, $headers, $ports);
}
return $this->htmlHeader() . $this->htmlFooter();
}
return $this->htmlHeader() . $this->htmlFooter();
}
}
class DuplicateList extends PortDb
{
public $sql = "select portname, count(*) as dup
public $sql = "select portname, count(*) as dup
from ports group by portname
having dup>1
order by dup desc";
function doQuery() {
$rows = $this->getQuery();
$dups = array();
foreach ($rows as $row) {
$dup = new Duplicate($row);
array_push($dups, $dup);
function doQuery()
{
$rows = $this->getQuery();
$dups = array();
foreach ($rows as $row) {
$dup = new Duplicate($row);
array_push($dups, $dup);
}
return $dups;
}
return $dups;
}
function toHTML($duplicates) {
$start = "<h2>List of duplicate ports</h2>";
$headers = array("Port", "# of duplicates");
return parent::toHTML($start, $headers, $duplicates);
}
function toHTML($duplicates)
{
$start = "<h2>List of duplicate ports</h2>";
$headers = array("Port", "# of duplicates");
return parent::toHTML($start, $headers, $duplicates);
}
function toXML($duplicates) {
return parent::toXML("duplicates",$duplicates);
}
function toXML($duplicates)
{
return parent::toXML("duplicates", $duplicates);
}
}
class RegisterPage
{
function toHTML() {
return PortDb::htmlHeader() . $this->contents() . PortDb::htmlFooter();
}
function toHTML()
{
return PortDB::htmlHeader() . $this->contents() . PortDB::htmlFooter();
}
function contents() {
return file_get_contents("register.html");
}
function contents()
{
return file_get_contents("register.html");
}
}
class GetUp extends PortDb
{
public $sql = "select collname,maintainer,colltype,url
public $sql = "select collname,maintainer,colltype,url
from collections where collname=?";
public $repo;
public $repo;
function doQuery($repo) {
$rows = $this->getQuery($repo);
if (count($rows) != 1) die ("Could not generate file");
return new Repo($rows[0]);
}
function toHTML($repo) {
header('Content-type: text/plain');
header('Content-Disposition: attachment; filename="'.$repo->name.".".$repo->type.'"');
$html = "# Collection ".$repo->name. ", by ".$repo->nospam()."\n";
$html .= "# File generated by the CRUX portdb http://crux.nu/portdb/"."\n\n";
if ($repo->type == "httpup") {
$html .= "ROOT_DIR=/usr/ports/" . $repo->name."\n";
$html .= "URL=" . $repo->url."\n";
} else {
$ar = explode('::', $repo->url);
$html .= "host=" . $ar[0]."\n";
$html .= "collection=" . $ar[1]."\n";
$html .= "destination=/usr/ports/" . $repo->name."\n";
function doQuery($repo)
{
$rows = $this->getQuery($repo);
if (count($rows) != 1) { die("Could not generate file");
}
return new Repo($rows[0]);
}
return $html;
}
function toXML($repo) {
return $this->toHTML($repo);
}
function toHTML($repo)
{
header('Content-type: text/plain');
header('Content-Disposition: attachment; filename="'.$repo->name.".".$repo->type.'"');
$html = "# Collection ".$repo->name. ", by ".$repo->nospam()."\n";
$html .= "# File generated by the CRUX portdb https://crux.nu/portdb/"."\n\n";
if ($repo->type == "httpup") {
$html .= "ROOT_DIR=/usr/ports/" . $repo->name."\n";
$html .= "URL=" . $repo->url."\n";
} else {
$ar = explode('::', $repo->url);
$html .= "host=" . $ar[0]."\n";
$html .= "collection=" . $ar[1]."\n";
$html .= "destination=/usr/ports/" . $repo->name."\n";
}
return $html;
}
function toXML($repo)
{
return $this->toHTML($repo);
}
}
class UniquePorts extends PortDb
{
public $sql = 'select count(portname) from (select distinct portname from ports)';
function toXML($ports)
{
return parent::toXML("NumberUniquePorts", array($ports));
}
function toHTML($ports)
{
return '<table><tr><td></td><td>' . $ports . ' (unique)</td><td></td<td></td<td></td>>><td></td></table>';
}
}
$action = sanitize($_GET['a']);
$query = sanitize($_GET['q']);
$format = sanitize($_GET['f']);
@ -438,32 +564,33 @@ $strict = sanitize($_GET['s']);
switch ($action) {
case "repo":
$portdb = new PortList($dbhandle);
break;
$portdb = new PortList($dbhandle);
break;
case "search":
$portdb = new SearchList($dbhandle,$strict);
break;
$portdb = new SearchList($dbhandle, $strict);
break;
case "dups":
$portdb = new DuplicateList($dbhandle);
break;
$portdb = new DuplicateList($dbhandle);
break;
case "getup":
$portdb = new GetUp($dbhandle);
break;
$portdb = new GetUp($dbhandle);
break;
case "register":
$portdb = new RegisterPage();
echo $portdb->toHTML();
exit;
$portdb = new RegisterPage();
echo $portdb->toHTML();
exit;
default:
$portdb = new RepoList($dbhandle);
$portdb = new RepoList($dbhandle);
}
$result = $portdb->doQuery($query);
switch ($format) {
case "xml":
echo $portdb->toXML($result);
break;
echo $portdb->toXML($result);
break;
default:
echo $portdb->toHTML($result);
echo $portdb->toHTML($result);
}
?>

View File

@ -1,14 +1,14 @@
/* CRUX custom */
.cruxheader {
text-align: center;
font-family: Verdana,Arial,Helvetica,sans-serif;
font-size:12px;
background-color: #FFF;
background-image: url("cruxlogo.png");
background-repeat: no-repeat;
background-position: top;
padding: 70px 0px 10px 10px;
border: 1px solid #DDDDDD;
text-align: center;
font-family: Verdana,Arial,Helvetica,sans-serif;
font-size:12px;
background-color: #FFF;
background-image: url("cruxlogo.png");
background-repeat: no-repeat;
background-position: top;
padding: 70px 0px 10px 10px;
border: 1px solid #DDDDDD;
}
.content {
@ -28,15 +28,15 @@
}
div.search {
font-size: 12px;
font-weight: normal;
margin-top: 4px;
margin-right: 8px;
margin-bottom: 4px;
margin-left: 8px;
position: absolute;
top: 36px;
right: 30px;
font-size: 12px;
font-weight: normal;
margin-top: 4px;
margin-right: 8px;
margin-bottom: 4px;
margin-left: 8px;
position: absolute;
top: 36px;
right: 30px;
}
body {
@ -60,6 +60,11 @@ a:hover {
color: #0000FF;
}
a.urllink {
background: url("/pub/skins/crux/extlink.gif") left center no-repeat;
padding-left: 16px;
}
h1 {
font-size: 18px;
font-weight: bold;
@ -71,8 +76,8 @@ h2 {
}
input {
border: 1px #cccccc solid;
padding: 3px;
border: 1px #cccccc solid;
padding: 3px;
}
input[type=submit], input[type=reset] {
background: #eee;