Kaynağa Gözat

Działająca wersja alfa beta automatycznego tworzenia maszyny wirtualnej na Parallels wraz z automatyczną instalacją systemu Procesy5 + drobne poprawki

Mariusz Muszyński 9 yıl önce
ebeveyn
işleme
294d760ae4
1 değiştirilmiş dosya ile 224 ekleme ve 10 silme
  1. 224 10
      SE/superedit-INSTALL_SES_PROCESY_A.php

+ 224 - 10
SE/superedit-INSTALL_SES_PROCESY_A.php

@@ -65,7 +65,7 @@ class INSTALL_SES_PROCESY_A {
 			 	$domainList[] = $h2->SERVER_ADDRESS_SHORT;
 			 	$domainList[] = $h2->SERVER_ADDRESS_SHORT;
 			}
 			}
 		}
 		}
-		if ($SERVER_ADDRESS) {
+		if ($SERVER_ADDRESS && (!preg_match('/^(.*)\.procesy5\.pl$/', $SERVER_ADDRESS))) {
 			$subDomainP5 = '' . $SERVER_ADDRESS . '.procesy5.pl';
 			$subDomainP5 = '' . $SERVER_ADDRESS . '.procesy5.pl';
 			if (!in_array($subDomainP5, $domainList)) $domainList[] = $subDomainP5;
 			if (!in_array($subDomainP5, $domainList)) $domainList[] = $subDomainP5;
 		}
 		}
@@ -96,7 +96,14 @@ EOF';
 */
 */
 }
 }
 
 
