Progmar Marcin Załęczny

Język:

Jak założyć własne repozytorium Ubuntu

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