55 Log::info(
'Administrator privileges confirmed - proceeding with startup');
58 $this->splash =
new Splash();
59 $this->restart =
false;
64 $this->filesToScan = array();
66 $gauge = self::GAUGE_SERVICES * count(
$bearsamppBins->getServices());
67 $gauge += self::GAUGE_OTHERS + 1;
76 $bearsamppWinbinder->setHandler($this->splash->getWbWindow(), $this,
'processWindow', 1000);
77 $bearsamppWinbinder->mainLoop();
78 $bearsamppWinbinder->reset();
110 if ($bearsamppRoot->getProcs() !==
false) {
112 $listProcs = array();
118 foreach ($listProcs as
$proc) {
121 Log::trace(
'Found ' . count($listProcs) .
' running processes');
123 Log::trace(
'No processes found or unable to retrieve process list');
128 $this->
writeLog(
'List bins modules:');
129 foreach ($bearsamppBins->getAll() as $module) {
130 if (!$module->isEnable()) {
132 Log::trace(
'Bin module ' . $module->getName() .
' is disabled');
134 $this->
writeLog(
'-> ' . $module->getName() .
': ' . $module->getVersion() .
' (' . $module->getRelease() .
')');
135 Log::trace(
'Bin module ' . $module->getName() .
': ' . $module->getVersion() .
' (' . $module->getRelease() .
')');
140 $this->
writeLog(
'List tools modules:');
141 foreach ($bearsamppTools->getAll() as $module) {
142 if (!$module->isEnable()) {
144 Log::trace(
'Tool module ' . $module->getName() .
' is disabled');
146 $this->
writeLog(
'-> ' . $module->getName() .
': ' . $module->getVersion() .
' (' . $module->getRelease() .
')');
147 Log::trace(
'Tool module ' . $module->getName() .
': ' . $module->getVersion() .
' (' . $module->getRelease() .
')');
152 $this->
writeLog(
'List apps modules:');
153 foreach ($bearsamppApps->getAll() as $module) {
154 if (!$module->isEnable()) {
156 Log::trace(
'App module ' . $module->getName() .
' is disabled');
158 $this->
writeLog(
'-> ' . $module->getName() .
': ' . $module->getVersion() .
' (' . $module->getRelease() .
')');
159 Log::trace(
'App module ' . $module->getName() .
': ' . $module->getVersion() .
' (' . $module->getRelease() .
')');
168 Log::trace(
'Preparing application - refreshing hostname');
171 Log::trace(
'Checking launch startup settings');
206 Log::trace(
'Checking System PATH registry key');
222 if (!$this->restart && empty($this->error)) {
223 Log::trace(
'Startup completed successfully - refreshing Git repositories');
226 $this->
writeLog(
'Started in ' . $startupTime .
's');
227 Log::trace(
'Application started successfully in ' . $startupTime .
' seconds');
232 $minutes = floor($startupTime / 60);
233 $seconds = fmod($startupTime, 60);
234 $formattedTime = sprintf(
'%d:%05.2f', $minutes, $seconds);
235 Log::trace(
'=== TOTAL STARTUP TIME: ' . $formattedTime .
' ===');
238 Log::trace(
'Startup issues detected - incrementing progress bar');
239 $this->splash->incrProgressBar(2);
242 if ($this->restart) {
243 Log::trace(
'Restart required - preparing to restart application');
245 $this->splash->setTextLoading(
252 Log::trace(
'Deleting all services before restart');
258 Log::trace(
'Setting execution action to RESTART');
262 if (!empty($this->error)) {
263 Log::trace(
'Errors occurred during startup: ' . $this->error);
264 $this->
writeLog(
'Error: ' . $this->error);
272 Log::trace(
'Waiting for loading window to initialize');
281 $bearsamppWinbinder->destroyWindow($window);
282 $bearsamppWinbinder->reset();
288 Log::trace(
'Exiting startup process cleanly');
302 $this->splash->incrProgressBar();
305 if (!is_dir($archivesPath)) {
306 Log::trace(
"Creating archives directory: " . $archivesPath);
307 mkdir($archivesPath, 0777,
true);
312 $date = date(
'Y-m-d-His', time());
313 $archiveLogsPath = $archivesPath .
'/' . $date;
314 $archiveScriptsPath = $archiveLogsPath .
'/scripts';
317 Log::trace(
"Creating archive directories for current rotation");
318 if (!is_dir($archiveLogsPath)) {
319 Log::trace(
"Creating logs archive directory: " . $archiveLogsPath);
320 mkdir($archiveLogsPath, 0777,
true);
322 Log::trace(
"Logs archive directory already exists: " . $archiveLogsPath);
325 if (!is_dir($archiveScriptsPath)) {
326 Log::trace(
"Creating scripts archive directory: " . $archiveScriptsPath);
327 mkdir($archiveScriptsPath, 0777,
true);
329 Log::trace(
"Scripts archive directory already exists: " . $archiveScriptsPath);
335 $handle = @opendir($archivesPath);
337 Log::trace(
"Failed to open archives directory: " . $archivesPath);
342 while (
false !== ($file = readdir($handle))) {
343 if ($file ==
'.' || $file ==
'..') {
346 $archives[] = $archivesPath .
'/' . $file;
350 Log::trace(
"Found " . count($archives) .
" existing archives");
355 Log::trace(
"Removing " . $total .
" old archives");
356 for ($i = 0; $i < $total; $i++) {
357 Log::trace(
"Deleting old archive: " . $archives[$i]);
363 $isFileLocked =
function ($filePath) {
364 if (!file_exists($filePath)) {
368 $handle = @fopen($filePath,
'r+');
369 if ($handle ===
false) {
370 Log::trace(
"File appears to be locked: " . $filePath);
383 $handle = @opendir($srcPath);
385 Log::trace(
"Failed to open logs directory: " . $srcPath);
393 while (
false !== ($file = readdir($handle))) {
394 if ($file ==
'.' || $file ==
'..' || is_dir($srcPath .
'/' . $file)) {
398 $sourceFile = $srcPath .
'/' . $file;
399 $destFile = $archiveLogsPath .
'/' . $file;
402 if ($isFileLocked($sourceFile)) {
403 Log::trace(
"Skipping locked log file: " . $file);
409 if (copy($sourceFile, $destFile)) {
414 Log::trace(
"Failed to copy log file: " . $file);
416 }
catch (Exception $e) {
418 Log::trace(
"Exception copying log file " . $file .
": " . $e->getMessage());
422 Log::trace(
"Logs archived: " . $logsCopied .
" copied, " . $logsSkipped .
" skipped");
427 $handle = @opendir($srcPath);
429 Log::trace(
"Failed to open tmp directory: " . $srcPath);
437 while (
false !== ($file = readdir($handle))) {
438 if ($file ==
'.' || $file ==
'..' || is_dir($srcPath .
'/' . $file)) {
442 $sourceFile = $srcPath .
'/' . $file;
443 $destFile = $archiveScriptsPath .
'/' . $file;
446 if ($isFileLocked($sourceFile)) {
447 Log::trace(
"Skipping locked script file: " . $file);
453 if (copy($sourceFile, $destFile)) {
458 Log::trace(
"Failed to copy script file: " . $file);
460 }
catch (Exception $e) {
462 Log::trace(
"Exception copying script file " . $file .
": " . $e->getMessage());
466 Log::trace(
"Scripts archived: " . $scriptsCopied .
" copied, " . $scriptsSkipped .
" skipped");
471 $handle = @opendir($logsPath);
473 Log::trace(
"Failed to open logs directory for purging: " . $logsPath);
479 $logsPurgeSkipped = 0;
481 while (
false !== ($file = readdir($handle))) {
482 if ($file ==
'.' || $file ==
'..' || $file ==
'archives' || $file ==
'.gitignore' || is_dir($logsPath .
'/' . $file)) {
486 $filePath = $logsPath .
'/' . $file;
489 if ($isFileLocked($filePath)) {
490 Log::trace(
"Skipping locked log file during purge: " . $file);
496 if (is_link($filePath)) {
497 if (@unlink($filePath)) {
502 Log::trace(
"Failed to purge log symlink: " . $file);
504 } elseif (file_exists($filePath)) {
505 if (@unlink($filePath)) {
510 Log::trace(
"Failed to purge log file: " . $file);
514 Log::trace(
"Log file already removed or does not exist: " . $file);
516 }
catch (Exception $e) {
518 Log::trace(
"Exception purging log file " . $file .
": " . $e->getMessage());
522 Log::trace(
"Logs purged: " . $logsDeleted .
" deleted, " . $logsPurgeSkipped .
" skipped");
535 $this->splash->incrProgressBar();
537 $this->
writeLog(
'Clear tmp folders');
544 if (!is_dir($opcachePath)) {
545 $this->
writeLog(
'Creating opcache directory: ' . $opcachePath);
546 if (!@mkdir($opcachePath, 0755,
true) && !is_dir($opcachePath)) {
547 $this->
writeLog(
'Failed to create opcache directory: ' . $opcachePath);
553 if (!is_writable($opcachePath)) {
554 $this->
writeLog(
'Opcache directory is not writable: ' . $opcachePath);
565 $this->
writeLog(
'Clean old behaviors');
568 $this->splash->incrProgressBar();
571 $bearsamppRegistry->deleteValue(
573 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',
586 $this->splash->incrProgressBar();
599 if (!empty($procsKilled)) {
601 $procsKilledSort = array();
602 foreach ($procsKilled as
$proc) {
604 $procsKilledSort[] =
'-> ' . basename($unixExePath) .
' (PID ' .
$proc[
Win32Ps::PROCESS_ID] .
') in ' . $unixExePath;
606 sort($procsKilledSort);
607 foreach ($procsKilledSort as
$proc) {
621 $this->splash->incrProgressBar();
622 $this->
writeLog(
'Refresh hostname');
634 $this->
writeLog(
'Check launch startup');
636 if ($bearsamppConfig->isLaunchStartup()) {
651 $this->splash->incrProgressBar();
655 if (empty($currentBrowser) || !file_exists($currentBrowser)) {
668 $this->splash->incrProgressBar();
671 $this->
writeLog(sprintf(
'OS: %s', $os));
682 $this->splash->incrProgressBar();
696 $this->splash->incrProgressBar();
710 $this->splash->incrProgressBar();
712 $this->
writeLog(
'Last path: ' . $bearsamppCore->getLastPathContent());
725 $this->splash->incrProgressBar();
746 if ($lastPath !== $currentPath || empty($lastPath)) {
747 Log::debug(
'Path changed or first run, performing full file scan');
748 Log::trace(
'Last path: "' . $lastPath .
'" differs from current path: "' . $currentPath .
'"');
749 $this->
writeLog(
'Path changed detected - performing full scan');
751 Log::debug(
'Ensuring configuration files are checked for placeholders');
752 $this->
writeLog(
'Scanning configuration files for placeholders');
759 $this->
writeLog(
'Files to scan: ' . count($this->filesToScan) .
' (scanned in ' . $scanDuration .
's)');
770 $this->splash->incrProgressBar();
774 $this->
writeLog(
'Nb occurences changed: ' .
$result[
'countChangedOcc']);
785 $this->
writeLog(
'Save current path: ' . $this->rootPath);
795 $currentAppPathRegKey = $bearsamppRegistry->getAppPathRegKey();
798 $this->splash->incrProgressBar();
800 $this->
writeLog(
'Current app path reg key: ' . $currentAppPathRegKey);
801 $this->
writeLog(
'Gen app path reg key: ' . $genAppPathRegKey);
802 if ($currentAppPathRegKey != $genAppPathRegKey) {
803 if (!$bearsamppRegistry->setAppPathRegKey($genAppPathRegKey)) {
804 if (!empty($this->error)) {
805 $this->error .= PHP_EOL . PHP_EOL;
808 $this->error .= PHP_EOL . $bearsamppRegistry->getLatestError();
810 $this->
writeLog(
'Need restart: checkPathRegKey');
811 $this->restart =
true;
827 $currentAppBinsRegKey = $bearsamppRegistry->getAppBinsRegKey();
828 $genAppBinsRegKey = $bearsamppRegistry->getAppBinsRegKey(
false);
830 $this->splash->incrProgressBar();
832 $this->
writeLog(
'Current app bins reg key: ' . $currentAppBinsRegKey);
833 $this->
writeLog(
'Gen app bins reg key: ' . $genAppBinsRegKey);
834 if ($currentAppBinsRegKey != $genAppBinsRegKey) {
835 if (!$bearsamppRegistry->setAppBinsRegKey($genAppBinsRegKey)) {
836 if (!empty($this->error)) {
837 $this->error .= PHP_EOL . PHP_EOL;
840 $this->error .= PHP_EOL . $bearsamppRegistry->getLatestError();
842 $this->
writeLog(
'Need restart: checkBinsRegKey');
843 $this->restart =
true;
859 $currentSysPathRegKey = $bearsamppRegistry->getSysPathRegKey();
861 $this->splash->incrProgressBar();
863 $this->
writeLog(
'Current system PATH: ' . $currentSysPathRegKey);
868 $this->
writeLog(
'New system PATH: ' . $newSysPathRegKey);
870 if ($currentSysPathRegKey != $newSysPathRegKey) {
871 if (!$bearsamppRegistry->setSysPathRegKey($newSysPathRegKey)) {
872 if (!empty($this->error)) {
873 $this->error .= PHP_EOL . PHP_EOL;
876 $this->error .= PHP_EOL . $bearsamppRegistry->getLatestError();
878 $this->
writeLog(
'Need restart: checkSystemPathRegKey');
879 $this->restart =
true;
882 $this->
writeLog(
'Refresh system PATH: ' . $currentSysPathRegKey);
884 $bearsamppRegistry->setSysPathRegKey($currentSysPathRegKey);
897 $this->splash->incrProgressBar();
900 $bearsamppBins->update();
901 $bearsamppTools->update();
902 $bearsamppApps->update();
913 Log::info(
'Checking SSL certificates during startup...');
914 $this->splash->incrProgressBar();
917 $localhostExpired = $bearsamppOpenSsl->isExpired(
'localhost');
918 Log::trace(
'Localhost SSL expired status: ' . ($localhostExpired ?
'YES' :
'NO'));
920 if ($localhostExpired) {
921 Log::info(
'SSL certificate for "localhost" is missing or expired. Checking if creation is necessary...');
926 if (!$bearsamppOpenSsl->createCrt(
'localhost')) {
927 Log::error(
'FAILED call to createCrt("localhost")');
931 if ($bearsamppOpenSsl->isExpired(
'localhost')) {
932 Log::error(
'FAILED to verify localhost SSL certificate after creation attempt.');
934 Log::info(
'Successfully verified localhost SSL certificate.');
937 Log::trace(
'SSL certificate for "localhost" is valid.');
943 $vhosts = $apache->getVhosts();
944 Log::info(
'Checking SSL certificates for ' . count($vhosts) .
' vhosts');
945 foreach ($vhosts as $vhost) {
946 if ($bearsamppOpenSsl->isExpired($vhost)) {
947 Log::info(
'SSL certificate for "' . $vhost .
'" is missing or expired. Creating new one...');
949 if (!$bearsamppOpenSsl->createCrt($vhost)) {
950 Log::error(
'FAILED call to createCrt("' . $vhost .
'")');
953 Log::trace(
'SSL certificate for "' . $vhost .
'" is valid.');
957 Log::info(
'Apache module not found or disabled, skipping vhost SSL check');
961 $bearsamppOpenSsl->ensureFirefoxTrustPrompt();
976 Log::trace(
'Starting installServices method');
978 if (!$this->restart) {
979 Log::trace(
'Normal startup mode - processing services');
987 Log::trace(
'Restart mode - skipping service installation');
988 $this->splash->incrProgressBar(self::GAUGE_SERVICES * count(
$bearsamppBins->getServices()));
991 Log::trace(
'Completed installServices method');
1004 Log::trace(
'Starting sequential service installation');
1015 $servicesToStart = [];
1016 $serviceErrors = [];
1019 $currentServiceIndex = 0;
1022 $currentServiceIndex++;
1029 if ($serviceInfo[
'restart']) {
1030 $this->
writeLog(
'Need restart: installService ' . $serviceInfo[
'bin']->getName());
1031 Log::trace(
'Restart required for service: ' . $serviceInfo[
'bin']->getName());
1032 $this->restart =
true;
1034 $this->splash->incrProgressBar(self::GAUGE_SERVICES - 1);
1038 if (!empty($serviceInfo[
'error'])) {
1039 $serviceErrors[$sName] = $serviceInfo;
1041 $this->splash->incrProgressBar(self::GAUGE_SERVICES - 1);
1045 if ($serviceInfo[
'needsStart']) {
1046 $servicesToStart[$sName] = $serviceInfo;
1050 $this->splash->incrProgressBar(self::GAUGE_SERVICES - 1);
1056 Log::trace(
'Re-enabling symlink creation after service checking');
1061 if (!empty($servicesToStart)) {
1062 Log::trace(
'Starting ' . count($servicesToStart) .
' services in parallel');
1066 $totalServices = count($servicesToStart);
1071 function ($current, $total, $serviceName) use (&$serviceCount,
$bearsamppLang) {
1074 if ($current > $serviceCount) {
1075 $this->splash->incrProgressBar();
1076 $serviceCount = $current;
1083 Log::trace(
'Parallel startup phase completed in ' . $parallelDuration .
' seconds');
1086 foreach ($servicesToStart as $sName => $serviceInfo) {
1088 $name = $serviceInfo[
'name'];
1089 $service = $serviceInfo[
'service'];
1094 if ($service->isRunning()) {
1095 $this->
writeLog($name .
' service started successfully');
1096 Log::trace(
'Service ' . $name .
' verified running');
1098 $error = $service->getError();
1100 $error =
'Failed to start service after parallel startup';
1103 $serviceErrors[$sName] = $serviceInfo;
1104 $serviceErrors[$sName][
'error'] =
$error;
1108 if (!empty($serviceInfo[
'syntaxCheckCmd'])) {
1110 $cmdSyntaxCheck = $serviceInfo[
'bin']->getCmdLineOutput($serviceInfo[
'syntaxCheckCmd']);
1111 if (!$cmdSyntaxCheck[
'syntaxOk']) {
1112 $serviceErrors[$sName][
'error'] .= PHP_EOL .
'Syntax error: ' . $cmdSyntaxCheck[
'content'];
1114 }
catch (\Exception $e) {
1122 $this->splash->incrProgressBar(self::GAUGE_SERVICES - 2);
1125 Log::info(
'Parallel service startup completed: ' . count($servicesToStart) .
' services processed');
1129 foreach ($serviceErrors as $sName => $serviceInfo) {
1130 if (!empty($serviceInfo[
'error'])) {
1131 Log::trace(
'Service error occurred for ' . $sName .
': ' . $serviceInfo[
'error']);
1132 if (!empty($this->error)) {
1133 $this->error .= PHP_EOL . PHP_EOL;
1140 $this->
writeLog(
'Service installation completed in ' . $installDuration .
's');
1141 Log::trace(
'Service installation completed in ' . $installDuration .
' seconds');
1160 'service' => $service,
1164 'syntaxCheckCmd' =>
null,
1167 'needsStart' =>
false,
1172 $syntaxCheckCmd =
null;
1192 if (!file_exists($bin->getDataDir()) || count(glob($bin->getDataDir() .
'/*')) === 0) {
1193 Log::trace(
'Pre-initializing MySQL data directory');
1208 $name = $bin->getName() .
' ' . $bin->getVersion() .
' (' . $service->getName() .
')';
1210 $serviceInfo[
'bin'] = $bin;
1211 $serviceInfo[
'name'] = $name;
1212 $serviceInfo[
'port'] =
$port;
1213 $serviceInfo[
'syntaxCheckCmd'] = $syntaxCheckCmd;
1216 if ($currentIndex > 0 && $totalCount > 0) {
1217 $this->splash->setTextLoading(
'Checking ' . $bin->getName() .
' service (' . $currentIndex .
'/' . $totalCount .
')');
1219 $this->splash->incrProgressBar();
1222 $serviceAlreadyInstalled =
false;
1223 $serviceToRemove =
false;
1226 if (!$bin->isEnable()) {
1227 Log::trace(
'Skipping service check for disabled bin: ' . $bin->getName());
1228 $serviceInfos =
false;
1235 if ($serviceInfos ===
false && $service->isInstalled()) {
1236 Log::trace(
'MySQL service appears to be hanging, forcing restart');
1239 $serviceToRemove =
true;
1243 $serviceInfos = $service->infos();
1244 }
catch (\Exception $e) {
1245 Log::trace(
"Exception during service check: " . $e->getMessage());
1246 $serviceInfos =
false;
1247 }
catch (\Throwable $e) {
1248 Log::trace(
"Throwable during service check: " . $e->getMessage());
1249 $serviceInfos =
false;
1255 if ($serviceInfos !==
false) {
1256 $serviceAlreadyInstalled =
true;
1257 $this->
writeLog($name .
' service already installed');
1261 $serviceGenPathName = trim(str_replace(
'"',
'', $service->getBinPath()));
1263 $serviceVbsPathName = trim(str_replace(
'"',
'', $installedPathParts[0]));
1265 $serviceGenPathName = trim(str_replace(
'"',
'', $service->getBinPath() . ($service->getParams() ?
' ' . $service->getParams() :
'')));
1269 $normalizedGenPath = preg_replace(
'/\s+/',
' ', $serviceGenPathName);
1270 $normalizedVbsPath = preg_replace(
'/\s+/',
' ', $serviceVbsPathName);
1272 if ($normalizedGenPath !== $normalizedVbsPath && $serviceGenPathName != $serviceVbsPathName) {
1273 $serviceToRemove =
true;
1274 $this->
writeLog($name .
' service has to be removed');
1279 if ($serviceToRemove) {
1280 if (!$service->delete()) {
1281 $serviceInfo[
'restart'] =
true;
1283 return $serviceInfo;
1289 if ($isPortInUse !==
false) {
1292 if ($serviceInfos !==
false && is_array($serviceInfos)) {
1297 if ($state !==
null) {
1299 (strtoupper((
string)$state) ===
'RUNNING');
1302 $isRunning = $service->isRunning();
1305 if ($serviceInfos ===
false) {
1307 $isRunning = $service->isRunning();
1313 $this->
writeLog($name .
' service already running on port ' .
$port);
1314 Log::trace(
'Service ' . $name .
' already running - no need to start');
1315 $serviceInfo[
'needsStart'] =
false;
1317 return $serviceInfo;
1321 if ($serviceInfos ===
false && $service->isRunning()) {
1322 $this->
writeLog($name .
' service already running on port ' .
$port);
1323 Log::trace(
'Service ' . $name .
' already running - no need to start');
1324 $serviceInfo[
'needsStart'] =
false;
1326 return $serviceInfo;
1332 return $serviceInfo;
1336 if (!$serviceAlreadyInstalled || $serviceToRemove) {
1337 if (!$service->create()) {
1340 return $serviceInfo;
1344 $serviceInfo[
'needsStart'] =
true;
1346 return $serviceInfo;
1357 $this->splash->incrProgressBar();
1358 if ($bearsamppTools->getGit()->isScanStartup()) {
1361 $repos = $bearsamppTools->getGit()->findRepos(
false);
1362 $this->
writeLog(
'Update GIT repos: ' . count($repos) .
' found');
1376 Log::trace(
'Starting specialized Apache service check with timeout protection');
1379 $serviceCheckStartTime = microtime(
true);
1380 $serviceCheckTimeout = 3;
1384 $serviceInfos =
false;
1388 if (is_array($serviceList) && isset($serviceList[$service->getName()])) {
1389 Log::trace(
'Apache service found in service list, getting details');
1393 $serviceInfos = $service->infos();
1396 if (microtime(
true) - $serviceCheckStartTime > $serviceCheckTimeout) {
1397 Log::trace(
"Apache service check timeout exceeded, assuming service needs reinstall");
1402 Log::trace(
'Apache service not found in service list');
1407 return $serviceInfos;
1408 }
catch (\Exception $e) {
1409 Log::trace(
"Exception during Apache service check: " . $e->getMessage());
1412 }
catch (\Throwable $e) {
1413 Log::trace(
"Throwable during Apache service check: " . $e->getMessage());
1430 Log::trace(
'Starting specialized MySQL service check with timeout protection');
1433 $serviceCheckStartTime = microtime(
true);
1434 $serviceCheckTimeout = 3;
1438 $serviceInfos =
false;
1442 if (is_array($serviceList) && isset($serviceList[$service->getName()])) {
1443 Log::trace(
'MySQL service found in service list, getting details');
1446 $serviceInfos = $service->infos();
1449 if (microtime(
true) - $serviceCheckStartTime > $serviceCheckTimeout) {
1450 Log::trace(
"MySQL service check timeout exceeded, assuming service needs reinstall");
1455 Log::trace(
'MySQL service not found in service list');
1460 return $serviceInfos;
1461 }
catch (\Exception $e) {
1462 Log::trace(
"Exception during MySQL service check: " . $e->getMessage());
1465 }
catch (\Throwable $e) {
1466 Log::trace(
"Throwable during MySQL service check: " . $e->getMessage());
prepareService($sName, $service, $bearsamppBins, $bearsamppLang, $currentIndex=0, $totalCount=0)
installServicesSequential($bearsamppBins, $bearsamppLang)
checkMySQLServiceWithTimeout($service, $bin)
checkApacheServiceWithTimeout($service)
processWindow($window, $id, $ctrl, $param1, $param2)
const STARTUP_STARTING_TEXT
const STARTUP_REFRESH_GIT_REPOS_TEXT
const STARTUP_SERVICE_ERROR
const STARTUP_CHECK_PATH_TEXT
const STARTUP_SCAN_FOLDERS_TEXT
const STARTUP_CHANGE_PATH_TEXT
const STARTUP_PREPARE_RESTART_TEXT
const STARTUP_ROTATION_LOGS_TEXT
const LOADING_START_SERVICE
const STARTUP_SERVICE_CREATE_ERROR
const STARTUP_SERVICE_PORT_ERROR
const STARTUP_GEN_SSL_CRT_TEXT
const STARTUP_VERIFY_SERVICE_TEXT
const STARTUP_ERROR_TITLE
const STARTUP_CLEAN_OLD_BEHAVIORS_TEXT
const STARTUP_REFRESH_ALIAS_TEXT
const STARTUP_REGISTRY_ERROR_TEXT
const STARTUP_KILL_OLD_PROCS_TEXT
const STARTUP_CHECK_BROWSER_TEXT
const STARTUP_REFRESH_HOSTNAME_TEXT
const STARTUP_REGISTRY_TEXT
const STARTUP_UPDATE_CONFIG_TEXT
const STARTUP_REFRESH_VHOSTS_TEXT
const STARTUP_CLEAN_TMP_TEXT
static info($data, $file=null)
static debug($data, $file=null)
static warning($data, $file=null)
static trace($data, $file=null)
static error($data, $file=null)
static getRootPath($aetrayPath=false)
static getStartupLogFilePath($aetrayPath=false)
static getLogsPath($aetrayPath=false)
static formatWindowsPath($path)
static changePath($filesToScan, $rootPath=null)
static formatUnixPath($path)
static getTmpPath($aetrayPath=false)
static getLastPath($aetrayPath=false)
static startAllServicesParallel($serviceInfos, ?callable $progressCallback=null, $startupTimeout=30)
static isPortInUse($port)
static setSkipSymlinkCreation(bool $skip)
static disableLaunchStartup()
static deleteFolder($path)
static getFilesToScan($path=null, $useCache=true, $forceRefresh=false)
static clearFolder($path, $exclude=array())
static enableLaunchStartup()
static getDefaultBrowser()
static killBins($refreshProcs=false)
static getServices($forceRefresh=false)
const WIN32_SERVICE_RUNNING