#!/usr/bin/perl -w ############################################################################# # File Name : upserver.pl # System : Linux 7.x / other # Sprache : Perl Script 5.6.1 Build 626 # Verzeichnis : -- # Ersteller : PSE Pennella System Engineering, Antonio Pennella # Datum : 19.01.2002 # Beschreibung : Dieses Programm zeigt viele nützliche Informationen über das # RedHat System an. # Parameter : --- # Inputdatei : upserver_userinfo.txt (ab Version 1.30!) # Externe Url : pse.pointclark.net/downloads/upserver_CC_user.txt # (ab Version 1.31!) # ------------------------------------------------------------------------- # Change-History: # --------------- # Date Ver Typ Discription # ------------------------------------------------------------------------ # 20020119 1.00 ADD Basic version for Linuxserver RedHat 7.2 # # 20020501 1.10 UPD Change stringmanipultation from substr to split # # 20020529 1.11 UPD Change fontssize to small # # 20020609 1.12 UPD Dateformat changed to 24hours (DATE +%T) # Changed layout, new variables for copyright etc. # # ------------------------------------------------------------------------- # 20020629 1.20 UPD Change stringmanipultation from substr to split for UPTIME # ADD Display DiskSpace with command "df" # ADD Show now all connected user # # 20020703 1.21 UPD Problem with Array and uptime. Use function "index" to # locate the right days! # # 20020704 1.22 ADD Display current time and date (input from Andy!) # # 20020704 1.23 ADD Check if user are log on or not. Show message # ADD URL link www.pse on the bottom # # 20020706 1.24 ADD E-Mail, URL etc. von PSE, Toni Pennella on bottom # ADD View sourcecode and download programm # # 20020713 1.25 ADD URL link to other CC users # UPD Title with variable length # ADD Michi link http://morgenstern.pointclark.net # # 20020717 1.26 UPD Check Redhat version with cat /proc/version # 20020812 ADD Check Clarkconnect Version /etc/clarkconnect/release # # 20020901 1.27 ADD Andy Streuli link http://streuli.pointclark.net # 20020915 ADD Reto Rothmayr http://rothmayr.pointclark.net # 20021001 ADD Segmueller and add "Date since" in link # 20021005 UPD Version 1.27 released # # ------------------------------------------------------------------------- # 20021025 1.30 ADD additional information with owner, location etc. # update file upserver_userinfo.txt for user info # 20021103 UPD Version 1.30 released # # 20021109 1.31 ADD import external table for all url user upserver_CC_user.txt # 20021110 b-1 UPD display wrong RedHat version (Bug) # 20021110 b-2 UPD display short external and internal ip address # 20021110 b-3 UPD modify all comment lines # 20021115 UPD Version 1.31 released # # 20021119 1.32 ADD on the title of Internet Explorer add ownername # 20021119 b-2 ADD first link test on top of page # 20030101 UPD Version 1.32 released # # 20030107 1.33 ADD change df-m to df -h # 20030213 b-2 ADD proctype, etc. -> cat /proc/cpuinfo /proc/meminfo # 20030219 b-3 ADD $ENV like Apacheversion, Client-IP, Browsertype etc. # reorder all output formats, add new quicklinks # 20030223 B-4 ADD typ of processor and cache size # 20030601 UPD Version 1.33 released # # ------------------------------------------------------------------------- # 20030614 2.00 UPD CC changed the path for CC version # 20030808 UPD Version 2.00 released # # 20040218 2.1 UPD Fix problem with ADSL WAN address # 20040301 b-2 UPD Change UrlDB from pse.pointclark.net to the extern # address www.pse.ch/downloads/upserver (link is faster!) # UPD Bugfix if this script is installed on CC 1.x version # /etc/release -> CC 2.x / etc/clarkconnect/release -> CC 1.x # b-3 ADD Counter on Upserver # b-4 DEL delete own counter function. use external webcounter # b-5 ADD Memory usage and Swap info # 20040518 b-6 ADD Display Memory and swap usages in % # 20040519 b-7 ADD try alternate path for db access # 20040520 2.10 UPD Version 2.10 released # -------------------------------------------------------------------------- # 20040821 2.20 UPD delete unused codes # b-1 # -------------------------------------------------------------------------- # 20050130 3.00 UPD changed /proc/nic to lspci because system is Fedora Core 2 # b-1 first tests with CC 3.0 beta1 to beta4 # b-2 changed /proc/meminfo to free # b-3 problem with special character öäü -> change to ae, oe # 20050203 3.00 UPD Version 3.00 released # 20060122 b-1 bugfix of memory and cpu # b-2 add bogomips value # 20061230 b-3 check language by ADSL settings # display MTU Size on WAN interface # 20071115 3.10 UPD Version 3.10 released # -------------------------------------------------------------------------- # # # # for future Releases: # -------------------- # Date From Typ Discription # ------------------------------------------------------------------------ # open: # 2005xxxx Toni ADD # # done: # 20021110 Toni ADD on top add a linkline for quick jump -> impl at 1.32 # 20030217 Toni ADD additional Server- and Clientinformation with $ENV ->1.33 # 20030220 Toni ADD Counter on upserver -> impl. at 2.1 # 20040520 Toni ADD display (ADSL) or (briged) at IP Address -> 2.1 # 20040520 Toni ADD on memory usage display in % -> 2.10 # # Tipps: # Ersetze: $Text =~ s/[a-z]| //gi; # ############################################################################# # # Installationsanleitung via SSH Connection # ----------------------------------------- # # login as root # cd /tmp # wget -O upserver-install.sh -P /tmp http://pse.pointclark.net/downloads/upserver/upserver-install.sh # sh upserver-install.sh # # testen von upserver.pl via Browser (z.b. http://pse.pointclark.net/cgi-bin/upserver.pl) # # ------------------------------------------------------------------------- # # Installationsanleitung Manuel # ----------------------------- # # 1. copy Perl-Programm UPSERVER.PL und UPSERVER_USERINFO.TXT ins # Verzeichnis /var/www/cgi-bin # Befehl: cp /home/shared/upserver.pl /var/www/cgi-bin/ # Befehl: cp /home/shared/upserver_userinfo.txt /var/www/cgi-bin/ # # 2. dem Script upserver.pl die nötigen Ausführungsrechte geben # Befehl: chmod 755 /var/www/cgi-bin/upserver.pl # # 3. editiere das File upserver_userinfo.txt fuer persoenliche Userinfo # Befehl: nano /var/www/cgi-bin/upserver_userinfo.txt # Nano Tipps: (Speichern mit Ctrl-O, Exit mit Ctrl-X) # # 4. Test des Perlscript via http://mydomain.pointclark.net/cgi-bin/upserver.pl # (mydomain durch eigene Domainnamen/Clakconnectnamen ersetzen) # ############################################################################# use Socket; use FileHandle; # Uebergabe des Wertes # -------------------- #12345678901234567890123456789012345678901234567890123456789012345678901234567890 # 10 20 30 40 50 60 70 80 #9:46pm up 42 days, 2:56, 4 users, load average: 0.18, 0.14, 0.08 #Linux gw-pse-01 2.4.9-13 #1 Tue Oct 30 20:05:14 EST 2001 i586 unknown ############################################################################# # Copyright, Version und Programmierer # ------------------------------------ $copyright = 'PSE Pennella System Engineering, 8544 Sulz, Switzerland ' ; $ver = 'V3.10 (Build: 15.11.2007)' ; $verFree = 'V3.10 (Build: 15.11.2007)' ; $pgmname = 'upserver.pl (Perl-Script)' ; $owner = 'Antonio Pennella' ; $ownerUrl = 'www.pse.ch' ; $mailto = 'mailto:antonio.pennella@pse.ch' ; $httpUrl = 'http://www.pse.ch' ; $UrlDB = 'http://pse.pointclark.net/downloads/upserver/upserver_CC_user.txt' ; $UrlDB2 = 'http://www.pse.ch/downloads/upserver/upserver_CC_user.txt' ; # Liest upserver_userinfo.txt Datei ein # ------------------------------------- &read_userinfo ; # Liest die Datei upserver_CC_user.txt vom zentralem Server www.pse.ch ein # ------------------------------------------------------------------------ $rcUrl = getURL($UrlDB , 'dummy.txt' ); if( $rcUrl eq 1 ) { # falls Url nicht gefunden wurde $rcUrl = getURL($UrlDB2 , 'dummy.txt' ); # versuch mit der alternativen URL if( $rcUrl eq 1 ) { @url_result = "

