#!/usr/bin/php -q
<?php 
function cls() 
{
   echo "\033[2J"; //Bildschirm loeschen
   echo "\033[0;0H"; // Cursor auf 0,0
}

function text_rot() 
{  // Text auf rot
   echo "\033[0;31m";
}

function text_schwarz() 
{  // Text auf schwarz
   echo "\033[0;30m";
}

// Prueft ob ein User existiert
function user_exists($name)
{
        // Grept den User aus /ezc/passwd
	$cmd="grep ".escapeshellarg ($name)." /etc/passwd";
	$res=shell_exec($cmd);
	if (""!=$res)
	{
		return true;
	}
	else
	{
		return false;
	}
} 

// Prueft obein Verzeichnis existiert und liest die Rechte aus
function check_dir($dir)
{
	if (is_dir($dir))
	{
		echo ("$dir existiert\n");
		echo ("Eigentuemer: ".fileowner($dir));
		// liest die Datei-Rechte aus
		echo ("\nRechte: ".substr(sprintf("%o",fileperms($dir)),-4)."\n\n");
		return 0;
	}
	else
	{
		echo ("$dir existiert nicht\n\n");
		return 1;
	}
}
// Prueft ob das User-Passwort noch temp entspricht
function check_password($user)
{
	$pw="temp";
	// grept das kodierte Passwort 
	$cmd="more /etc/shadow | grep $user | cut -d: -f2";
	$akt_pw=trim(shell_exec($cmd));
	// kodiert das Standardpasswort mit Salt aus der codierten Version
	$pw_kodiert=crypt ($pw,substr($akt_pw,0,2));
	if ($akt_pw===$pw_kodiert)
	{
		echo ("Password nicht geaendert\n\n");
	}
	else
	{
		echo ("Password geaendert\n\n");
	}
}
// Prueft ob User-Verzeichnisse noch da sind 
// und das Passwort noch auf temp steht
function konsistenz_check($in,$user)
{
	$home="/home/$user";
	$web_dir="/home/$user/public_html";
	$ret=0;
	
	cls();
	check_dir ($home);
	check_dir ($web_dir);
	check_password ($user);
	echo ("Weiter mit Enter\n");
	fgets($in,100);
}
	
// Legt eine Datenbank fuer den User mit Namen des
// Users an. Passwort ist temp
function db_anlegen($in, $user)
{
	cls();
	$cmd="mysql --execute=\"create database $user;\" 2>&1";
	exec($cmd,$ausg,$ret);
	if (0!=$ret)
	{
		echo "Konnte Datenbank nicht anlegen\n";
		echo "MySQL meldet: \n";
		echo (implode("\n",$ausg));
	}
	else
	{
		echo "Datenbank angelegt\n";
		$cmd="mysql --execute=\"use $user;grant all privileges on $user to $user@\\\"%\\\" identified by 'temp';\"";
		exec($cmd);
		$cmd="mysql --execute=\"use $user;grant all privileges on $user.* to $user@\\\"%\\\" identified by 'temp';\"";
		exec($cmd);
		echo ("Weiter mit Enter");
	}	
	echo "weiter mit Enter";
	fgets($in,100);
}

// Loescht die Datenbank des Users
function db_loeschen($in,$user)
{
	cls();
	$cmd="mysql --execute=\"drop database $user;\"";
	exec($cmd,$ausg,$ret);
	if (0!=$ret)
	{
		echo "Konnte Datenbank nicht loeschen\n";
		echo "MySQL meldet: \n";
		echo (implode("\n",$ausg));
	}
	else
	{
		$cmd="mysql --execute=\"use mysql; delete from user where user='$user';\"";
		exec ($cmd);
		$cmd="mysql --execute=\"use mysql; delete from tables_priv where user='$user';\"";
		exec ($cmd);
		echo "DB geloescht \n";
	}
	echo "weiter mit Enter";
	fgets($in,100);
}

// Legt das Verzeichnis public_html fuer den User an
function webdir_anlegen($in,$user)
{
	cls();
	$cmd="mkdir /home/$user/public_html 2>&1";
	exec($cmd,$ausg,$ret);
	if (0!=$ret)
	{
		echo "Konnte Verzeichnis nicht anlegen\n";
		echo "Linux meldet: \n";
		echo (implode("\n",$ausg));
	}
	else
	{
		$cmd="chown $user /home/$user/public_html";
		exec($cmd);
		$cmd="chgrp users /home/$user/public_html";
		exec($cmd);
		echo "Verzeichnis angelegt\n";
	}
	echo "Weiter mit Enter\n";
	fgets($in,100);
}
		