-
+function execOnParallels($command) {
+    $exec_command = 'ssh -o StrictHostKeyChecking=no -o ConnectTimeout=99999 arkadiuszbinder@parallels.biall-net.pl -t <<EOF
+        declare PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/lib/mysql55/bin/:/Applications/Server.app/Contents/ServerRoot/usr/sbin/
+        '.$command.'
+        EOF';
+    $result = shell_exec($exec_command);
+    return $result;
+}
 
 
 function INSTALL_GETCOMMANDS($ADMIN_USERNAME,$SERVER_ADDRESS_IP,$ADMIN_USERNAME_PASSWD,$SERVER_MOUNT_POINT_ROOT,$SERVER_ADDRESS,$SERVER_ADDRESS_LDAP_DC,$SERVER_ADDRESS_SHORT,$INSTALL_ROOT,$REMOTE_FOLDER_ROOT,$ADMIN_USERNAME_L1,$ADMIN_USERNAME_L1_PASS,$ADMIN_USERNAME_DIRECTORY,$ADMIN_USERNAME_INITIAL_PASSWD,$BACKUP_USB_DEVICE,$SERVER_VERSION) {
 function INSTALL_GETCOMMANDS($ADMIN_USERNAME,$SERVER_ADDRESS_IP,$ADMIN_USERNAME_PASSWD,$SERVER_MOUNT_POINT_ROOT,$SERVER_ADDRESS,$SERVER_ADDRESS_LDAP_DC,$SERVER_ADDRESS_SHORT,$INSTALL_ROOT,$REMOTE_FOLDER_ROOT,$ADMIN_USERNAME_L1,$ADMIN_USERNAME_L1_PASS,$ADMIN_USERNAME_DIRECTORY,$ADMIN_USERNAME_INITIAL_PASSWD,$BACKUP_USB_DEVICE,$SERVER_VERSION) {
 // $cmd[]['rsh']='echo "'.$ADMIN_USERNAME_PASSWD.'" | sudo -S su -';
 // $cmd[]['rsh']='echo "'.$ADMIN_USERNAME_PASSWD.'" | sudo -S su -';
@@ -2454,7 +2461,9 @@ function INSTALL_SES_PROCESY_A() {
 			<br><input type=submit name='POBIERZ_XML_AUTOCONFIG_USB'  value='POBIERZ_XML_AUTOCONFIG_USB (TODO nie gotowe @2014-03-10)'>
 			<br><input type=submit name='POBIERZ_XML_AUTOCONFIG_USB'  value='POBIERZ_XML_AUTOCONFIG_USB (TODO nie gotowe @2014-03-10)'>
 			<br>
 			<br>
 			 <input type=submit name='WYKONAJ_REFERENCYJNA_BAZE_DANYCH'  value='1. WYKONAJ_REFERENCYJNA_BAZE_DANYCH (v@2014-03-15)'>
 			 <input type=submit name='WYKONAJ_REFERENCYJNA_BAZE_DANYCH'  value='1. WYKONAJ_REFERENCYJNA_BAZE_DANYCH (v@2014-03-15)'>
-			 <input type=submit name='POBIERZ_INSTALATOR_SH'  value='2. POBIERZ_INSTALATOR_SH (v@2014-03-15)'> <br>
+			 <input type=submit name='POBIERZ_INSTALATOR_SH'  value='2. POBIERZ_INSTALATOR_SH (v@2014-03-15)'>
+			 <input type=submit name='ZAINSTALUJ_NA_PARALLELS'  value='3. ZAINSTALUJ_NA_PARALLELS (v@2016-11-27)'>
+             <input type=submit name='STATUS_INSTALACJI_NA_PARALLELS' value='4. STATUS_INSTALACJI_NA_PARALLELS' (v@2016-11-27)><br>
 			 <!-- input type=submit name='INSTALUJ' value='INSTALUJ zdalnie via ssh (nie uzywac@2014-08-11)'-->
 			 <!-- input type=submit name='INSTALUJ' value='INSTALUJ zdalnie via ssh (nie uzywac@2014-08-11)'-->
 			</form>
 			</form>
 
 
@@ -2520,14 +2529,24 @@ function INSTALL_SES_PROCESY_A() {
 
 
 		if(!empty($h->VERSION_GIT)) {
 		if(!empty($h->VERSION_GIT)) {
 			//Bzyk @ 2016-11-24
 			//Bzyk @ 2016-11-24
-			//Automatyczne dodanie do dns rekordu pelnej nazwy serwera w domenie procesy5.pl (np. biuro.biall-net.pl.procesy5.pl)
+			//Automatyczne dodanie rekordu dns do serwera w domenie procesy5.pl
 			try {
 			try {
 				Lib::loadClass('ServeradminParser');
 				Lib::loadClass('ServeradminParser');
 				$serveradmin = new ServeradminParser();
 				$serveradmin = new ServeradminParser();
-				if ($serveradmin->dnsAddIpAddress("procesy5.pl", $h->SERVER_ADDRESS, $h->SERVER_ADDRESS_IP, true)) {
-					$serveradmin->applyConf();
-					DEBUG_S(-3,'Dodano wpis DNS',$h->SERVER_ADDRESS.'.procesy5.pl IN A '.$h->SERVER_ADDRESS_IP);
-				} else DEBUG_S(-3,'Wpis DNS już istnieje',$h->SERVER_ADDRESS.'.procesy5.pl IN A '.$h->SERVER_ADDRESS_IP);
+                                
+                if  (preg_match('/^(.*)\.procesy5\.pl$/',$h->SERVER_ADDRESS,$matches)) {
+                    // Jezeli nazwa serwera jest w domenie procesy5.pl, dodajemy rekord DNS dla samej danej nazwy (np. test.procesy5.pl)
+                    if ($serveradmin->dnsAddIpAddress("procesy5.pl", $matches[1], $h->SERVER_ADDRESS_IP, true)) {
+                        $serveradmin->applyConf();
+                        DEBUG_S(-3,'Dodano wpis DNS',$h->SERVER_ADDRESS.' IN A '.$h->SERVER_ADDRESS_IP);
+                    } else DEBUG_S(-3,'Wpis DNS już istnieje',$h->SERVER_ADDRESS.' IN A '.$h->SERVER_ADDRESS_IP);
+                } else {
+                    // W przeciwnym wypadku dodajemy wpis z doklejeniem do nazwy serwera domeny procesy5.pl (np. biuro.biall-net.pl.procesy5.pl)
+                    if ($serveradmin->dnsAddIpAddress("procesy5.pl", $h->SERVER_ADDRESS, $h->SERVER_ADDRESS_IP, true)) {
+                        $serveradmin->applyConf();
+					   DEBUG_S(-3,'Dodano wpis DNS',$h->SERVER_ADDRESS.'.procesy5.pl IN A '.$h->SERVER_ADDRESS_IP);
+				    } else DEBUG_S(-3,'Wpis DNS już istnieje',$h->SERVER_ADDRESS.'.procesy5.pl IN A '.$h->SERVER_ADDRESS_IP);
+                }
 			} catch (Exception $e) {
 			} catch (Exception $e) {
 				DEBUG_S(-3,"Wystąpił błąd podczas próby dodania wpisu DNS",$e->getMessage());
 				DEBUG_S(-3,"Wystąpił błąd podczas próby dodania wpisu DNS",$e->getMessage());
 			}
 			}
@@ -2802,8 +2821,203 @@ function INSTALL_SES_PROCESY_A() {
 
 
 	echo "<hr><h2><A href='{$installer_url}".$h->ID."_Procesy5_".str_replace('.','_',$h->SERVER_ADDRESS).".pkg'> ściągnij glowną instalacje Procesy5 ".$h->ID."_Procesy5_".str_replace('.','_',$h->SERVER_ADDRESS).".pkg</a></h2>\n";
 	echo "<hr><h2><A href='{$installer_url}".$h->ID."_Procesy5_".str_replace('.','_',$h->SERVER_ADDRESS).".pkg'> ściągnij glowną instalacje Procesy5 ".$h->ID."_Procesy5_".str_replace('.','_',$h->SERVER_ADDRESS).".pkg</a></h2>\n";
 
 
-
-
+        
+    } else if(!empty($_REQUEST['ZAINSTALUJ_NA_PARALLELS'])) {
+        try {
+            $subnets["94.158.130.224"] = array(
+                "mask" => "255.255.255.224",
+                "gw" => "94.158.130.225",
+                "dns" => "94.158.130.225");
+            
+            $subnets["94.158.132.0"] = array(
+                "mask" => "255.255.255.0",
+                "gw" => "94.158.132.1",
+                "dns" => "94.158.132.1");
+    
+            foreach ($subnets as $network => $values) $availableSubnetsArr[] = $network . "/" . $values["mask"];
+            $availableSubnets = implode(", ",$availableSubnetsArr);
+            
+            $installer_dir_tar  ="/Library/Server/Web/Data/Sites/Default/PLIKI/SES_PROCESY5_A"; //katalog CWD z ktorego budowana jest instalacja
+            $package = $h->ID."_Procesy5_".str_replace('.','_',$h->SERVER_ADDRESS).".pkg";
+            $file = $installer_dir_tar.'/'.$package;
+            
+            echo "<br/>Weryfikacja poprawności danych konfiguracyjnych";
+            if (!file_exists($file)) throw new Exception("Nie znaleziono pliku instalatora - ".$file.". Należy najpierw wyzwolić funkcję \"2. POBIERZ_INSTALATOR_SH\" (po wygenerowaniu pliku instalatora nie należy niczego pobierać).");
+            DEBUG_S(-3, 'Plik instalatora', 'OK');
+            
+            if ($h->SERVER_ADDRESS_LDAP_DC != "dc=procesy5,dc=local") throw new Exception('Błędny Adres LDAP DC - należy koniecznie ustawić "dc=procesy5,dc=local", a następnie na nowo wygenerować plik instalatora klikając na "2. POBIERZ_INSTALATOR_SH".');
+            DEBUG_S(-3, 'Poprawność Adresu LDAP DC', 'OK');
+            
+            if (!filter_var($h->SERVER_ADDRESS_IP, FILTER_VALIDATE_IP) === true) throw new Exception('Błąd - '.$h->SERVER_ADDRESS_IP.' nie jest poprawnym adresem IP! Popraw Adres IP serwera.');
+            DEBUG_S(-3, 'Poprawność Adresu IP serwera', 'OK');
+            
+            unset($subnet);
+            foreach ($subnets as $network => $values) {
+                if ((ip2long($h->SERVER_ADDRESS_IP) & ip2long($values["mask"])) == ip2long($network)) $subnet = $network;
+            }
+            if (!isset($subnet)) throw new Exception("Adres IP ".$h->SERVER_ADDRESS_IP." nie należy do żadnej znanej puli adresów.<br/>Dostępne pule: ".$availableSubnets);
+            if ($h->SERVER_ADDRESS_IP == $subnet) throw new Exception("Adres IP ".$h->SERVER_ADDRESS_IP." jest adresem sieci podsieci ".$subnet."/".$subnets[$subnet]["mask"].". Należy wybrać inny adres IP z puli adresów.<br/>Dostępne pule: ".$availableSubnets);
+            if ($h->SERVER_ADDRESS_IP == $subnets[$subnet]["gw"]) throw new Exception("Adres IP ".$h->SERVER_ADDRESS_IP." jest zarezerwowany dla routera dla podsieci ".$subnet."/".$subnets[$subnet]["mask"].". Należy wybrać inny adres IP z puli adresów.<br/>Dostępne pule: ".$availableSubnets);
+            if ($h->SERVER_ADDRESS_IP == long2ip(ip2long($subnet) | ~ip2long($subnets[$subnet]["mask"]))) throw new Exception("Adres IP ".$h->SERVER_ADDRESS_IP." jest adresem rozgłoszeniowym dla podsieci ".$subnet."/".$subnets[$subnet]["mask"].". Należy wybrać inny adres IP z puli adresów.<br/>Dostępne pule: ".$availableSubnets);
+            DEBUG_S(-3, 'Adres IP serwera należy do znanej puli adresów', 'OK');
+            
+            exec("ping ".$h->SERVER_ADDRESS_IP." -c 2 -t 1 >/dev/null", $output, $exit);
+            if (!$exit) throw new Exception('Błąd - maszyna o adresie IP '.$h->SERVER_ADDRESS_IP.' już istnieje (odpowiada na "pingi").');
+            DEBUG_S(-3, 'Brak maszyny w sieci o adresie IP'.$h->SERVER_ADDRESS_IP, 'OK');
+            
+            $result = execOnParallels('prlctl status "'.$h->SERVER_ADDRESS.'"');
+            if ($result) throw new Exception("Maszyna wirtualna o nazwie ".$h->SERVER_ADDRESS." już istnieje!");
+            DEBUG_S(-3, 'Brak wirtualnej maszyny Parallels o nazwie '.$h->SERVER_ADDRESS, 'OK');
+            
+            $result = execOnParallels('[ -f "Parallels/.current_autoinstall_'.$h->SERVER_VERSION.'" ] && echo 1');
+            if (!$result) throw new Exception("Brak definicji szablonu wirtualnej maszyny Parallels dla systemu macOS ".$h->SERVER_VERSION);
+            DEBUG_S(-3, 'Definicja szablonu wirtualnej maszyny Parallels dla systemu macOS '.$h->SERVER_VERSION, 'OK');
+            
+            $result = execOnParallels('prlctl list -t "\$(<Parallels/.current_autoinstall_'.$h->SERVER_VERSION.')" >/dev/null 2>&1 && echo 1');
+            if (!$result) throw new Exception("Wystąpił problem z szablonem wirtualnej maszyny Parallels dla systemu macOS ".$h->SERVER_VERSION);
+            DEBUG_S(-3, 'Szablon wirtualnej maszyny Parallels dla systemu macOS '.$h->SERVER_VERSION, 'OK');
+            
+            echo "<br/>Tworzenie maszyny wirtualnej";
+            $result = execOnParallels('prlctl clone "\$(<Parallels/.current_autoinstall_'.$h->SERVER_VERSION.')" --name "'.$h->SERVER_ADDRESS.'"');
+            DEBUG_S(-3, 'Tworzenie maszyny wirtualnej', $result);
+            
+            $result = execOnParallels('prlctl status "'.$h->SERVER_ADDRESS.'"');
+            if (!$result) throw new Exception("Błąd tworzenia maszyny wirtualnej Parallels o nazwie ".$h->SERVER_ADDRESS);
+            DEBUG_S(-3, 'Poprawność utworzenia maszyny wirtualnej Parallels o nazwie '.$h->SERVER_ADDRESS, 'OK');
+            
+            $plist = '<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>Disabled</key><false/>
+  <key>KeepAlive</key><true/>
+  <key>Label</key><string>parallels.'.$h->SERVER_ADDRESS.'</string>
+  <key>ProgramArguments</key>
+  <array>
+    <string>/usr/local/bin/prlctl</string>
+    <string>start</string>
+    <string>'.$h->SERVER_ADDRESS.'</string>
+  </array>
+  <key>UserName</key><string>arkadiuszbinder</string>
+  <key>RunAtLoad</key><true/>
+  <key>AbandonProcessGroup</key><true/>
+</dict>
+</plist>';
+            $result = execOnParallels('sudo -n su -
+echo \''.$plist.'\' > /Library/LaunchDaemons/parallels.'.$h->SERVER_ADDRESS.'.plist');
+            DEBUG_S(-3, 'Utworzenie pliku plist do LaunchDaemona', 'OK');
+            
+            echo "<br/>Uruchomienie maszyny wirtualnej";
+            execOnParallels('sudo launchctl load /Library/LaunchDaemons/parallels.'.$h->SERVER_ADDRESS.'.plist');
+            $i = 0;
+            do {
+                sleep(10);
+                echo ".";
+                $result = execOnParallels('prlctl list -i -j '.$h->SERVER_ADDRESS);
+                $result_jdecoded = json_decode($result);
+                $state = $result_jdecoded[0]->GuestTools->state;
+                if ($i++>18) {
+                    execOnParallels('sudo launchctl load /Library/LaunchDaemons/parallels.'.$h->SERVER_ADDRESS.'.plist');
+                    execOnParallels('sudo rm -f /Library/LaunchDaemons/parallels.'.$h->SERVER_ADDRESS.'.plist');
+                    execOnParallels('prlctl stop "'.$h->SERVER_ADDRESS.'"');
+                    execOnParallels('prlctl delete "'.$h->SERVER_ADDRESS.'"');
+                    throw new Exception("Wystąpił problem z uruchomieniem maszyny wirtualnej, usuwam maszynę i przerywam...");
+                }
+            } while ($state == "not_installed");
+            DEBUG_S(-3, 'Uruchomienie maszyny wirtualnej Parallels', 'OK');
+            
+            echo "<br/>Konfiguracja maszyny wirtualnej";
+            $result = execOnParallels('prlctl exec "'.$h->SERVER_ADDRESS.'" "networksetup -setmanual Ethernet '.$h->SERVER_ADDRESS_IP.' '.$subnets[$subnet]["mask"].' '.$subnets[$subnet]["gw"].'"');
+            DEBUG_S(-3, 'Ustawienie adresu IP/maskę oraz bramy domyślnej', $result);
+            
+            $result = execOnParallels('prlctl exec "'.$h->SERVER_ADDRESS.'" "networksetup -setdnsservers Ethernet '.$subnets[$subnet]["dns"].'"');
+            DEBUG_S(-3, 'Ustawienie serwera DNS', $result);
+
+            exec("ping ".$h->SERVER_ADDRESS_IP." -c 5 -t 1 >/dev/null", $output, $exit);
+            if (!$exit) {
+                execOnParallels('sudo launchctl load /Library/LaunchDaemons/parallels.'.$h->SERVER_ADDRESS.'.plist');
+                execOnParallels('sudo rm -f /Library/LaunchDaemons/parallels.'.$h->SERVER_ADDRESS.'.plist');
+                execOnParallels('prlctl stop "'.$h->SERVER_ADDRESS.'"');
+                execOnParallels('prlctl delete "'.$h->SERVER_ADDRESS.'"');
+                throw new Exception('Błąd - maszyna wirtualna nie odpowiada na pingi, usuwam maszynę i przerywam...');
+            }
+            DEBUG_S(-3, 'Maszyna wirtualna odpowiada na "pingi"', $output);
+
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'/Applications/Server.app/Contents/ServerRoot/usr/sbin/changeip '.$h->SERVER_ADDRESS_IP.' procesy5 "'.$h->SERVER_ADDRESS_IP.'"\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            sleep(2);
+            
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'scutil --set HostName "'.$h->SERVER_ADDRESS.'"\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            sleep(2);
+            
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'scutil --set ComputerName "'.$h->SERVER_ADDRESS.'"\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            sleep(2);
+            
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'scutil --set LocalHostName "'.str_replace('.','-',$h->SERVER_ADDRESS).'"\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            sleep(2);
+            
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'dscl . passwd /Users/server "'.str_replace('!','\!',$h->ADMIN_USERNAME_PASSWD).'"\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            sleep(2);
+            
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'ldappasswd -x -H ldapi://%2Fvar%2Frun%2Fldapi -s "'.str_replace('!','\!',$h->ADMIN_USERNAME_PASSWD).'" uid=diradmin,cn=users,dc=procesy5,dc=local\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            sleep(2);
+            
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'printf "127.0.0.1\t'.$h->SERVER_ADDRESS.'\n" >> /etc/hosts\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            
+            echo "<br/>Kopiowanie pliku instalatora Procesy5";
+            $cmd = '/opt/local/bin/sshpass -v -p "'.str_replace('!','\!',$h->ADMIN_USERNAME_PASSWD).'" scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "'.$file.'" "server@'.$h->SERVER_ADDRESS_IP.':Downloads/'.$package.'"';
+            $result = shell_exec($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            
+            echo "<br/>Instalowanie Procesy5";
+            $cmd = 'screen -d -m prlctl exec "'.$h->SERVER_ADDRESS.'" \'touch /var/root/procesy5_install.started; installer -package "/Users/server/Downloads/'.$package.'" -target "/" -verboseR > /var/root/procesy5_install.log; touch /var/root/procesy5_install.completed\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, $cmd, $result);
+            
+            echo "<br/><font size=3 color=orange><b>Utuchomiono w tle instalację Procesy5 na maszynie wirtualnej ".$h->SERVER_ADDRESS.".<br/>Aby sprawdzić status instalacji, kliknij na \"4. STATUS_INSTALACJI_NA_PARALLELS\"</b></font><br/><br/>";
+                        
+        } catch (Exception $e) {
+            echo "<br/><font size=4 color=red><b>".$e->getMessage()."</b></font><br/><br/>";
+        }
+        
+    } else if(!empty($_REQUEST['STATUS_INSTALACJI_NA_PARALLELS'])) {
+        try {
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'[ -f "/var/root/procesy5_install.started" ] && echo 1\'';
+            $result = execOnParallels($cmd);
+            if (!$result) throw new Exception("Błąd - automatyczna instalacja Procesy5 na wirtualnej maszynie ".$h->SERVER_ADDRESS." nie została uruchomiona.");
+            
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'[ -f "/var/root/procesy5_install.completed" ] && echo 1\'';
+            $result = execOnParallels($cmd);
+            if ($result) {
+                echo "<br/><font size=4 color=green><b>Potencjalnie zainstalowano Procesy5 na ".$h->SERVER_ADDRESS."<br/>";
+                echo "Przetestuj na <a href='https://".$h->SERVER_ADDRESS."' target=_blank>https://".$h->SERVER_ADDRESS."</a>";
+                if (!preg_match('/^(.*)\.procesy5\.pl$/',$h->SERVER_ADDRESS,$matches)) {
+                        echo " lub <a href='https://".$h->SERVER_ADDRESS.".procesy5.pl' target=_blank>https://".$h->SERVER_ADDRESS.".procesy5.pl</a>";
+                }
+                echo "</b></font><br/><br/>";
+            } else echo "<br/><font size=4 color=orange><b>Instalacja Procesy5 na ".$h->SERVER_ADDRESS." w trakcie. Odśwież stronę celem ponownej weryfikacji stanu instalacji.</b></font><br/><br/>";
+            
+            $cmd = 'prlctl exec "'.$h->SERVER_ADDRESS.'" \'cat /var/root/procesy5_install.log\'';
+            $result = execOnParallels($cmd);
+            DEBUG_S(-3, "Log z instalatora", "<pre>".$result."</pre>");
+            echo "<br/>";
+        } catch (Exception $e) {
+            echo "<br/><font size=4 color=red><b>".$e->getMessage()."</b></font><br/><br/>";
+        }    
+        
 	} else {
 	} else {