\nDie zentrale Datenbank konnte nicht gefunden werden. " ; } } # Da der Uptime Befehl je nach Zeit des Aufrufs die Arrayreihenfolge ändert, muss der String # mit der Funtkion "Index()" auf die genaue Position auseinandergenommen werden # # ein Beispiel: # ------------- # Position 0123456789012345678901234567890 # Ausgabe von Uptime: 2:51pm up 103 days, 20:01, # ---------------------------------------------------------------------------------------------- # Mit Index wird nun auf das Wort "up" gesucht und anschliessen das Wort "day". # Somit kann man nun das Datum zwischen diesen zwei Werte herausholen mit der Funktion "substr" # ---------------------------------------------------------------------------------------------- # UPTIME # ------ $uptime = `uptime` ; # Uptime aufrufen @uptime = split(/ /, $uptime); # in ein Array schreiben mit Trennzeichen "Space" $stime = `date +%T` ; # aktuelle Zeit holen $sdate = `date +%d.%m.%Y` ; # aktuelles Datum holen $sdatex = chomp( $sdate ); # Datum Endzeichen herausnehmen (CR13) $who = `who` ; # zeigt angemeldete User an # nun wird mit Index() die Position von "day" herausgefunden # ---------------------------------------------------------- $up_ind1 = index ($uptime, 'up' ) + 3 ; # + 3, dann ist man auf der Startposition vom Tag $up_ind2 = index ($uptime, 'day' ) - 1 ; # - 2, dann ist man auf der Endposition $up = substr($uptime, $up_ind1, $up_ind2 - $up_ind1 ) ; # nun wird mit Index() die Position von "time" herausgefunden # ----------------------------------------------------------- $time_ind1 = index ($uptime, ':', $up_ind2 ) -2 ; # Es wird auf das Zeichen ":" gesucht $time_new = substr($uptime, $time_ind1, 5 ) ; # nun die Zeit 5 Stellen abfuellen # UNAME & CC Version # ------------------ $uname = `uname -a`; # Command aufrufen @string1 = split(/ /,$uname); # in ein Array schreiben mit Trennzeichen "Space" $srvtyp = @string1[0] ; # Servertyp $srvname = @string1[1] ; # Servername $kernel = @string1[2] ; # Kernel $kerneld = "@string1[4] @string1[6].@string1[5].@string1[9], Zeit: @string1[7]" ; $redhat = `cat /etc/redhat-release` ; # zeigt RedHat Version an $cc_ver = `cat /etc/release` ; # zeigt Clarkconnect Version an if ($cc_ver eq '' ) { # wenn es kein CC > V2.0 ist, wird eine andere Datei gecheckt $cc_ver = `cat /etc/clarkconnect/release`; # Datei von CC 1.2 und 1.3 } # IFCONFIG # -------- # Extrahiert externe IP Adresse / check ob es ETH0 oder PPP0 (ADSL) ist $ifconfExt = `/sbin/ifconfig | /bin/grep -A 4 eth0 | /bin/awk '/inet/ { print \$2 }' | /bin/sed -e s/addr://`; if ($ifconfExt eq '' ) { $ifconfExt = `/sbin/ifconfig | /bin/grep -A 4 ppp0 | /bin/awk '/inet/ { print \$2 }' | /bin/sed -e s/addr://`; } if ($ifconfExt eq '' ) { $ifconfExt = `/sbin/ifconfig | /bin/grep -A 4 ppp0 | /bin/awk '/inet/ { print \$2 }' | /bin/sed -e s/Adresse://`; } # Extrahiert MTU Size auf externe IP Adresse $ifconfMTU = `/sbin/ifconfig | /bin/grep -A 4 eth0 | /bin/awk '/MULTICAST/ { print \$5 }' | /bin/sed -e s/MTU://`; if ($ifconfMTU eq '' ) { $ifconfMTU = `/sbin/ifconfig | /bin/grep -A 4 ppp0 | /bin/awk '/MULTICAST/ { print \$5 }' | /bin/sed -e s/MTU://`; } # Extrahiert interne IP Adresse $ifconfInt = `/sbin/ifconfig | /bin/grep -A 4 eth1 | /bin/awk '/inet/ { print \$2 }' | /bin/sed -e s/addr://`; # DISKSPACE # --------- $df = `df -h`; # Diskspace Command aufrufen # CPU-, MEM- & NIC-INFO # --------------------- $cpuinfo = `cat /proc/cpuinfo | /bin/grep "cpu MHz" `; # Anzeigen von CPU Informationen @cpuinfo = unpack('A10 A5' , $cpuinfo) ; # 2 Wert 5 Stellen abschneiden $cpuinfo = @cpuinfo[1] ; # Wert 1 übergeben # Anzeigen von CPU Typ $cputyp = `cat /proc/cpuinfo | /bin/grep "model name" | /bin/sed -e s/"model name"// | /bin/sed -e s/":"//`; @cputyp = unpack('A2 A34 A20' , $cputyp ) ; $cputyp = @cputyp[1] ; $cpucache = `cat /proc/cpuinfo | /bin/grep "cache size" | /bin/sed -e s/"cache size"// | /bin/sed -e s/":"//`; @cpucache = unpack('A2 A10' , $cpucache ) ; $cpucache = @cpucache[1] ; if ($cpucache eq '' ) { $cpucache = "kein" } $mips = `cat /proc/cpuinfo | /bin/grep "bogomips" | /bin/sed -e s/"bogomips"// | /bin/sed -e s/":"//`; @mips = unpack('A2 A4', $mips ) ; $mips = @mips[1] ; $meminfo = `cat /proc/meminfo | /bin/grep "MemTotal" `; # Anzeigen von MEMORY Informationen @meminfo = unpack('A15 A7' , $meminfo) ; # 2 Wert 7 Stellen abschneiden $meminfo = int(@meminfo[1] / 1024) ; # Ganzzahl und in MB teilen (sollte 1024 sein) $meminfo2 = `free`; # Anzeigen von MEMORY Informationen # NIC Karten # ---------- $nicinfo = `lspci | /bin/grep "Ethernet" | /bin/sed -e s/controller//`; # Anzeigen von Ethernet Karten # Infos ueber Client und Server (mehr Info unter: http://selfhtml.teamone.de/cgiperl/intro/umgebungsvariablen.htm) # ----------------------------- $env_1 = $ENV{'REMOTE_ADDR'} ; # Enthält die IP-Adresse des Server-Rechners $env_2 = $ENV{'HTTP_USER_AGENT'} ; # welchen Browser ein Anwender verwendet. $env_3 = $ENV{'HTTP_VIA'} ; # Zugriff aufs Internet via diesem Proxy $env_4 = $ENV{'QUERY_STRING'} ; # Abfragen, ob Paramter übergeben wurden # Titel wird zusammengestellt # --------------------------- $title1 = 'Clarkconnect Statistik fuer' ; # erster Titel $title2 = $zeile1_2 ; # Eigentuemer einlesen $length = length($title1) + length($title2) + 1 ; # Länge des Titel1 und 2 wird ermittelt $title_u = '-' x $length ; # nun wird anhand des Titel1+2 das Unterstreichen erstellt # Prüfen ob User angemeldet sind # ------------------------------ $whocheck = index ( $who , ':' ) ; if ($whocheck == -1 ) { $who = "zur Zeit sind keine User angemeldet! \n" } else { $who = "\n

