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 (
CREATE TABLE collections (
collid integer primary key,
collname varchar,
maintainer varchar,
colltype varchar,
url varchar
);
url varchar,
pubkey 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,24 +1,56 @@
<?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');
$resx = $result->fetchArray(SQLITE3_ASSOC);
return $resx;
}
$dbhandle = "sqlite:////home/crux/public_html/local/portdb.db";
function nospam($mail) {
function nospam($mail)
{
$mail = preg_replace("/\@/", " at ", $mail);
$mail = preg_replace("/\./", " dot ", $mail);
return htmlspecialchars($mail);
}
function sanitize($str) {
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-".$version."/{$name}")) {
return "http://crux.nu/ports/crux-".$version."/{$name}/";
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 "";
@ -32,34 +64,52 @@ class Repo
public $type;
public $url;
public $count;
public $pubkey;
function __construct($row) {
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() {
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() {
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() {
function urlToHTML()
{
if ($this->type == "httpup") {
return "<a href=\"{$this->url}\">{$this->url}</a>";
}
@ -68,7 +118,8 @@ class Repo
}
}
function nospam() {
function nospam()
{
return nospam($this->maintainer);
}
}
@ -78,12 +129,14 @@ class Port
public $name;
public $repo;
function __construct($row) {
function __construct($row)
{
$this->name = trim($row["portname"]);
$this->repo = new Repo($row);
}
function toXML() {
function toXML()
{
return "<port>
<name>{$this->name}</name>
<repo>{$this->repo->name}</repo>
@ -93,14 +146,16 @@ class Port
}
function toHTML() {
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() {
function filesToXML()
{
$xml = "";
if ($this->repo->type == "httpup") {
$base_url = "{$this->repo->url}";
@ -113,13 +168,14 @@ class Port
$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 .= "<signature>{$base_url}/{$this->name}/.signature</signature>";
$xml .= "</files>";
}
return $xml;
}
function filesToHTML() {
function filesToHTML()
{
$html = "";
if ($this->repo->type == "httpup") {
$base_url = "{$this->repo->url}";
@ -131,12 +187,13 @@ class Port
$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>";
$html .= "<a href=\"{$base_url}/{$this->name}/.signature\">S</a>";
}
return $html;
}
function downloadCommand() {
function downloadCommand()
{
switch ($this->repo->type) {
case "httpup":
return "httpup sync {$this->repo->url}#{$this->name} {$this->name}";
@ -153,17 +210,20 @@ class Duplicate
public $name;
public $count;
function __construct($row) {
function __construct($row)
{
$this->name = $row["portname"];
$this->count = $row["dup"];
}
function toHTML() {
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() {
function toXML()
{
return "<duplicate>
<name>{$this->name}</name>
<count>{$this->count}</count>
@ -175,27 +235,44 @@ class PortDb
{
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");
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);
$this->dbhandle = $dbhandle;
}
function lazy_programmer() {
function lazy_programmer()
{
die("LAZY PROGRAMMER ERROR");
}
function getQuery() {
function getQuery()
{
try {
$sth = $this->db->prepare($this->sql);
$stm = $this->db->prepare($this->sql);
$args = func_get_args();
$res = $this->db->execute($sth, $args);
if (DB::isError($res)) die ($res->getUserInfo());
$count = 0;
foreach ($args as $value) {
$stm->bindValue($count + 1, $args[$count]);
$count = $count + 1;
}
$res = $stm->execute();
// if (MDB2::isError($res)) die ($res->getUserInfo());
$this->last_result = array();
while ($row =& $res->fetchRow()) {
while ($row = $res->fetchArray(SQLITE3_ASSOC)) {
array_push($this->last_result, $row);
}
return $this->last_result;
}
catch (Exception $exception) {
@ -203,19 +280,23 @@ class PortDb
}
}
function doQuery() {
function doQuery()
{
$this->lazy_programmer();
}
function htmlHeader() {
function htmlHeader()
{
return file_get_contents("header.html");
}
function htmlFooter() {
function htmlFooter()
{
return file_get_contents("footer.html");
}
function toHTML($start, $headers, $items) {
function toHTML($start, $headers, $items, $ports = -1)
{
$html = $this->htmlHeader();
$html .= $start;
$html .= "<table class=\"listing\">";
@ -227,12 +308,16 @@ class PortDb
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) {
function toXML($root, $items)
{
header("Content-type: text/xml");
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
$xml .= "<{$root}>";
@ -246,11 +331,12 @@ class PortDb
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() {
function doQuery()
{
$rows = $this->getQuery();
$repos = array();
foreach($rows as $row) {
@ -260,14 +346,19 @@ class RepoList extends PortDb
return $repos;
}
function toXML($repos) {
function toXML($repos)
{
return parent::toXML("repos", $repos);
}
function toHTML($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");
return parent::toHtml($start, $headers, $repos);
$headers = array("Repo Name", "# ports", "Type", "Maintainer", "Repo URL", "Public Key");
return parent::toHtml($start, $headers, $repos, $ports);
}
}
@ -281,7 +372,8 @@ class PortList extends PortDb
from ports join collections on collection=collname
where collection = ? order by portname";
function doQuery($repo) {
function doQuery($repo)
{
$rows = $this->getQuery($repo);
$ports = array();
foreach ($rows as $row) {
@ -291,11 +383,13 @@ class PortList extends PortDb
return $ports;
}
function toXML($ports) {
function toXML($ports)
{
return parent::toXML("ports", $ports);
}
function toHTML($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");
@ -309,9 +403,11 @@ class SearchList extends PortList
public $query = '';
public $sql;
function __construct($dbhandle, $strict) {
function __construct($dbhandle, $strict)
{
parent::__construct($dbhandle);
if ($strict == "true") $this->strict = true;
if ($strict == "true") { $this->strict = true;
}
$sql = "select ports.portname as portname,
collections.collname as collname,
collections.maintainer as maintainer,
@ -327,7 +423,8 @@ class SearchList extends PortList
$this->sql .= "order by portname, collection";
}
function htmlHeader() {
function htmlHeader()
{
$html = parent::htmlHeader();
$html .= '<h2>Simple port search</h2>
<p>Search for ports by name</p>
@ -339,20 +436,23 @@ class SearchList extends PortList
return $html;
}
function doQuery($query) {
function doQuery($query)
{
$this->query = $query;
if ($query) {
if (! $this->strict) $query = "%{$query}%";
if (! $this->strict) { $query = "%{$query}%";
}
return parent::doQuery($query);
}
return array();
}
function toHTML($ports) {
function toHTML($ports)
{
if ($this->query) {
$start = ""; #<h2>Search results for '{$this->query}'</h2>";
$start = ""; // <h2>Search results for '{$this->query}'</h2>";
$headers = array("Port","Collection","Files","Download command");
return PortDb::toHTML($start, $headers, $ports);
return PortDB::toHTML($start, $headers, $ports);
}
return $this->htmlHeader() . $this->htmlFooter();
}
@ -365,7 +465,8 @@ class DuplicateList extends PortDb
having dup>1
order by dup desc";
function doQuery() {
function doQuery()
{
$rows = $this->getQuery();
$dups = array();
foreach ($rows as $row) {
@ -375,24 +476,28 @@ class DuplicateList extends PortDb
return $dups;
}
function toHTML($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) {
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() {
function contents()
{
return file_get_contents("register.html");
}
}
@ -403,17 +508,20 @@ class GetUp extends PortDb
from collections where collname=?";
public $repo;
function doQuery($repo) {
function doQuery($repo)
{
$rows = $this->getQuery($repo);
if (count($rows) != 1) die ("Could not generate file");
if (count($rows) != 1) { die("Could not generate file");
}
return new Repo($rows[0]);
}
function 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 http://crux.nu/portdb/"."\n\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";
@ -426,11 +534,29 @@ class GetUp extends PortDb
return $html;
}
function toXML($repo) {
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']);
@ -466,4 +592,5 @@ case "xml":
default:
echo $portdb->toHTML($result);
}
?>

View File

@ -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;