#!/usr/bin/perl
# Skrypt wyswietlajacy uzytkownikom informacje o tym ze maja dostep do 
# internetu zablokowany, wyswietlajacy informacje o zlej konfiguracji
# komputera, lub wyswietlajacy komunikaty od administratorow ktorych
# uzytkownik nie moze nie przeczytac.
# Skrypt kozysta z bazy danych LMS
#
# Autor: Rafal Ramocki
# 	 maniac@interblock.pl
# Wersja: 0.0001 beta "jeszcze nie dziala"

### konfiguracja

# naglowek
$header = "<CENTER><H2>InterBlock</H2>";



# pouczenia
$poucz_ok = "<BR>W sumie wyglada na to ze wszystko jest w porzadku.\
	    <BR> Jezeli ten komunikat nie zniknie w przeciagu 5-u minut to\
    	    skontaktuj sie z administratorem.";
$poucz_not_ok = "</b><br><hr width=\"150\"><font size=\"2\">\
		Od momentu dopelnienia powyzszych formalnosci \
		moze uplynac okolo 5-u minut<br>zanim system ponownie\
		odblokuje dostep do internetu</font>";

#diagnozy
$bad_sysname = "Prawdopodobnie masz zle ustawiona nazwe komputera.";
$bad_ip = "Prawdopodobnie masz zle ustawiony adres IP.";
$bad_worgroup = "Prawdopodobnie bladnie wpisales nazwe grupy roboczej,\
		 lub nie masz wlaczonego udostepniania plikow. W zwiazku \
		 z tym nie widac twojego komputera w otoczeniu sieciowym.";

# to co ma sie pojawic na samym dole
$stopka="<BR><font color=\"green\" size=\"2\"><hr width=\"450\"><B>\
	Adres biura Stowarzyszenia Interblock<BR>\
	ul. Okulickiego 56c/12<BR>\
	tel. 8430141</B><BR><BR>
	</FONT><font color=\"green\" size=\"0\">Kontakt alarmowy<br>Administrator: Rafal Ramocki <br>\
        tel: 603120750<br>Mail: <a href=\"mailto:maniac\@interblock.pl\">maniac\@interblock.pl<a></font><BR>";	

# grupa robocza oczekiwana u lusera
$workgroup="INTERBLOCK";

# konfiguracja bazy danych
# nazwa bazy danych
my $lms_db="lms";

# uzytkownik bazy danych
my $login="lms";

# haslo do bazy danych
my $haslo="LmSrulez";

# tytuł okna
$title = "Bloker internetu / Tester poprawnosci konfiguracji";

#adres nblookup
$nmblookup="/usr/bin/nmblookup";

use strict;
use CGI;
use DBI;

use vars qw($IP_OK $SYSNAME_OK $SYSNAME_IP_OK $WORKGROUP_OK $MESSAGES_WAIT);
use vars qw($Usysname $Uworkgroup);
use vars qw($msg);
use vars qw($nmb @hosts $host);
use vars qw( @nmbout $nmblookup);

use vars qw($hosts_file $messages_file);
use vars qw($msg_remove_script_url);
use vars qw($workgroup $UIP $ip);
use vars qw ($mail_of_admin $tel_of_admin $name_of_admin);
use vars qw($main_delay);
use vars qw (@users $user $name $users_file);
use vars qw ($Name $ID $Minus $Grupa);

use vars qw ($query);
use vars qw ($dbh_nodes $sth_nodes $ownerid $info $oid $i $stopka);
use vars qw ($title $header $body $bad_sysname $bad_ip $bad_workgroup);
use vars qw ($admininfo $poucz_not_ok $poucz_ok $id $ip);

my $data_source="DBI:mysql:$lms_db";
	

# inicjacja
# pobieram adres ip komputera ktory sie ze mna laczy
$query = new CGI;

# ESTEPNEI USTALAM WARTOSCI FLAG TESTOWYCH
$IP_OK="NO";
$SYSNAME_OK="NO";
$SYSNAME_IP_OK="NO";
$WORKGROUP_OK="NO";
$MESSAGES_WAIT="NO";


# wyswietlam naglowek
print $query -> header,
      $query -> start_html (-title=>$title);

# globalna zmienna przechowujacy adres IP komptuera ktory sie z nami laczy
$UIP = $query -> remote_addr();

print $header;

# polacz
$dbh_nodes = DBI -> connect($data_source,$login,$haslo)
    or die "Blad polaczenia z baza danych";

# polacz sie z baza danych