$who" } # Start von HTML Ausgabe # ---------------------- print "Content-type: text/html\n\n"; print "CC-Box Uptime Statistik $ver / $title2"; print "
";

print "" ;                # Link (Anker) zu Top Seite
print "

$title1 $title2

"; print "

$title_u

"; print "
Programm-Name : $pgmname / Version: $ver
\n"; # Quick-Links anzeigen print "Quick-Links : UserInfo - Server-Info - Client-Info - andere CC User - CC Doku - Download" ; print "

--------------------------------------------------------------------------

\n"; print "

CC Version : $cc_ver

"; print "

Server laeuft seit: $up Tagen und $time_new Stunden

\n"; print "

Akt. Datum / Zeit : $sdate / $stime

"; print "

Angemeldete User : $who

"; # Anker/Textmarke setzten print "" ; # Link (Anker) zu Userinfo print "
Top
" ; print "

----------------- User Informationen -------------------------------------

\n"; print "

@lines

"; # Anker/Textmarke setzten print "" ; # Link (Anker) zu Userinfo print "
Top
" ; print "

----------------- Server Systeminformationen -----------------------------

\n"; print "

Server Name : $srvname

\n"; print "

Linux Version : $redhat

"; print "

Kernel Version : $kernel generiert am $kerneld

\n"; print "

