Il sistema di pacchetti in Bad Penguin
@2000 by Antonio GALLO <agx@linux.it>
=========================================================
Version  0.1.0  on  1999-06-09 by AGX
Version  0.2.0  on  1999-08-17 by AGX
Version  0.9.0  on  1999-10-25 by AGX
Versione 0.9.9  del 1999-12-01 by AGX (2^ Draft)
Versione 0.9.10 del 2000-02-27 by AGX (3^ Draft)
---------------------------------------------------------



IL SISTEMA DI PACCHETI IN BAD PENGUIN
=====================================

Il sistema di pacchetti di Bad Penguin e basato sul programma 'setup',
un tool a linea di comando per l'installazione, la rimozione ed altre
operazioni sui pacchetti. 'setup' e' l'equivalente di 'rpm' in RedHat
e di 'dpkg' in Debian.

Il vero tool di amministrazione dei pacchetti, utilizzato anche in
fase d'installazione e' composto da tre programmi:
  1. wizard
  2. packagement
  3. installer

wizard e' un front-end all'installazione, consente di scegliere quali
profili installare. 

packagement e' il programma di selezione dei pacchetti,
 legge tutti 
gli input e permette di selezionare interattivamente quali pacchetti 
installare, quindi genera i risultati su un file libretto.db

installer e' un front-end allo script di installazione pacchetti setup,
questi legge l'output generato dal packagement ed effettua l'installazione,
in realta' installer dovrebbe essere parte integrante del wizard.



Wizard
======

L'utente richiama il wizard da linea di comando, pannello di controllo
oppure automaticamente dal tool d'installazione della distribuzione.



Menu' Principale
----------------

Il Wizard deve iniziare con il seguente meu' da cui scegliere 
una delle seguenti operazioni:
  1. installazione dei pacchetti tramite profilo
 ;
  2. installazione manuale dei pacchetti ;
  3. gestione (rimozione,controllo)
 dei pacchetti gia' presenti ;
questo menu' puo' essere evitato utilizzando le opzioni:
  --use-profiles, per entrare direttamente nella scelta dei profili, o
  --use-packagement, per entrare direttamente nella scelta dei pacchetti



Directory sorgente pacchetti
----------------------------

Nel di scelta dell'opzione 1 o 2, e la directory di installazione
non e' stata scelta, viene richiesta la directory sorgente da cui
installare i pacchetti. Manualmente la scelta ricade tra:
  a. directory locale
  b. cdrom
  c. nfs +/- plip
  d. ftp (??? difficile da fare ???)

In maniera automatica si puo' usare --source-dir=$PATH oppure
--source-dir=/dev/null per evitare questo menu'.



Scelta dei profili
------------------

Nel caso si sceglie l'installazione per profilo (un profilo, in questo 
caso, va inteso
 come un insieme di pacchetti da installare per un 
determinato scopo), vengono proposti una serie di profili
, tramite una
checkbox, a cui e' possibile aderire o meno.

Esempio:
    [X] Base    - Sistema di base    20 MB

Dopo la selezione dei profili viene chiesto all'utente se vuole effettuare
o meno una selezione particolareggiata dei pacchetti, anche in caso
negativo deve essere richiamato il packagement aggiungendo l'opzione
--non-interactive con cui vengono solo elaborati i files senza alcun
intervento da parte dell'utente



Packagement
===========

Il packagement e' il programma di selezione particolareggiate dei 
pacchetti. Questi
 e' diviso in 3 sezioni principali:
  - lettura del database e dei vari file in input (profili,dipendenze)
  - selezione interattiva dei pacchetti da parte dell'utente
  - scrittura del flusso di output (libretto.db)


Il programma riceve in input i seguenti dati:

  a) directory sorgente (--source-dir=$PATH),
     contenente la lista dei pacchetti che e' possibile installare.
     ( categories.db, distribution.db ) PM inizializza la lista delle
     categorie e dei pacchetti in base a queste informazioni.

  b) partizione destinazione (--target-dir=$PATH se diverso da "/"),
     da cui viene acquisita la lista dei pacchetti gia' installati sulla
     macchina, e relative informazioni ( /var/spool/badpenguin ).
     I pacchetti gia' installati vanno aggiunti alle rispettive categorie,
     se un pacchetto non ha una categoria viene aggiunto alla categoria
     che ha lo stesso SONAME, altrimenti finisce nella categoria 'obsolete'
     [da verifare questa asserzione con il codice gia' presente]
.

  c) dipendenze non risolte,
     il file contenente le dipendenze non risolte (da installare) sulla
     directory destinazione ( $TARGET_DIR/var/spool/badpenguin/DEPS ) viene 
     elaborato e vengono automaticamente marcati per l'installazione 
     i pacchetti in esso presente.

   d) profilo (--use-profile=wizard.dep),
     viene letto il file contenente i file scelti tramite profilo, tutti 
     i file presenti vengono marcati per l'installazione.

   e) recupero libretto, 
     recupera le scelte effettuate in una precedente installazione
     ( $TARGET_DIR/var/spool/badpenguin/libretto.db ). Controllare che 
     il file 
