562 |
mateuszvis |
1 |
<?php /*
|
|
|
2 |
|
|
|
3 |
SvarDOS repo index builder
|
|
|
4 |
Copyright (C) Mateusz Viste 2012-2022
|
|
|
5 |
|
|
|
6 |
buildidx computes an index tsv file for the SvarDOS repository.
|
|
|
7 |
it must be executed pointing to a directory that stores packages (zip)
|
|
|
8 |
files. buildidx will generate the index file and save it into the package
|
|
|
9 |
repository.
|
|
|
10 |
|
|
|
11 |
requires php-zip
|
|
|
12 |
|
650 |
mateusz.vi |
13 |
12 feb 2022: skip source packages from being processed (*.src.zip)
|
562 |
mateuszvis |
14 |
20 jan 2022: rewritten the code from ANSI C to PHP for easier maintenance
|
|
|
15 |
13 feb 2021: 'title' LSM field is no longer looked after
|
|
|
16 |
11 feb 2021: lsm headers are no longer checked, so it is compatible with the simpler lsm format used by SvarDOS
|
|
|
17 |
13 jan 2021: removed the identification line, changed CRC32 to bsum, not creating the listing.txt file and stopped compressing index
|
|
|
18 |
23 apr 2017: uncompressed index is no longer created, added CRC32 of zib (bin only) files, if present
|
|
|
19 |
28 aug 2016: listing.txt is always written inside the repo dir (instead of inside current dir)
|
|
|
20 |
27 aug 2016: accepting full paths to repos (starting with /...)
|
|
|
21 |
07 dec 2013: rewritten buildidx in ANSI C89
|
|
|
22 |
19 aug 2013: add a compressed version of the index file to repos (index.gz)
|
|
|
23 |
22 jul 2013: creating a listing.txt file with list of packages
|
|
|
24 |
18 jul 2013: writing the number of packaged into the first line of the lst file
|
|
|
25 |
11 jul 2013: added a switch to 7za to make it case insensitive when extracting lsm files
|
|
|
26 |
10 jul 2013: changed unzip calls to 7za (to handle cases when appinfo is compressed with lzma)
|
|
|
27 |
04 feb 2013: added CRC32 support
|
|
|
28 |
22 sep 2012: forked 1st version from FDUPDATE builder
|
|
|
29 |
*/
|
|
|
30 |
|
|
|
31 |
$PVER = "20220120";
|
|
|
32 |
|
|
|
33 |
|
|
|
34 |
// computes the BSD sum of a file and returns it
|
|
|
35 |
function file2bsum($fname) {
|
|
|
36 |
$result = 0;
|
|
|
37 |
|
|
|
38 |
$fd = fopen($fname, 'rb');
|
|
|
39 |
if ($fd === false) return(0);
|
|
|
40 |
|
|
|
41 |
while (!feof($fd)) {
|
|
|
42 |
|
|
|
43 |
$buff = fread($fd, 1024 * 1024);
|
|
|
44 |
|
563 |
mateuszvis |
45 |
$slen = strlen($buff);
|
|
|
46 |
for ($i = 0; $i < $slen; $i++) {
|
562 |
mateuszvis |
47 |
// rotr
|
|
|
48 |
$result = ($result >> 1) | ($result << 15);
|
|
|
49 |
// add and truncate to 16 bits
|
563 |
mateuszvis |
50 |
$result += ord($buff[$i]);
|
562 |
mateuszvis |
51 |
$result &= 0xffff;
|
|
|
52 |
}
|
|
|
53 |
}
|
|
|
54 |
|
|
|
55 |
fclose($fd);
|
|
|
56 |
return($result);
|
|
|
57 |
}
|
|
|
58 |
|
|
|
59 |
|
|
|
60 |
// reads file fil from zip archive z and returns its content, or false on error
|
|
|
61 |
function read_file_from_zip($z, $fil) {
|
|
|
62 |
$zip = new ZipArchive;
|
|
|
63 |
if ($zip->open($z, ZipArchive::RDONLY) !== true) {
|
|
|
64 |
echo "ERROR: failed to open zip file '{$z}'\n";
|
|
|
65 |
return(false);
|
|
|
66 |
}
|
|
|
67 |
|
|
|
68 |
// load the appinfo/pkgname.lsm file
|
|
|
69 |
$res = $zip->getFromName($fil, 8192, ZipArchive::FL_NOCASE);
|
|
|
70 |
|
|
|
71 |
$zip->close();
|
|
|
72 |
return($res);
|
|
|
73 |
}
|
|
|
74 |
|
|
|
75 |
|
|
|
76 |
// reads a LSM string and returns it in the form of an array
|
|
|
77 |
function parse_lsm($s) {
|
|
|
78 |
$res = array();
|
|
|
79 |
for ($l = strtok($s, "\n"); $l !== false; $l = strtok("\n")) {
|
|
|
80 |
// the line is "token: value", let's find the colon
|
|
|
81 |
$colpos = strpos($l, ':');
|
|
|
82 |
if (($colpos === false) || ($colpos === 0)) continue;
|
|
|
83 |
$tok = strtolower(trim(substr($l, 0, $colpos)));
|
|
|
84 |
$val = trim(substr($l, $colpos + 1));
|
|
|
85 |
$res[$tok] = $val;
|
|
|
86 |
}
|
|
|
87 |
return($res);
|
|
|
88 |
}
|
|
|
89 |
|
|
|
90 |
|
|
|
91 |
// ***************** MAIN ROUTINE *********************************************
|
|
|
92 |
|
|
|
93 |
echo "SvarDOS repository index generator ver {$PVER}\n";
|
|
|
94 |
|
|
|
95 |
if (($_SERVER['argc'] != 2) || ($_SERVER['argv'][1][0] == '-')) {
|
|
|
96 |
echo "usage: php buildidx.php repodir\n";
|
|
|
97 |
exit(1);
|
|
|
98 |
}
|
|
|
99 |
|
|
|
100 |
$repodir = $_SERVER['argv'][1];
|
|
|
101 |
|
|
|
102 |
echo "building index for directory {$repodir}...\n";
|
|
|
103 |
|
|
|
104 |
$pkgfiles = scandir($repodir);
|
|
|
105 |
$pkglist = '';
|
|
|
106 |
$pkgcount = 0;
|
|
|
107 |
|
|
|
108 |
// iterate over each zip file
|
|
|
109 |
foreach ($pkgfiles as $zipfile) {
|
|
|
110 |
if (!preg_match('/.zip$/i', $zipfile)) continue; // skip non-zip files
|
|
|
111 |
if (strchr($zipfile, '-')) {
|
|
|
112 |
echo "skipping: {$zipfile}\n";
|
|
|
113 |
continue; // skip alt vers (like dosmid-0.9.2.zip)
|
|
|
114 |
}
|
650 |
mateusz.vi |
115 |
if (strstr($zipfile, '.src.zip')) {
|
|
|
116 |
echo "skipping source: {$zipfile}\n";
|
|
|
117 |
continue;
|
|
|
118 |
}
|
562 |
mateuszvis |
119 |
|
650 |
mateusz.vi |
120 |
|
562 |
mateuszvis |
121 |
$path_parts = pathinfo($zipfile);
|
|
|
122 |
$pkg = strtolower($path_parts['filename']);
|
|
|
123 |
|
|
|
124 |
$zipfile_fullpath = realpath($repodir . '/' . $zipfile);
|
|
|
125 |
|
|
|
126 |
$lsm = read_file_from_zip($zipfile_fullpath, "appinfo/{$pkg}.lsm");
|
|
|
127 |
if ($lsm == false) {
|
|
|
128 |
echo "ERROR: pkg {$z} does not contain an LSM file at the expected location\n";
|
|
|
129 |
exit(1);
|
|
|
130 |
}
|
|
|
131 |
|
|
|
132 |
$lsmarray = parse_lsm($lsm);
|
|
|
133 |
if (empty($lsmarray['version'])) {
|
|
|
134 |
echo "ERROR: lsm file in {$zipfile} does not contain a version\n";
|
|
|
135 |
var_dump($lsmarray);
|
|
|
136 |
exit(1);
|
|
|
137 |
}
|
|
|
138 |
if (empty($lsmarray['description'])) {
|
|
|
139 |
echo "ERROR: lsm file in {$zipfile} does not contain a description\n";
|
|
|
140 |
exit(1);
|
|
|
141 |
}
|
|
|
142 |
|
|
|
143 |
$pkglist .= "{$pkg}\t{$lsmarray['version']}\t{$lsmarray['description']}\t" . file2bsum($zipfile_fullpath) . "\n";
|
|
|
144 |
$pkgcount++;
|
|
|
145 |
|
|
|
146 |
}
|
|
|
147 |
|
|
|
148 |
echo "DONE - processed " . $pkgcount . " zip files\n";
|
|
|
149 |
|
|
|
150 |
file_put_contents($repodir . '/index.tsv', $pkglist);
|
|
|
151 |
|
|
|
152 |
exit(0);
|
|
|
153 |
|
|
|
154 |
?>
|