Najpierw upewniamy się, że mamy zainstalowany commandline'owy interpreter języka php5:
sudo apt-get install php5-cli
Następnie pobieramy listę wszystkich pakietów dostępnych w repozytorium Ubuntu:
apt-cache pkgnames > pkg_list.txt
Teraz lista pakietów znajduje się w pliku pkg_list.txt.
Mając listę pakietów, możemy zacząć je pobierać przy pomocy następującego skryptu ubuntu-repo-download.php:
<?php
$lines = file('pkg_list.txt');
foreach ($lines as $pkg) {
$pkg = trim($pkg);
$cmd = "apt-get download $pkg";
echo $cmd . "\n";
system($cmd);
}
Skrypt ten pobiera wszystkie pakiety z listy do bieżącego katalogu. Uruchamiamy go poleceniem:
php5 ubuntu-repo-download.php
Jeśli dużo pakietów pobrało się do bieżącego katalogu, możemy zatrzymać pobieranie (Ctrl+C) i rozdzielić je na podkatalogi o nazwach składających się z pierwszych liter pobranych pakietów. Robimy to przy pomocy skryptu ubuntu-repo-split-files-into-subdirectories.php:
<?php
$srcdir = "/mnt/sdb1/repository";
$destdir = "/mnt/sdb1/repository";
if (is_dir($srcdir)) {
$files = scandir($srcdir);
foreach ($files as $file) {
if (is_file("$srcdir/$file")) {
$letter = $file{0};
if (!is_dir("$destdir/$letter")) {
mkdir("$destdir/$letter");
}
if (is_dir("$destdir/$letter")) {
echo "Moving file: $file\n";
rename("$srcdir/$file", "$destdir/$letter/$file");
}
}
}
}
Przed wywołaniem skryptu musimy ustawić poprawne wartości zmiennych $srcdir
i $destdir na katalog zawierający pobrane pakiety. Skrypt wywołujemy poleceniem:
php5 ubuntu-repo-split-files-into-subdirectories.php
Następnie - przed kontynuacją pobierania dalszych pakietów - musimy uaktualnić listę pakietów do pobrania. Możemy to zrobić przy pomocy skryptu ubuntu-repo-check-if-downloaded.php
<?php
$repo_dir = "/mnt/sdb1/repository";
$lines = file('pkg_list.txt');
$content = "";
$counter = 0;
foreach ($lines as $pkg) {
$pkg = trim($pkg);
$letter = $pkg{0};
$cmd = "ls " . $repo_dir . "/" . $letter . "/" . $pkg . "_* 2>/dev/null";
//echo $cmd . "\n";
$result = system($cmd);
if (!empty($result)) {
echo $pkg." is already downloaded\n";
$counter += 1;
} else {
$content .= $pkg . "\n";
}
}
file_put_contents('pkg_list.txt', $content);
Skrypt ten działa na strukturze katalogów zbudowanej przez poprzedni skrypt (ubuntu-repo-split-files-into-subdirectories.php).
Przed jego wywołaniem musimy ustawić poprawną ścieżkę zmiennej $repo_dir.
Wywołujemy go poleceniem:
php5 ubuntu-repo-check-if-downloaded.php
Czasami może się zdarzyć, że niektóre pakiety nie pobrały się poprawnie - figurują w katalogu repozytorium jako pliki o zerowej długości. Korygujemy to skryptem ubuntu-repo-remove-empty-files.php:
<?php
$dir = "/mnt/sdb1/repository";
$files = scandir($dir);
foreach ($files as $file) {
if (is_file("$dir/$file")) {
if (filesize("$dir/$file") == 0) {
echo "Removing file: $dir/$file\n";
unlink("$dir/$file");
}
}
if (is_dir("$dir/$file")) {
$pkgs = scandir("$dir/$file");
foreach ($pkgs as $pkg) {
if (is_file("$dir/$file/$pkg")) {
if (filesize("$dir/$file/$pkg") == 0) {
echo "Removing file: $dir/$file/$pkg\n";
unlink("$dir/$file/$pkg");
}
}
}
}
}
Przed wywołaniem skryptu musimy zadbać o poprawne ustawienie zmiennej $repo_dir.
Skrypt wywołujemy poleceniem:
php5 ubuntu-repo-remove-empty-files.php
Po usunięciu pustych plików ponownie tworzymy listę pakietów do pobrania i ponawiamy pobieranie.
Gdy już wszystkie pakiety zostały pobrane tworzymy z nich repozytorium. W tym celu zakładamy katalog /var/www/repository a w nim podkatalogi /var/www/repository/repo_01 .. /var/www/repository/repo_09. Każdy z katalogów repo_0x powinien zawierać symlinki do trzech jednoliterowych katalogów zawierających pakiety. Na przykład katalog /var/www/repository/repo_01 powinien zawierać symlinki do katalogów a, b, c. Katalog /var/www/repository/repo_02 powinien zawierać symlinki do katalogów d, e, f. I tak dalej.
Na koniec dla każdego katalogu /var/www/repository/repo_01 do /var/www/repository/repo_09 wchodzimy
do jego wnętrza i wywołujemy polecenie tworzące spis paczuszek:
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
Jest to dość czasochłonny proces.
Gdy już stworzyliśmy wszystkie spisy Packages.gz, na komputerze klienckim dodajemy do pliku
/etc/apt/sources.list wpisy pozwalające korzystać z naszego repo:
deb http://localhost/repository/repo_01 /repo_01
deb http://localhost/repository/repo_02 /repo_02
...
deb http://localhost/repository/repo_02 /repo_09