// Legt das Home-Verzeichnis des Users neu an
function homedir_anlegen($in,$user)
{
	cls();
	$cmd="mkdir /home/$user 2>&1";
	exec($cmd,$ausg,$ret);
	if (0!=$ret)
	{
		echo "Konnte Verzeichnis nicht anlegen\n";
		echo "Linux meldet: \n";
		echo (implode("\n",$ausg));
	}
	else
	{
		$cmd="chown $user /home/$user";
		exec($cmd);
		$cmd="chgrp users /home/$user";
		exec($cmd);
		echo "Verzeichnis angelegt\n";
	}
	echo "Weiter mit Enter\n";
	fgets($in,100);
}

// Loescht einen User samt dazugehoeriger Datenbank
function del_user($in,$user)
{
	db_loeschen($in,$user);
	$cmd="userdel -rf $user 2>&1 | grep -v crontab";
	exec ($cmd);
	echo "User $user geloescht\n";
	echo "Weiter mit Enter\n";
	fgets($in,100);
}

// Setzt das Passwort des Users wieder auf temp
function reset_passwort($in,$user)
{
	cls();
	// grept die alte User-Zeile aus /etc/shadow
	$cmd="grep $user /etc/shadow";
	exec($cmd,$line);
	// Kopiert die alte /etc/shadow ohne Zeile des Users
	$cmd="grep -v $user /etc/shadow > /etc/sha_temp";
	exec($cmd);
	// Codiert Passwort
	$pwd=crypt("temp","XY");
	$pos1=strpos($line[0],":");
	$pos2=strpos($line[0],":",$pos1+1);
	// Usernamen extrahieren
	$newline=substr($line[0],0,$pos1+1);
	// Neues Passwort einfuegen
	$newline.=$pwd;
	// Rest der alten Zeile anhaengen
	$newline.=substr($line[0],$pos2,strlen($line[0])-$pos2);
	// Neue Zeile an die temporaere /etc/shadow anhaengen
	$cmd="echo \"$newline\" >> /etc/sha_temp";
	exec($cmd);
	// Backup der alten Datei erstellen
	exec ("cp /etc/shadow /etc/sha_backup");
	// /etc/shadow ueberschreiben
	exec ("mv /etc/sha_temp /etc/shadow");
	echo "Passwort geaendert\nWeiter mit Enter";
	fgets($in,100);	
}
		
// Funktion main um Exploits mit Globals zu verhindern
function main($argc, $argv)
{
	$in=fopen("php://stdin","r");
	$err=fopen("php://stderr","w");
	
	// Wurde ein Username uebergeben?
	if (3==$argc && 
	    "-u"==$argv[1] && 
	    isset($argv[2]))
	{
		$user=$argv[2]; // Usernamen auslesen
	} 
	else 
	{   // Username wurde nicht angegeben
		fputs($err,"Bitte mit -u user einen Usernamen angeben\n");
		exit(1);
	}
	// Funktion um mit /etc/passwd zu 
	// pruefen ob es den User gibt
	if (false === user_exists($user))
	{
	fputs($err,"Username existiert nicht\n");
	exit(2);
	}
	
	while (1) //Endlosschleife zur Verarbeitung
	{
		cls();
		text_rot();
		echo "Administration fuer User $user\n";
		text_schwarz();
		echo "1) Konsistenz pruefen\n";
		echo "2) MySQL DB fuer User anlegen\n";
		echo "3) MySQL DB von User loeschen\n";
		echo "4) Web-Verzeichnis fuer User anlegen\n";
		echo "5) Home-Verzeichnis fuer User anlegen\n";
		echo "6) Passwort zuruecksetzen\n";
		echo "7) User loeschen\n";
		echo "q) Programm beenden\n\n";
		echo "Ihre Wahl: ";
		// Bei der Eingabe Whitespaces entfernen
		$eingabe=trim(fgets($in,255));
	
		switch ($eingabe)
		{
			case "1": konsistenz_check($in,$user);
				  break;
			case "2": db_anlegen($in,$user);
				  break;
			case "3": db_loeschen($in,$user);
				  break;
			case "4": webdir_anlegen($in,$user);
				  break;
			case "5": homedir_anlegen($in,$user);
				  break;
			case "6": reset_passwort($in,$user);
				  break;
			case "7": del_user($in,$user);
				  break;
			// Weitere Cases
			case "q": exit(0);
		
			// Piepton bei ungueltiger Eingabe
			default:  echo chr(7); 
		}
	}
} // main

main($argc, $argv);
?>