Sul server viene caricata un'applicazione Java che farà da Server per gli agenti.
L'Agent Server rimane in ascolto su una porta (predefinita), in attesa
di richieste da Agenti esterni.
Il Server apre una Socket a Datagramma su una porta predefinita (Server
Concorrente e non parallelo).
Quando riceve una richiesta da un Agente esterno, inizia la negoziazione:
(quando verificare la validità ? Revocazione ?) (Si potrebbe associare un TTL ad ogni chiave)
( minuti in mem (int)– num max Socket (byte) – %CPU (byte)– num max Agenti (byte) – Costo Tot (int)- num Agenti pres (byte)– last access(minuti)(int) ( 0 / 1 (caricamento delayed)(byte) - num porta Server (int) ) - un Padding per arrivare a 32 Byte)
( si potrebbe anche mandare la lista dei servizi presenti sul Server)
(in caso il Server abbia raggiunto il num max di Agenti dello stesso
Principal presenti, gli manda un "segnale" di wait ( caricamento delayed)
).
Delle semplici send e receive.
Il controllo delle credenziali (identificazione e autenticazione) viene fatto usando il file Agent.res .
Ci sarà un programma esterno per editare il file, per gestire
i diritti degli Agenti: sia quelli gestiti direttamente da java (con l’access
controller), sia quelli gestiti dalle nostre classi.
Appena arriva la richiesta se può caricarlo subito, lo carica,
altrimenti aspetta che si liberi un posto e poi lo carica
(Vedi Schema
Riassuntivo Negoziazione )
Se dopo un certo tempo non arriva, il Server chiude la connessione
e decrementa il contatore presenze e tutti i Contatori Risorse)
Il Server crea un Thread in ascolto sulla nuova porta.
Il Server usa il SecureClassLoader per caricare l’Agente esterno.
C’è un contatore per il Numero di Thread, per il calcolo della
priorità degli Agenti.
Il Server da cui l’Agente parte, alla partenza di questo, libera
le risorse, e controlla se ci sono agenti in attesa, ed eventualmente ne
carica il primo. ( => il Server gestisce una lista di Agenti in attesa).
Un array di triple (Public key, URL, metodo da riattivare), e un intero
(valore corrente (modulo max val)).
Il server Destinazione carica l'Agente Esterno e ne controlla l'integrità (decrittandolo).
I permessi gestiti dall'Access Controller riguardano il file system
(può aprire file temporanei solo nelle directory permesse (dall’Access
Controller) e nelle quantità assegnategli), e la comunicazione (numero
max di connessioni).
In caso l'Agente voglia clonarsi, deve passare attraverso il Server,
che lo clona (se non si è raggiunto il numero max), e aggiorna i
contatori delle risorse.
Le primitive (del Server) sono realizzate come Classi nel ClassPath, così tutti riescono ad utilizzarle, bypassando l’Access Controller.
Sono le primitive stesse, al loro interno, che controllano i diritti
di esecuzione da parte dell’Agente, e l’eventuale fallimento delle stesse.
Periodicamente, il server controlla il tempo di permanenza dell'Agente
in memoria e la quantità di disco usata ( e cancella dal Log i record
Out-of-Date).
C’è un Thread dedicato al controllo di questi parametri. In Polling,
ed il periodo e lasciato alla politica dell’utente. Un ciclo For (;;) nel
quale, un ciclo for (i=0; i<=MaxAgentID; i++) controlla tutti gli Agenti
(confronto contatori Agenti con parametri Attuali), e poi lo mette in attesa
del periodo definito dall’utente.
Il Server fa il Log degli Accessi, del consumo di risorse sottoposte
al pagamento ( ed eventualmente qualcos'altro per Auditing o a scopi statistici).
L'Agent Server inoltre, mette a disposizione delle primitive ( metodi) agli Agenti esterni per la clonazione, suicidio, generazione di chiavi simmetriche, cifrazione, decifrazione e firma di dati (vedi place insicuri) e per la comunicazione tra agenti sullo stesso place (una MailBox per ogni Agente, visibile solo agli Agenti dello stesso Principal) e forwarding delle Mail, il servizio di nomi (per i Place Sicuri e Non), timer (messaggio di time out nella mailbox), o per offrire altri servizi (che possono variare da Place a Place).
Tutte queste Primitive hanno Interfacce Standard (tranne i servizi
"proprietari" dei vari Server).
Tutte le primitive sono implementate come classi presenti nel ClassPath
del Server, ma sono le primitive stesse ad implementare i controlli sui
diritti degli Agenti (di esecuzione). (con Agent.res)
Problemi aperti:
- Controllo Banda Comunicazione: troppo pesante, quindi si mette da
parte.
Variazione: