#include "Watchaccess.h" #define SH_SUPRAVEGHERE "sh shS " extern time_t time (); main (argc, argv) int argc; char *argv[]; { Mesaj *CerereConst, *CerereInterv, *RaspunsConst, *RaspunsInterv, *Initializare; struct sockaddr_in Constatare, Interventie; struct hostent *hp; char s[MAX], d[MAX], *p; int n, l, i, sdc, sdi, lv, cv, lf, cf; FILE *f; /* Initializari */ if ((argc < 6) || argc % 3 != 0)/* Verifica nr. de argumente */ ERR ("Supraveghere", 301); n = argc / 3 - 1; for (i = 3 + 2 * n, l = 0; i < argc; i++) l += strlen (argv[i]) + 1; /* Depune argumentele in mesajul Initializare */ Initializare = Alloc ((2 * n + 5) * sizeof (short) + l); AtribuireI (Initializare, 1, 2 * n + 2); AtribuireI (Initializare, 2, n); AtribuireI (Initializare, 3, atoi (argv[1])); AtribuireI (Initializare, 4, atoi (argv[2])); for (i = 0; i < n; i++) {/* Converteste & muta in Initializare */ AtribuireI (Initializare, 5 + i, atoi (argv[3 + i])); AtribuireI (Initializare, 5 + n + i, atoi (argv[3 + n + i])); AtribuireS (Initializare, i, argv[3 + 2 * n + i]); } srand ((int) time ((long *) 0));/* Initializeaza generatorul */ /* Prepara Cerere */ gethostname (s, MAX); CerereConst = Alloc (4 * sizeof (short) + strlen (s) + 1); AtribuireI (CerereConst, 1, 1); AtribuireI (CerereConst, 2, 1); AtribuireI (CerereConst, 3, getuid ()); AtribuireS (CerereConst, 0, s); signal(SIGCHLD, SIG_IGN); /* Pentru evitare zombie */ /* Ciclul principal de reiterare */ for (;; sleep (ValoareI (Initializare, 3) + rand () % (ValoareI (Initializare, 4) - ValoareI (Initializare, 3)))) /* Apel aleator intre argv[1] si argv[2] secunde */ { for (i = 0; i < n; i++) { /* pentru fiecare server */ if (fork () == 0) { f = popen("date", "r"); fgets(s, MAX, f); fclose(f); s[strlen(s)-1] = 0; /* Pregateste masina, data, ora */ sprintf(d, "S: %s %s", ValoareS (Initializare, i), s); if ((hp = gethostbyname (ValoareS (Initializare, i))) == NULL) /* Obtine adresa IP a serverului */ ERR (d, 302); /* Prepara adresele socket ale masinii i */ memset ((char *) &Interventie, 0, sizeof (Interventie)); memset ((char *) &Constatare, 0, sizeof (Constatare)); Constatare.sin_family = AF_INET; Interventie.sin_family = AF_INET; bcopy (hp->h_addr, (char *)&Constatare.sin_addr.s_addr, hp->h_length); bcopy (hp->h_addr, (char *)&Interventie.sin_addr.s_addr, hp->h_length); Constatare.sin_port = htons (PORT_CONSTATARE); Interventie.sin_port = htons (PORT_INTERVENTIE); /* Initiaza comunicarea cu al i-lea server Constatare */ if ((sdc = socket (AF_INET, SOCK_STREAM, 0)) < 0) ERR (d, 303); if (connect (sdc, (struct sockaddr *) &Constatare, sizeof (Constatare)) != 0) { MES (d, 304); continue; } /* Cere starea de la Constatare */ if (Send (sdc, (char *) CerereConst, ValoareI (CerereConst, 0)) < 0) ERR (d, 305); /* Citeste raspunsul de la Constatare */ if (Recv (sdc, (char *) &l, sizeof (short)) < 0) { MES (d, 306); continue; } l = ntohs (l); RaspunsConst = Alloc (l); if (Recv (sdc, (char *) RaspunsConst + sizeof (short), l - sizeof (short)) < 0) { MES (d, 307); continue; } /* Valideaza raspunsul de la Constatare */ if ((!Valid (RaspunsConst) || (ValoareI (RaspunsConst, 1) != 1) || (ValoareI (RaspunsConst, 2) != 4) || (ValoareI (RaspunsConst, 3) != ValoareI (Initializare, 5 + i)) || (strstr (ValoareS (Initializare, i), ValoareS (RaspunsConst, 0)) == 0))){ MES (d, 308); continue; } close (sdc); /* Prelucreaza starea si pregateste interventiile */ /* Creaza fisierul masina.NETSTAT */ sprintf (s, "%s.NETSTAT", ValoareS (RaspunsConst, 0)); if ((f = fopen (s, "w")) == NULL) ERR (d, 309); fprintf (f, "%s", ValoareS (RaspunsConst, 1)); fclose (f); /* Creaza fisierul masina.WHO */ sprintf (s, "%s.WHO", ValoareS (RaspunsConst, 0)); if ((f = fopen (s, "w")) == NULL) ERR (d, 310); fprintf (f, "%s", ValoareS (RaspunsConst, 2)); fclose (f); /* Creaza fisierul masina.PS */ sprintf (s, "%s.PS", ValoareS (RaspunsConst, 0)); if ((f = fopen (s, "w")) == NULL) ERR (d, 311); fprintf (f, "%s", ValoareS (RaspunsConst, 3)); fclose (f); /* Prelucreaza pentru interventie */ /* Extrage din fisierele de mai sus userii in culpa */ sprintf (s, "%s %s", SH_SUPRAVEGHERE, ValoareS (RaspunsConst, 0)); Delete (RaspunsConst); f = popen (s, "r"); fscanf (f, "%d\n%d\n%d\n%d\n", &lv, &cv, &lf, &cf); /* Creaza mesajul Cerere la Interventie */ l = 6*sizeof(short)+strlen(ValoareS(CerereConst, 0))+1; CerereInterv = Alloc (l + cv + cf + 2); AtribuireI (CerereInterv, 1, 3); AtribuireI (CerereInterv, 2, 3); AtribuireI (CerereInterv, 3, ValoareI (CerereConst, 3)); AtribuireI (CerereInterv, 4, lv); AtribuireI (CerereInterv, 5, lf); AtribuireS (CerereInterv, 0, ValoareS (CerereConst, 0)); p = (char *) CerereInterv + l; for (l = 0; l < cv; l++, p++) (*p) = fgetc (f); /* Scrie in mesaj userii */ (*p) = 0; /* cu procese vechi */ p++; for (l = 0; l < cf; l++, p++) (*p) = fgetc (f); /* Scrie in mesaj userii */ (*p) = 0; /* fara angajamente */ fclose (f); /* Deschide conexiunea cu Interventie */ if ((sdi = socket (AF_INET, SOCK_STREAM, 0)) < 0) ERR (d, 312); if (connect (sdi, (struct sockaddr *) &Interventie, sizeof (Interventie)) != 0){ MES (d, 313); continue; } /* Trimite mesajul la Interventie */ if (Send (sdi, (char *) CerereInterv, ValoareI (CerereInterv, 0)) < 0) ERR (d, 314); /* Citeste confirmarea de la interventie */ if (Recv (sdi, (char *) &l, sizeof (short)) < 0){ MES (d, 315); continue; } l = ntohs (l); RaspunsInterv = Alloc (l); if (Recv (sdi, (char *) RaspunsInterv + sizeof (short), l - sizeof (short)) <0){ MES (d, 316); continue; } /* Valideaza raspunsul confirmarii la Interventie */ if ((!Valid (RaspunsInterv) || (ValoareI (RaspunsInterv, 1) != 1) || (ValoareI (RaspunsInterv, 2) != 1) || (ValoareI (RaspunsInterv, 3) != ValoareI (Initializare, 5 + n + i)) || (strstr (ValoareS (Initializare, i), ValoareS (RaspunsInterv, 0)) == 0))){ MES (d, 317); continue; } close (sdi); exit (0); /* Interventia a confirmat, procesul se termina */ } /* if fork() */ } /* for i */ for (i = 0; i < n; i++) wait (0); /* Asteapta procesele */ } /* Ciclul de supraveghere */ } /* main */ /* Programul 3.22 Textul sursa al clientului Supraveghere.c */