Virtlab:Konzolový server

Z VirtlabWiki

Přejít na: navigace, hledání

Obsah

Úkoly konzolového serveru

Jeho úkolem je zprostředkovat přístup k sériovým nebo telnetovým konzolím síťových zařízení prostřednictvím jednoduchého protokolu nad TCP/IP. Je využíván Java Appletem, který běží ve webovém ovládacím rozhraní, což umožňuje uživateli jednoduchý přístup k síťovým zařízením. Zároveň slouží i jako proxy server, který zprostředkovává přístup k zařízením, která jsou připojena ke vzdáleným konzolovým serverům, kam nemá místní uživatel přímý přístup. Také prostřednictvím speciálního PHP skriptu ověřuje, jsou-li požadavky uživatele oprávněné a tím konzoly prvků zabezpečuje od neautorizovaného přístupu.

Popis implementace

(pozor: nejde o skutecny sekvencni diagram)

Zdrojový soubor server.c obsahuje hlavní funkci (main), která po úvodní inicializaci volá v nekonečném cyklu funkci obsluhuj_klienta().

"Základní funkce Cserveru"

Ve funkci obsluhuj_klienta() jsou pak načteny 4 řádky parametrů od klientského apletu. Tyto parametry jsou ověřeny pomocí funkce check_applet_args() a v případě, že klient chce takto přistupovat k prvku, který má korektně na danou dobu rezervován, vrátí funkce čas do konce rezervace (v sekundách). (V opačném případě vrací nulu a obsluhuj_klienta() následně skončí.)

V případě úspěchu se nastaví alarm() a hned potom se dostane ke slovu funkce open_dev_fd(), která ověří, jestli zařízení již není používáno jiným apletem. Není-li, zamkne jej pro výlučný přístup a vrátí na něj deskriptor.

"Funkce volane z obsluhuj_klienta()"

Struktura zdrojových souborů

Výše uvedené diagramy popisovaly základní funkce obsažené v základním zdrojovém souboru server.c + pár funkcí z dalších zdrojových souborů.

Struktura hlavního souboru - server.c (.h)

Handler na SIGPIPE

static void sig_pipe(int signo);

check_applet_args

Funkce, ktera zkontroluje platnost parametru poslanych appletem oproti webovemu serveru

  • V případě, že aplet s těmito parametry má právo přistupovat k požadovanému zařízení, funkce vrátí počet sekund do konce rezervace (bez "patičky")
  • V opačném případě vrátí hodnout 0

Vlastní kontrolu parametrů provádí externí skript check-applet-args.sh, který výsledek zapíše do souboru v /tmp/. Z něj pak druhý proces hodnotu převezme. (Druhým procesem je myšlen rodičovský proces - po volání funkce fork)

# define applet_checker "./check-applet-args.sh"
# define result_basefile "/tmp/appletchecker"
int check_applet_args(char* sid, char* sip, char* did, char* tm, char *resid)
{
  ...
      fork();
  //child:
      execlp(applet_checker, applet_checker, sid, sip, did, tm, resid, result_file, (char*)(NULL));
  //parent:
      //prevezmi hodnotu ze souboru a pak ji predej jako svou navratovou hodnotu pomoci
      return result;
  ...
 }

open_dev_fd

funkce, ktera otevre seriovy port/TCP stream pro cteni

int open_dev_fd(const char *_dev_id, int *target_is_cserver, int tutor, int* fd_to_tutor) {

T.K. - to uz je (doufam) stara informace: ??? // posledni pismeno cesty je podle porty.h

  • Funkce nejdříve převezme první argument a rozdelí jej na část pro zařízení a část pro lokalitu. Následně ověří, zda lokalita existuje a je dostupná. Stejnětak ověří i existenci zařízení. Podle typu zařízení a hlavně jeho umístění se rozhoduje, zda se s ním bude komunikovat přes sériový port, nebo přes TCP spojení (Jde-li o vzdálené zařízení.)
    • Nechápu tu ale, proc je jako typ zarizeni povazovana i moznost DEVICE_TUTOR

Nastavení FD jako NONBLOCKING

void set_nonblocking(int fd);

Nastavení FD jako BLOCKING

void set_blocking(int fd);

close_tutor

Rekne tutorovi, ze se od nej odpojuje

void close_tutor(int fd_tutor)
{
  set_nonblocking(fd_tutor);
  write(fd_tutor, MSG_IM_DYING, strlen(MSG_IM_DYING));
  set_blocking(fd_tutor);
}

close_fd_dev

Zavre socket zarizeni, je-li od tutora ke klientovi, posle jen zpravu o ukonceni

void close_fd_dev(int fd, int is_tutor)
{
  if(is_tutor)
  {
    close_tutor(fd);
  }
  else
    close(fd);
}


get_timestamp

vrati casove razitko

char *get_timestamp(void);

get_line_from_socket

Funkce čte ze soketu, který dostane jako první parametr. Přečte nejvýše tolik znaků, kolik udává třetí parametr a výsledek uloží do parametru dvě. Čtení končí, narazí-li na znaky CR/LF nebo načte-li maximální počet znaků (třetí parametr).

main

Hlavni funkce pro cely Konzolovy server.

Postupně provádí tyto akce:

  • nahraje soubor s doménami
  • nahraje soubor se zařízeními
  • vytvoří socket pro příjem spojení od klientů
    • a nastaví některé jeho parametry
    • funkcí bind jej pojmenuje
    • funkcí listen bude očekávat spojení od klientů
  • následuje "nekonečná" smyčka, ve které se vlastně pro každého připojeného klienta vytvoří nový proces, jehož úkolem je obsluha tohoto klienta. Tu zajišťujeme funkcí obsluhuj_klienta

obsluhuj_klienta

Smyslem je číst znaky od klientského apletu a předávat je cílovému prvku (např. CISCO) a také znaky od zařízení předávat klietskému apletu.


Implementace zakázaných příkazů

Virtuální laboratoř funguje zcela automaticky. Po vypršení času rezervovaného jedním studentem se smaže jím vytvořená konfigurace a síťové prvky se připraví pro práci dalšímu uživateli. Tohle by nebylo možné, kdyby studenti mohli zadávat do zařízení například libovolná hesla, která by pak byla vyžadována i pro smazání konfigurace.

Některé příkazy bylo tedy nutné zakázat.

Zakázané příkazy

Osobní nástroje