selezionato sia presente ed applicare le relative modifiche 
     al flag di 
selezione, se non presente invece emettere un warning.

   f) spazio fisico,
     legge i dati relativi allo spazio libero su disco, ed ai vari
     mount-point presenti.
     NOTA: il formato attuale del pacchetto non include informazioni sullo
     spazio utilizzato per partizione.

Al termine di queste operazione e' compito del packager effettuare l'analisi
delle dipendenze e successivamente dello spazio su disco residuo.



Funzionalita' offerte dal programma
------------------------------------

Lo stato dei pacchetti viene visualizzato tenendo conto della seguente 
legenda (lo stato equivale anche al tasto da premere) :
	[ ] pacchetto non installato
	[I] pacchetto marcato per l'installazione (anche premendo spazio)
	[X] pacchetto gia' installato
	[R] pacchetto marcato per la rimozione
	[U] pacchetto marcato per l'upgrade
	[K] pacchetto marcato per il ripristino (restore)
	[F] Forza reinstallazione (TODO)

	[L] Lock del pacchetto: non lo voglio sul mio sistema;

Le transizioni possibili sono:
    - da [ ] si puo' passare al solo stato di I e viceversa;
    - da [X] si puo' passare allo stato di R, U o K e viceversa;
    - il tag [F] e' sempre ammesso;



Gestione delle dipendenze
-------------------------

Il nuovo gestore deve tenere conto delle dipendenze di un 
pacchetto
deve. In caso di dipendenze non soddisfatte deve visualizzare un
sub elenco delle sole dipendenze in modo da scegliere se installarle
o meno.

Il package deve anche controllare che quando si rimuove un pacchetto
non sia necessario ad altri.



INSTALLER
=========

Installer e' un banalissimo programma, che puo' essere incluso in
wizard, cosi come pure il packagement, che accetta in input:
 - source directory, dove si trovano i pacchetti ;
 - target directory, dove installare i pacchetti ;
 - libretto.db, file contenente le operazioni da effettuare.

Una volta letto il libretto.db, vengoono eseguite le operazioni in esso
descritte, richiedendo di cambiare cdrom nel caso in cui il pacchetto 
non viene 
trovato sul source medium attuale. Installer, inoltre, tiene 
traccia della
 progress bar e del tempo stimato. Ovviamente per le operazioni
di installazione lancia il comando 'setup' usando una banale system()



PROFILI 
=======

I profili sono memorizzati in /agxlinux/kickstart/*.profiles
e sono nel seguente formato:
 <nome categoria> <whitespace> <mask del pacchetto da includere>
questo significa che la riga:
  x-window       *
include tutti i pacchetti della sezione X-WINDOW, mentre:
  gnome-core     gmc*
include qualsiasi versione di 'mc' trovata
 nella dir gnome-core

Se il primo rigo e' un commento viene utilizzato come decrizione
del file.


Al termine della selezione dei profili e' compito del wizard creare
un file wizard.dep con l'espansione di tutti i pacchetti secondo
la wildcard, individuando i file
 da installare dalla directory
source-dir.

Il formato del file wizard.deps e' molto semplice
  <categoria> <whitespace> <nome completo del pacchetto, senza estensione>
   x-window                 xfree86-bin_3.4.0.1



LIBRETTO
========
packagement in uscita genera il file libretto.db che contiene
tutte le modifiche apportate all'elenco dei pacchetti nel formato:
  <operazione>  <categoria>  <pacchetto>  <posizione>

dove
  operazione = install, force (install+force), remove, update, 
               restore, check, etc.
  categoria  = dove si trova il pacchetto
  pacchetto  = nome completo del pacchetto (sensa estensione)
  posizione  = su quale degli N cdrom si trova il pacchetto