Externe IP (Wan) : $ifconfExt"; print "

MTU Size (Wan) : $ifconfMTU\n"; print "

Interne IP (Lan) : $ifconfInt

"; print "

Server CPU/MEM : Processor = $cpuinfo MHz / Typ: $cputyp / Cache: $cpucache

" ; print "

: Memory = $meminfo MB

"; print "

: BogoMIPS = $mips (Millionen Instruktionen pro Sekunde)

\n"; print "

Memoryauslastung :

$meminfo2\n"; print "

NIC-Karten :

$nicinfo \n"; print "

Disk Platz :

$df\n"; # Anker/Textmarke setzten print "" ; # Link (Anker) zu Userinfo print "
Top
" ; print "

----------------- Client Informationen -----------------------------------

"; print "

\nDeine IP-Adresse : $env_1

"; print "

\nDein Browsertyp : $env_2

"; print "

\nZugriff via : $env_3

\n"; print "

--------------------------------------------------------------------------

\n"; # Anker/Textmarke setzten print "" ; # Link (Anker) zu andere Users print "
Top
" ; print "
Diese Informationen werden von einer zentralen Datenbank eingelesen: @url_result
" ; print "

--------------------------------------------------------------------------

"; print "
Counter: @counter
" ; # Fusszeile generieren # -------------------- # Anker/Textmarke setzten #print "
Top
" ; print "" ; # Link (Anker) zu Doku print "

