1. Developer wysyła zlecenie, z użyciem client/make-request.sh, na adres
srpm buildera.

2. Na koncie srpm buildera skrypt request_handler.py wołany z procmaila obsługuje
   zlecenie.
   a) sprawdza podpis gpg, wyciąga wszystkie Good sinature from <...>
      jeśli brak -- wypad
   b) szuka w swoim acl.conf czy osoba z Good signature from może robić
      cokolwiek, w.p.p wypad
   c) xml-parsuje zlecenie (request.py)
      i.   jeśli jest to <notifcation ...>, sparawdza uprawnienie
           notify:<builder>, i jeśli OK, to zmienia odpowiednio
           kolejkę spool/req_queue.  Jeśli wszystki buildery
           zakończyły już budowanie danej grupy usuwane są src rpmy
           z www/srpms/<group-id>/.  Generuje stronę ze statystykami
           (www/queue.html).
      ii.  jeśli jest to <group ...> to sprawdza czy użytkownik,
           który wysłał zlecenie ma uprawnienia src:<nazwa-src-buildera>,
           oraz binary:<builder> dla każdego buildera dla którego jest
           zlecenie.  Jeśli OK, to wrzuca zlecenie do spool/queue

3. Na koncie srpm buildera z crona chodzi skrypt srpm_builder.py.
   a) Czyta spool/queue, jeśli są tam jakieś zlecenia, sortuje wg. priorytetu
      (niższy numer == ważniejsze zlecenie), a następnie sortuje wg. czasu
      przybycia zlecenia (starsze == ważniejsze), wyciąga je z kolejki i zapisuje
      kolejkę.
   b) Obsługuje tylko <group ...>.
   c) Buduje w chroot wszystkie pakiety z grupy, kolejkując pliki w spool/ftp/
      oraz spool/buildlogs/. Dodatkowo srpmy są wrzucane do www/srpms/<group-id>/
      skąd ciągną je bin-buildery.
   d) jeśli nie powiodło się budowanie żadnego pakietu to wypad
   e) zleceniu nadawany jest numer
   f) zlecenie jest wrzucane do spool/req_queue
   g) kolejka jest podpisywana kluczem srpm buildera, gzipowana i wrzucana do 
      www/queue.gz
   h) numer zapisywany jest w www/max_req_no
   i) generowanie strony ze statystykami

4. Na kontach srpm buildera i bin-builderów chodzi
   file_sender.py. Monitoruje on kolejki spool/{buildlogs,ftp}. Są w
   nich pliki, jak:

     faa1f592-437f-446d-b1e6-ac41976c5775
     faa1f592-437f-446d-b1e6-ac41976c5775.info
     faa1f592-437f-446d-b1e6-ac41976c5775.desc

   Plik .desc jest kontrolny dla file_sender.py. Zawiera email zlecającego
   (do alarmowania), czas skolejkowania (pliki są wysyłane dokładnie
   w kolejności wrzucania do kolejki), oraz cel (url), gdzie należy
   przesłać plik.

   Plik .info jest tylko dla buildlogów. Jeśli taki plik istnieje to jest
   przesyłany po przesłaniu właściwego pliku (tego bez rozszerzenia). Jest
   w nim zapisany status buildloga (OK|FAIL). helpers/buildlogs-mover.sh
   używa tych plików.

   Pliki .info i .desc kończa się linią, zawierającą słowo END. Skrypty
   nic z nimi nie robią jeśli nie ma tam tego słowa (transmisja
   niedokończona).

   URLe wspierane jako cel to:
   
     rsync://user@host/modul/sci/ezka/plik
     scp://user@host/sciezka/plik
     /absolutna/sciezka/do/pliku
   
   W pliki config/rsync-passwords są hasła do rsync, w formacie:

     user@host hasło

   scp działa po kluczach (z ~/.ssh)

5. Na koncie bin-buildera chodzi skrypt request_fetcher.py.
   a) ściąga $control_url/max_req_no i porównuje ze spool/last_req_no.
      jeśli takie same to wypad.
   b) ściąga $control_url/queue.gz, dekompresuje, sprawdza podpis (w
      config/acl.conf dla podpisującego użytkownika musi być
      "sign_queue:all") [sidenote: konto bin buildera nie potrzebuje
      kluczy gpg innych niż swój i srpm buildera, nie potrzebuje też
      acl.conf pełnego, tylko srpm_builder z sign_queue:all]
   c) wrzuca zlecenia do spool/queue
   d) zapisuje największy numer zlecenia wrzuconego w spool/last_req_no.

6. Na koncie bin-buildera chodzi skrypt rpm_builder.py.
   a) sprawdzenie loadu, jeśli za wysoki to papa
   b) lockowanie build-slot-N, gdzie N < job_slots, jeśli sie nie da
      to papa
   c) lockowanie building-rpm-for-<builder> (tylko jeden build w chroot
      na raz)
   d) Czyta spool/queue, jeśli są tam jakieś zlecenia, sortuje wg. priorytetu
      (niższy numer == ważniejsze zlecenie), a następnie sortuje wg. czasu
      przybycia zlecenia (starsze == ważniejsze), wyciąga je z kolejki i zapisuje
      kolejkę.
   e) buduje pakiety, wrzuca pliki do spool/{buildlogs,ftp}. Jeśli nie ma flagi
      test-build to pakiety wrzuca też do /spools/ready/ w chroot (i generuje
      tam idx poldka)

Budowanie pakietów:
  1. ściągnięcie srpm
  2. instalacja srpm
  3. próba budowania (z --nobuild), wyłapanie "foo is needed by ...",
     instalacja wszystkich takich foo. UWAGA: to nie zawsze działa, np. jeśli
     rpm wywali się z braku pliku do %include. trzeba napisać osobny parser.
  4. budowanie
  5. jeśli nie test-build to przerzucenie pakietów do /spools/ready/
  6. jeśli upgrade, to próba upgrejdu, wywalenie wszystkich przeszkadzających
     pakietów, chyba, że trzeba by wywalić poldka, lub rpm-build.
  7. upgrade