if (! $query -> param)
  {
    # sprawdzam najpierw grupe robocza delikwenta      
    open (NMBOutput, "$nmblookup -A $UIP |");
    @nmbout=<NMBOutput>;
    close (NMBOutput);
    ($Usysname)=split (" ", $nmbout[2]);
    foreach $nmb (@nmbout)
      {
        $Name=""; $ID=""; $Minus="";$Grupa="";
        ($Name, $ID, $Minus, $Grupa) = split (" ", $nmb);
        if (($Grupa eq "<GROUP>") and ($ID eq "<1e>")) {$Uworkgroup=$Name}
      }

    ### Polacz sie z baza i wyciagnij adres nazwe komputera po adresie IP
    $sth_nodes = $dbh_nodes -> prepare ("SELECT `name`, `ownerid` FROM `nodes` WHERE 1 AND ipaddr='$UIP'");
    $sth_nodes -> execute
        or die "Nie moge wykonac execute";
    while (($name,$ownerid) = $sth_nodes -> fetchrow())
      {
        $IP_OK="YES"; 			# jezeli ip jest w bazie to znaczy ze jest okej
        if ($name eq $Usysname) {$SYSNAME_OK="YES"};	#nazwa w bazie = nazwie kompa - zaznaczyc
        $oid = $ownerid;
      };
    $sth_nodes -> finish;
    
    ### jezeli nazwa i ip sa okej to ustaw odpowednia flage - wygoda?
    if (($SYSNAME_OK eq "YES") and ($IP_OK eq "YES")) {$SYSNAME_IP_OK ="YES"};
    ### DO PREROBKI
    if ($Uworkgroup eq $workgroup) {$WORKGROUP_OK="YES"};
    
    ### czytam i sprawdzam czy uzytkownik nie ma przypadkiem wiadomosci administracyjnych
    $sth_nodes = $dbh_nodes -> prepare ("SELECT `info` FROM `users` WHERE 1 AND `info` \
    				    IS NOT NULL AND `info` NOT LIKE '' AND `id`=$oid");
    
    $sth_nodes -> execute
        or die "nie moge wykonac execute";
      
    while (($info) = $sth_nodes -> fetchrow())
        {
            $MESSAGES_WAIT="YES";                       # jest wiadomosc, ustaw flage
	    $i = $info;
        };
     $sth_nodes -> finish;
    

    
    # cialo testera (wyswietla konfiguracje, niepokazuje sie gdy dostep do
    # neta zablokowany administracyjnie
    $body = "<H3>....................</H3>\
    	<H2>DOSTEP DO INTERNETU ZABLOKOWANY!!!</H2>\
    	<H3>....................</H3>\
	Najczestsza przyczyna ogladania tej wiadomosci<BR>\
       jest bladna konfiguracja TWOJEGO komputera, \
       <BR>sprawdz czy wszystko dobrze ustawiles. \
       <FONT size=\"2\"><p>W razie watpliwosci\
       <A href=\"http://172.16.0.5/konfiguracja/index.html\"> tutaj</A>\
       dowiesz sie jak <br> masz skonfigurowac swoj komputer</font>\
       <br><b><font size=\"5\">Twoja obecna konfiguracja:</font></b>\
       <BR>Twoj adres ip: <B> $UIP</B><BR>\
       Twoja nazwa komputera: <B>$Usysname</B><BR>\
       Twoja grupa robocza: <B>$Uworkgroup</B><BR>";

    # wiadomosc administracyjna
    $admininfo = "</b><br><HR width=\"150\">WIADOMOSC ADMINISTRACYJNA<b><H1> $i\
	    </H1><HR width=\"400\">Klikajac <Font size=\"5\">\
	    <a href=\"http://adm-info.interblock.pl/cgi-bin/configtest.cgi?ip=$UIP&id=$oid\">tutaj</FONT>
	    </a></b> usuniesz wiadomosc i odblokujesz sobie dostep do internetu<b>";


    if ( ! ($MESSAGES_WAIT eq "YES")) {
        print $body;
    }
    print "<FONT COLOR=\"RED\">";
    if (($WORKGROUP_OK eq "NO") or ($SYSNAME_OK eq "NO") or ($IP_OK eq "NO") or ($MESSAGES_WAIT eq "YES"))
      {
        if (($WORKGROUP_OK eq "NO") or ($SYSNAME_OK eq "NO") or ($IP_OK eq "NO"))
          {
            print "<HR width=\"250\">Diagnoza:<BR><B>";
            if (($IP_OK eq "YES") and ($SYSNAME_OK eq "NO"))
              {print $bad_sysname}
            elsif (($IP_OK eq "NO"))
    	  {print $bad_ip;}
            elsif ($WORKGROUP_OK eq  "NO")
	      {print $bad_workgroup;}
          }
        if ($MESSAGES_WAIT eq "YES")  # SPRAWDZAM CZY DLA UZYTKOWNIKA NIE MA PRZYPADKIEM JAKICHS KOMUNIAKATOW
          {
            print $admininfo;
          }
            print $poucz_not_ok;
      }
    else {
    print $poucz_ok;
    }

  }
else
  {
    if (($query -> param("ip")) and ($query -> param ("id")))
	{
	  $ip = $query -> param ("ip");
	  $id = $query -> param ("id");
	  
	    $sth_nodes = $dbh_nodes -> prepare ("SELECT `info` FROM `users` WHERE 1 AND id='$id'");
	    $sth_nodes -> execute
	        or die "Nie moge wykonac execute";
	    while (($info) = $sth_nodes -> fetchrow())
	      {
    		$oid = $info;
	        print "Wiadomosc administracyjna <P><i><b><font color=red>'$info'</Font></B></i><P>";
	      };
	    $sth_nodes -> finish;
	    $sth_nodes = $dbh_nodes -> prepare ("UPDATE `users` SET `info`='' WHERE `id`='$id' LIMIT 1");
	    $sth_nodes -> execute
	        or die "Nie moge wykonac execute";
	    print " zostala usunieta. <BR>W caigu kilku minut Internet powinien zostac odlbokowany automatycznie."
	}
    else {print "bladne zapytanie";}
  };    
print $stopka;
	
print "</CENTER>", $query -> end_html;