Copyright: $copyright

"; print "

Internet : $ownerUrl

" ; print "

E-Mail : $owner

" ; print "

" ; # Anker/Textmarke setzten print "
Top
" ; print "" ; # Link (Anker) zu Download # Downloadzeilen erstellen # ------------------------ print "

Download von Upserver.pl Programm:

" ; print "

Source : Anzeigen Sourcecode

" ; print "

Download : Download Programm UpServer.zip

" ; print "

Download : Download Programm UpServer-Beta.zip

" ; print "

Version : $verFree

" ; print "
"; print ""; ######################################################################################################## ## S U B R O U T I N E N ######################################################################################################## # Liest Userinformationen aus der Datei upserver_userinfo.txt fuer Clarkconnet ein # -------------------------------------------------------------------------------- sub read_userinfo { $file = "upserver_userinfo.txt"; # Userinformationen $rc = open(OUTFILE, $file); # File einlesen if( not defined( $rc )) { # falls Datei nicht vorhanden ist @lines = "Datei -> upserver_userinfo.txt <- konnte nicht gefunden werden. Bitte unter /var/www/cgi-bin/ die Datei anlegen. Besten Dank!" ; $zeile1_2 = "* DATEI nicht vorhanden ! *" ; return() } @lines = ; # in ein Array schreiben close (OUTFILE); # File schliessen $zeile1 = @lines[0] ; # Zeile 1 uebergeben in String $zeile2 = @lines[1] ; # - dito - $zeile3 = @lines[2] ; # $zeile4 = @lines[3] ; # $zeile5 = @lines[4] ; # @lines1 = split(/:/, $zeile1 ); # Spliten nach dem Doppelpunkt chomp( @lines1 ) ; # \n aus Array entfernen $zeile1_2 = @lines1[1] ; # Zeile 1 nochmals Spliten in 2 Variablen $zeile1_2 =~ s/ // ; # erste Leerzeile entfernen } # Liest Tabelle ein fuer alle CC User (wird vom zentralem Server pse.pointclark.net eingelesen) # --------------------------------------------------------------------------------------------- # A real simple Perl function to grab a file from an HTTP URL. This won't # work with other types of URLs such as FTP, FILE, LDAP, etc. The file # will be saved locally at the specified location. A return value of 0 # indicates an error. Note that no attempt is made to adjust EOL values # in the retrieved HTML file to match the local environment. # sub getURL { my $result = ''; # Variable $result initialisieren shift =~ /^http:\/\/(.*?)(\/.*)/; # Parse server and request data my ($http_server,$http_request) = ($1,$2); unless ($http_request) { $http_request = '/'; } my $local_filename = shift; my $iaddr = inet_aton($http_server); # Set up the socket and make a connection my $paddr = sockaddr_in(80, $iaddr); socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')); connect(SOCKET, $paddr) || return 0; SOCKET->autoflush(1); # Send the request and store the file print SOCKET "GET $http_request HTTP/1.0\r\nHost: $http_server:80\r\n\r\n"; while() { $result .= $_ } close(SOCKET); # Socket schliessen $result =~ s/^.*\r\n\r\n//s; # Strip HTTP header @url_result = $result ; # Werte in ein Array schreiben chomp(@url_result) ; # \n Zeichen extrahieren falls vorhanden return $result; # Returnwert }