Implementazione
 
 
 
 

Server (Sicuro):

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:

( Il Server potrebbe avere una cache per le chiavi pubbliche degli Agenti (autenticazione)

(quando verificare la validità ? Revocazione ?) (Si potrebbe associare un TTL ad ogni chiave)

( in pratica invia una lista di interi con questo significato:

( 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.
 
 

( cioè il Server destinazione si mette in ascolto sulla porta stabilita (num porta Server), per un certo tempo, nel quale dovrebbe arrivare la richiesta di caricamento (URL del Agente (sul Server) e metodo da riattivare, tutto crittato con la chiave simmetrica ).

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:
 
 


 

                                   Vai alle Modifiche ed Adattamenti finali: 
 
 
 

                                                     Torna all'indice