ВУЗ: Не указан

Категория: Реферат

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 205

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Введение

1. Аналитическая часть

1.1.2 Роль веб-сайта в работе медицинской клиники

1.2 Обоснование выбора средств создания веб-сайта

1.3 Обзор систем управления базами данных

2.Технологическая часть

2.1 Постановка задачи

2.1.1 Актуальность

2.1.2 Назначение веб-сайта

2.1.3 Характеристики оборудования

2.2 Реализация проекта

2.3 Средства для разработки и проектирование сайта

2.3.1 Анализ средств для разработки и создания Web-сайта

2.3.2 Фреймворки, используемые при разработке Web-сайтов: сравнительный анализ

2.3.4 Разработка веб-сайта в CMS WordPress

3. Тестирование веб-сайта и руководство пользователя

3.1. Тестирование веб-сайта

3.2. Руководство пользователя

Заключение

Список использованной литературы

Приложение

Archive config file not found in dup-installer folder. '; return $error; } }$is_https = $this->isHttps(); if($is_https) { $current_url = 'https://'; } else { $current_url = 'http://'; } if(($_SERVER['SERVER_PORT'] == 80) && ($is_https)) { // Fixing what appears to be a bad server setting $server_port = 443; } else { $server_port = $_SERVER['SERVER_PORT']; } // for ngrok url and Local by Flywheel Live URL if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) { $host = $_SERVER['HTTP_X_ORIGINAL_HOST']; } else { $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];//WAS SERVER_NAME and caused problems on some boxes } $current_url .= $host; if(strpos($current_url,':') === false) {$current_url = $current_url.':'.$server_port;}$current_url .= $_SERVER['REQUEST_URI']; $uri_start = dirname($current_url);$encoded_archive_path = urlencode($archive_filepath); if ($error === null) {$error = $this->postExtractProcessing();if($error == null) {$bootloader_name = basename(__FILE__);$this->mainInstallerURL = $uri_start.'/'.self::INSTALLER_DIR_NAME.'/main.installer.php';$this->fixInstallerPerms($this->mainInstallerURL); $this->archive = $archive_filepath; $this->bootloader = $bootloader_name;if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {$this->mainInstallerURL .= '?'.$_SERVER['QUERY_STRING'];}self::log("DONE: No detected errors so redirecting to the main installer. Main Installer URI = {$this->mainInstallerURL}");}} return $error; } public function postExtractProcessing() { $dproInstallerDir = dirname(__FILE__) . '/dup-installer'; $libDir = $dproInstallerDir . '/lib'; $fileopsDir = $libDir . '/fileops';if(!file_exists($dproInstallerDir)) {return 'Can\'t extract installer directory. See this FAQ item for details on how to resolve.';} $sourceFilepath = "{$fileopsDir}/fileops.ppp"; $destFilepath = "{$fileopsDir}/fileops.php"; if(file_exists($sourceFilepath) && (!file_exists($destFilepath))) { if(@rename($sourceFilepath, $destFilepath) === false) { return "Error renaming {$sourceFilepath}"; } } }/*** Indicates if site is running https or not** @return bool Returns true if https, false if not*/ public function isHttps() { $retVal = true;if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {$_SERVER ['HTTPS'] = 'on';} if (isset($_SERVER['HTTPS'])) { $retVal = ($_SERVER['HTTPS'] !== 'off'); } else { $retVal = ($_SERVER['SERVER_PORT'] == 443);} return $retVal; }/*** Fetches current URL via php** @param bool $queryString If true the query string will also be returned.* @param int $getParentDirLevel if 0 get current script name or parent folder, if 1 parent folder if 2 parent of parent folder ... ** @returns The current page url*/public static function getCurrentUrl($queryString = true, $requestUri = false, $getParentDirLevel = 0){// *** HOSTif (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {$host = $_SERVER['HTTP_X_ORIGINAL_HOST'];} else {$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; //WAS SERVER_NAME and caused problems on some boxes}// *** PROTOCOLif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {$_SERVER ['HTTPS'] = 'on';}if (isset($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'https') {$_SERVER ['HTTPS'] = 'on';}if (isset($_SERVER['HTTP_CF_VISITOR'])) {$visitor = json_decode($_SERVER['HTTP_CF_VISITOR']);if ($visitor->scheme == 'https') {$_SERVER ['HTTPS'] = 'on';}}$protocol = 'http'.((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') ? 's' : '');if ($requestUri) {$serverUrlSelf = preg_replace('/\?.*$/', '', $_SERVER['REQUEST_URI']);} else {// *** SCRIPT NAME$serverUrlSelf = $_SERVER['SCRIPT_NAME'];for ($i = 0; $i < $getParentDirLevel; $i++) {$serverUrlSelf = preg_match('/^[\\\\\/]?$/', dirname($serverUrlSelf)) ? '' : dirname($serverUrlSelf);}}// *** QUERY STRING $query = ($queryString && isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0 ) ? '?'.$_SERVER['QUERY_STRING'] : '';return $protocol.'://'.$host.$serverUrlSelf.$query;} /*** Attempts to set the 'dup-installer' directory permissions** @return null*/ private function fixInstallerPerms() { $file_perms = 'u+rw'; $dir_perms = 'u+rwx'; $installer_dir_path = $this->installerContentsPath; $this->setPerms($installer_dir_path, $dir_perms, false); $this->setPerms($installer_dir_path, $file_perms, true); } /*** Set the permissions of a given directory and optionally all files** @param string $directory The full path to the directory where perms will be set* @param string $perms The given permission sets to use such as '0755' or 'u+rw' * @param string $do_files Also set the permissions of all the files in the directory** @return null*/ private function setPerms($directory, $perms, $do_files) { if (!$do_files) { // If setting a directory hiearchy be sure to include the base directory $this->setPermsOnItem($directory, $perms); } $item_names = array_diff(scandir($directory), array('.', '..')); foreach ($item_names as $item_name) { $path = "$directory/$item_name"; if (($do_files && is_file($path)) || (!$do_files && !is_file($path))) { $this->setPermsOnItem($path, $perms); } } } /*** Set the permissions of a single directory or file** @param string $path The full path to the directory or file where perms will be set* @param string $perms The given permission sets to use such as '0755' or 'u+rw'** @return bool Returns true if the permission was properly set*/ private function setPermsOnItem($path, $perms) { if (($result = self::chmod($path, $perms)) === false) {self::log("ERROR: Couldn't set permissions of $path");} else {self::log("Set permissions of $path");}return $result; }/*** Compare two strings and return html text which represts diff** @param string $oldString* @param string $newString** @return string Returns html text*/private function compareStrings($oldString, $newString) { $ret = ''; for($i=0; isset($oldString[$i]) || isset($newString[$i]); $i++) { if(!isset($oldString[$i])) { $ret .= '' . $newString[$i] . ''; continue; } for($char=0; isset($oldString[$i][$char]) || isset($newString[$i][$char]); $char++) {if(!isset($oldString[$i][$char])) { $ret .= '' . substr($newString[$i], $char) . ''; break; } elseif(!isset($newString[$i][$char])) { break; }if(ord($oldString[$i][$char]) != ord($newString[$i][$char])) $ret .= '' . $newString[$i][$char] . ''; else $ret .= $newString[$i][$char]; } } return $ret; }/*** Logs a string to the dup-installer-bootlog__[HASH].txt file** @param string $s The string to log to the log file** @return boog|int // This function returns the number of bytes that were written to the file, or FALSE on failure. */ public static function log($s, $deleteOld = false) {static $logfile = null;if (is_null($logfile)) {$logfile = self::getBootLogFilePath();}if ($deleteOld && file_exists($logfile)) {@unlink($logfile);}$timestamp = date('M j H:i:s'); return @file_put_contents($logfile, '['.$timestamp.'] '.self::postprocessLog($s)."\n", FILE_APPEND); }/*** get boot log file name the dup-installer-bootlog__[HASH].txt file** @return string */public static function getBootLogFilePath() {return dirname(__FILE__).'/dup-installer-bootlog__'.self::SECONDARY_PACKAGE_HASH.'.txt';}protected static function postprocessLog($str) {return str_replace(array(self::getArchiveFileHash(),self::PACKAGE_HASH, self::SECONDARY_PACKAGE_HASH), '[HASH]' , $str);}public static function getArchiveFileHash(){static $fileHash = null;if (is_null($fileHash)) {$fileHash = preg_replace('/^.+_([a-z0-9]+)_[0-9]{14}_archive\.(?:daf|zip)$/', '$1', self::ARCHIVE_FILENAME);}return $fileHash;}/*** Extracts only the 'dup-installer' files using ZipArchive** @param string $archive_filepath The path to the archive file.** @return bool Returns true if the data was properly extracted*/ private function extractInstallerZipArchive($archive_filepath, $checkSubFolder = false) { $success = true; $zipArchive = new ZipArchive(); $subFolderArchiveList = array(); if (($zipOpenRes = $zipArchive->open($archive_filepath)) === true) {self::log("Successfully opened archive file."); $destination = dirname(__FILE__); $folder_prefix = self::INSTALLER_DIR_NAME.'/'; self::log("Extracting all files from archive within ".self::INSTALLER_DIR_NAME); $this->installer_files_found = 0; for ($i = 0; $i < $zipArchive->numFiles; $i++) { $stat = $zipArchive->statIndex($i); if ($checkSubFolder == false) { $filenameCheck = $stat['name']; $filename = $stat['name'];$tmpSubFolder = null; } else {$safePath = rtrim(self::setSafePath($stat['name']) , '/'); $tmpArray = explode('/' , $safePath);if (count($tmpArray) < 2) { continue; } $tmpSubFolder = $tmpArray[0]; array_shift($tmpArray); $filenameCheck = implode('/' , $tmpArray); $filename = $stat['name']; } if ($this->startsWith($filenameCheck , $folder_prefix)) { $this->installer_files_found++; if (!empty($tmpSubFolder) && !in_array($tmpSubFolder , $subFolderArchiveList)) { $subFolderArchiveList[] = $tmpSubFolder; } if ($zipArchive->extractTo($destination, $filename) === true) { self::log("Success: {$filename} >>> {$destination}"); } else { self::log("[ERROR] Error extracting {$filename} from archive archive file"); $success = false; break; } } } if ($checkSubFolder && count($subFolderArchiveList) !== 1) { self::log("Error: Multiple dup subfolder archive"); $success = false; } else { if ($checkSubFolder) { $this->moveUpfromSubFolder(dirname(__FILE__).'/'.$subFolderArchiveList[0] , true); } $lib_directory = dirname(__FILE__).'/'.self::INSTALLER_DIR_NAME.'/lib'; $snaplib_directory = $lib_directory.'/snaplib'; // If snaplib files aren't present attempt to extract and copy those if(!file_exists($snaplib_directory)) { $folder_prefix = 'snaplib/'; $destination = $lib_directory; for ($i = 0; $i < $zipArchive->numFiles; $i++) { $stat = $zipArchive->statIndex($i); $filename = $stat['name']; if ($this->startsWith($filename, $folder_prefix)) { $this->installer_files_found++; if ($zipArchive->extractTo($destination, $filename) === true) { self::log("Success: {$filename} >>> {$destination}"); } else { self::log("[ERROR] Error extracting {$filename} from archive archive file"); $success = false; break; } } } } } if ($zipArchive->close() === true) { self::log("Successfully closed archive file"); } else { self::log("[ERROR] Problem closing archive file"); $success = false; }if ($success != false && $this->installer_files_found < 10) { if ($checkSubFolder) { self::log("[ERROR] Couldn't find the installer directory in the archive!"); $success = false; } else { self::log("[ERROR] Couldn't find the installer directory in archive root! Check subfolder"); $this->extractInstallerZipArchive($archive_filepath, true); } } } else { self::log("[ERROR] Couldn't open archive archive file with ZipArchive CODE[".$zipOpenRes."]"); $success = false; } return $success; }/*** return true if current SO is windows* * @staticvar bool $isWindows* @return bool*/public static function isWindows(){static $isWindows = null;if (is_null($isWindows)) {$isWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');}return $isWindows;}/*** return current SO path path len* @staticvar int $maxPath* @return int*/public static function maxPathLen(){static $maxPath = null;if (is_null($maxPath)) {if (defined('PHP_MAXPATHLEN')) {$maxPath = PHP_MAXPATHLEN;} else {// for PHP < 5.3.0$maxPath = self::isWindows() ? 260 : 4096;}}return $maxPath;}/*** this function make a chmod only if the are different from perms input and if chmod function is enabled** this function handles the variable MODE in a way similar to the chmod of lunux* So the MODE variable can be* 1) an octal number (0755)* 2) a string that defines an octal number ("644")* 3) a string with the following format [ugoa]*([-+=]([rwx]*)+** examples* u+rw add read and write at the user* u+rw,uo-wx add read and write ad the user and remove wx at groupd and other* a=rw is equal at 666* u=rwx,go-rwx is equal at 700** @param string $file* @param int|string $mode* @return boolean*/public static function chmod($file, $mode){if (!file_exists($file)) {return false;}$octalMode = 0;if (is_int($mode)) {$octalMode = $mode;} else if (is_string($mode)) {$mode = trim($mode);if (preg_match('/([0-7]{1,3})/', $mode)) {$octalMode = intval(('0'.$mode), 8);} else if (preg_match_all('/(a|[ugo]{1,3})([-=+])([rwx]{1,3})/', $mode, $gMatch, PREG_SET_ORDER)) {if (!function_exists('fileperms')) {return false;}// start by file permission$octalMode = (fileperms($file) & 0777);foreach ($gMatch as $matches) {// [ugo] or a = ugo$group = $matches[1];if ($group === 'a') {$group = 'ugo';}// can be + - =$action = $matches[2];// [rwx]$gPerms = $matches[3];// reset octal group perms$octalGroupMode = 0;// Init sub perms$subPerm = 0;$subPerm += strpos($gPerms, 'x') !== false ? 1 : 0; // mask 001$subPerm += strpos($gPerms, 'w') !== false ? 2 : 0; // mask 010$subPerm += strpos($gPerms, 'r') !== false ? 4 : 0; // mask 100$ugoLen = strlen($group);if ($action === '=') {// generate octal group permsissions and ugo mask invert$ugoMaskInvert = 0777;for ($i = 0; $i < $ugoLen; $i++) {switch ($group[$i]) {case 'u':$octalGroupMode = $octalGroupMode | $subPerm << 6; // mask xxx000000$ugoMaskInvert = $ugoMaskInvert & 077;break;case 'g':$octalGroupMode = $octalGroupMode | $subPerm << 3; // mask 000xxx000$ugoMaskInvert = $ugoMaskInvert & 0707;break;case 'o':$octalGroupMode = $octalGroupMode | $subPerm; // mask 000000xxx$ugoMaskInvert = $ugoMaskInvert & 0770;break;}}// apply = action$octalMode = $octalMode & ($ugoMaskInvert | $octalGroupMode);} else {// generate octal group permsissionsfor ($i = 0; $i < $ugoLen; $i++) {switch ($group[$i]) {case 'u':$octalGroupMode = $octalGroupMode | $subPerm << 6; // mask xxx000000break;case 'g':$octalGroupMode = $octalGroupMode | $subPerm << 3; // mask 000xxx000break;case 'o':$octalGroupMode = $octalGroupMode | $subPerm; // mask 000000xxxbreak;}}// apply + or - actionswitch ($action) {case '+':$octalMode = $octalMode | $octalGroupMode;break;case '-':$octalMode = $octalMode &

Заключение


Результатом выпускной квалификационной работы является готовый веб-сайт поликлиники.

Были решены следующие частные задачи:

· ознакомление с современными Интернет - технологиями и их использование в настоящей разработке;

· изучение программного инструментария, применяемого для разработки и создания Web-сайтов программы Wordpress;

· ознакомление со структурой поликлиники;

· определение структуры Web-страниц;

· изучены методы размещения сайтов в Интернете

Полученный в итоге веб-сайт может полностью удовлетворить все требования заказчика.

Список использованной литературы


1. Голомбински К. Добавь воздуха! Основы визуального дизайна для

графики, веб и мультимедиа [Текст] / К. Голомбински, Р. Хаген. — СанктПетербург: Питер, 2013. — 272 с.

2. Городулин В. Основы CSS [Электронный ресурс]. — Режим доступа: http://css.manual.ru/articles/css_basics (дата обращения: 20.11.2017).

3. Демченко Д. Обзор систем управления сайтом (CMS) [Электронный

ресурс]. — Режим доступа: http://www.white-windows.ru/obzor-sistemupravleniya-sajtom-cms/ (дата обращения: 18.01.2018).

4. Дакетт Джон HTML и CSS. Разработка и дизайн веб-сайтов [Текст] /

Джон Дакетт. — Москва: ЭКСМО, 2013. — 480 с.

5. Для тех, кто делает сайты [Электронный ресурс]. — Режим доступа:

http://htmlbook.ru (дата обращения: 12.03.2017).

6. Дунаев В. В. Основы WEB-дизайна [Текст]: самоучитель /

В. В. Дунае. — 2-е издание, перераб. и доп. — Санкт-Петербург: Питер, 2012.

— 480 с.

7. Как создать сайт [Электронный ресурс]. — Режим доступа:

http://myrusakov.ru (дата обращения: 20.12.2017).

8. Квентор И. Адаптивная верстка сайтов [Электронный ресурс]. —

Режим доступа: http://www.websovet.com/adaptive-layout-introduction (дата

обращения: 19.11.2017).

9. Лоусон Б. Изучаем HTML5. Библиотека специалиста [Текст] /

Б. Лоусон, Р. Шарп. — Санкт-Петербург: Питер, 2013. — 286 с.

10. Макфарланд Д. Большая книга CSS [Текст] / Д. Макфарланд. — 3-е

изд. — Санкт-Петербург: Питер, 2014. — 608 с.

11. Маркотт И. Отзывчивый веб-дизайн [Текст] / И. Маркотт. — Книга 1. — пер. Миронов П. — Москва: Манн, Иванов и Фербер, 2012. — 231 с.

12.Чебыкин Р. Разработка и оформление текстового содержания сайтов. — Санкт-Петербург: БХВ-Петербург, 2014. — 528 c.


13.Сарычев А. Идеально! Как создать и переделать свой сайт. Правильный подход и передовые техники разработки [Текст] / А. Сарычев. —

Москва: СилаУма, 2013. — 369 с.

14.Сидерхолм Д. CSS3 для веб-дизайнеров [Текст] / Д. Сидерхолм.

Книга 5. — пер. Кудашев E. — Москва: Манн, Иванов и Фербер. 2013. —

273 с.

Приложение


Компетенции

Приложение А

if (!defined('KB_IN_BYTES')) { define('KB_IN_BYTES', 1024); }

if (!defined('MB_IN_BYTES')) { define('MB_IN_BYTES', 1024 * KB_IN_BYTES); }

if (!defined('GB_IN_BYTES')) { define('GB_IN_BYTES', 1024 * MB_IN_BYTES); }

if (!defined('DUPLICATOR_PHP_MAX_MEMORY')) { define('DUPLICATOR_PHP_MAX_MEMORY', 4096 * MB_IN_BYTES); }
date_default_timezone_set('UTC'); // Some machines don’t have this set so just do it here.

@ignore_user_abort(true);
if (!function_exists('wp_is_ini_value_changeable')) {

/**

* Determines whether a PHP ini value is changeable at runtime.

*

* @staticvar array $ini_all

*

* @link https://secure.php.net/manual/en/function.ini-get-all.php

*

* @param string $setting The name of the ini setting to check.

* @return bool True if the value is changeable at runtime. False otherwise.

*/

function wp_is_ini_value_changeable( $setting ) {

static $ini_all;

if ( ! isset( $ini_all ) ) {

$ini_all = false;

// Sometimes `ini_get_all()` is disabled via the `disable_functions` option for "security purposes".

if ( function_exists( 'ini_get_all' ) ) {

$ini_all = ini_get_all();

}

}
// Bit operator to workaround https://bugs.php.net/bug.php?id=44936 which changes access level to 63 in PHP 5.2.6 - 5.2.17.

if ( isset( $ini_all[ $setting ]['access'] ) && ( INI_ALL === ( $ini_all[ $setting ]['access'] & 7 ) || INI_USER === ( $ini_all[ $setting ]['access'] & 7 ) ) ) {

return true;

}
// If we were unable to retrieve the details, fail gracefully to assume it's changeable.

if ( ! is_array( $ini_all ) ) {

return true;

}
return false;

}

}
@set_time_limit(3600);

if (wp_is_ini_value_changeable('memory_limit'))

@ini_set('memory_limit', DUPLICATOR_PHP_MAX_MEMORY);

if (wp_is_ini_value_changeable('max_input_time'))

@ini_set('max_input_time', '-1');

if (wp_is_ini_value_changeable('pcre.backtrack_limit'))

@ini_set('pcre.backtrack_limit', PHP_INT_MAX);

if (wp_is_ini_value_changeable('default_socket_timeout'))

@ini_set('default_socket_timeout', 3600);

DUPX_Handler::init_error_handler();
/**

* Bootstrap utility to exatract the core installer

*

* Standard: PSR-2

*

* @package SC\DUPX\Bootstrap

* @link http://www.php-fig.org/psr/psr-2/

*

* To force extraction mode:

* installer.php?unzipmode=auto

* installer.php?unzipmode=ziparchive

* installer.php?unzipmode=shellexec

*/

/*** CLASS DEFINITION START ***/
abstract class DUPX_Bootstrap_Zip_Mode

{

const AutoUnzip = 0;

const ZipArchive = 1;

const ShellExec = 2;

}
class DUPX_Bootstrap

{

//@@ Params get dynamically swapped when package is built

const ARCHIVE_FILENAME = '20220407_kokodelapaix_6aadd7dfee5437343644_20220420094218_archive.zip';

const ARCHIVE_SIZE = '56847132';

const INSTALLER_DIR_NAME = 'dup-installer';

const PACKAGE_HASH = '6aadd7d-20094218';

const SECONDARY_PACKAGE_HASH = 'c0f5587-20094218';

const VERSION = '1.4.4';
public $hasZipArchive = false;

public $hasShellExecUnzip = false;

public $mainInstallerURL;

public $installerContentsPath;

public $installerExtractPath;

public $archiveExpectedSize = 0;

public $archiveActualSize = 0;

public $activeRatio = 0;
/**

* Instantiate the Bootstrap Object

*

* @return null

*/

public function __construct()

{

// clean log file



self::log('', true);

//ARCHIVE_SIZE will be blank with a root filter so we can estimate

//the default size of the package around 17.5MB (18088000)

$archiveActualSize = @file_exists(self::ARCHIVE_FILENAME) ? @filesize(self::ARCHIVE_FILENAME) : false;

$archiveActualSize = ($archiveActualSize !== false) ? $archiveActualSize : 0;

$this->hasZipArchive = class_exists('ZipArchive');

$this->hasShellExecUnzip = $this->getUnzipFilePath() != null ? true : false;

$this->installerContentsPath = str_replace("\\", '/', (dirname(__FILE__). '/' .self::INSTALLER_DIR_NAME));

$this->installerExtractPath = str_replace("\\", '/', (dirname(__FILE__)));

$this->archiveExpectedSize = strlen(self::ARCHIVE_SIZE) ? self::ARCHIVE_SIZE : 0 ;

$this->archiveActualSize = $archiveActualSize;
if($this->archiveExpectedSize > 0) {

$this->archiveRatio = (((1.0) * $this->archiveActualSize) / $this->archiveExpectedSize) * 100;

} else {

$this->archiveRatio = 100;

}
$this->overwriteMode = (isset($_GET['mode']) && ($_GET['mode'] == 'overwrite'));

}
/**

* Run the bootstrap process which includes checking for requirements and running

* the extraction process

*

* @return null | string Returns null if the run was successful otherwise an error message

*/

public function run()

{

date_default_timezone_set('UTC'); // Some machines don't have this set so just do it here

self::log('==DUPLICATOR INSTALLER BOOTSTRAP v1.4.4==');

self::log('----------------------------------------------------');

self::log('Installer bootstrap start');
$archive_filepath = $this->getArchiveFilePath();

$archive_filename = self::ARCHIVE_FILENAME;
$error = null;
$is_installer_file_valid = true;

if (preg_match('/_([a-z0-9]{7})[a-z0-9]+_[0-9]{6}([0-9]{8})_archive.(?:zip|daf)$/', $archive_filename, $matches)) {

$expected_package_hash = $matches[1].'-'.$matches[2];

if (self::PACKAGE_HASH != $expected_package_hash) {

$is_installer_file_valid = false;

self::log("[ERROR] Installer and archive mismatch detected.");

}

} else {

self::log("[ERROR] Invalid archive file name.");

$is_installer_file_valid = false;

}
if (false === $is_installer_file_valid) {

$error = "Installer and archive mismatch detected.

Ensure uncorrupted installer and matching archive are present.";

return $error;

}
$extract_installer = true;

$installer_directory = dirname(__FILE__).'/'.self::INSTALLER_DIR_NAME;

$extract_success = false;

$archiveExpectedEasy = $this->readableByteSize($this->archiveExpectedSize);

$archiveActualEasy = $this->readableByteSize($this->archiveActualSize);
//$archive_extension = strtolower(pathinfo($archive_filepath)['extension']);

$archive_extension = strtolower(pathinfo($archive_filepath, PATHINFO_EXTENSION));

$manual_extract_found = (

file_exists($installer_directory."/main.installer.php")

&&

file_exists($installer_directory."/dup-archive__".self::PACKAGE_HASH.".txt")

&&

file_exists($installer_directory."/dup-database__".self::PACKAGE_HASH.".sql")

);

$isZip = ($archive_extension == 'zip');
//MANUAL EXTRACTION NOT FOUND

if (! $manual_extract_found) {
//MISSING ARCHIVE FILE

if (! file_exists($archive_filepath)) {

self::log("[ERROR] Archive file not found!");

$error = ""

. "Archive not found! The required archive file must be present in the 'Extraction Path' below. When the archive file name was created "

. "it was given a secure hashed file name. This file name must be the exact same name as when it was created character for character. "

. "Each archive file has a unique installer associated with it and must be used together. See the list below for more options:
"

. "
    "

    . "
  • If the archive is not finished downloading please wait for it to complete.
  • "

    . "
  • Rename the file to it original hash name. See WordPress-Admin ❯ Packages ❯ Details.
  • "

    . "
  • When downloading, both files both should be from the same package line.
  • "

    . "
  • Also see: How to fix various errors that show up before step-1 of the installer?
  • "

    . "


"

."Extraction Path: {$this->installerExtractPath}/
";

return $error;

}
// Sometimes the self::ARCHIVE_SIZE is ''.

$archive_size = self::ARCHIVE_SIZE;
if (!empty($archive_size) && !self::checkInputVaslidInt($archive_size)) {

$no_of_bits = PHP_INT_SIZE * 8;

$error = 'Current is a '.$no_of_bits.'-bit SO. This archive is too large for '.$no_of_bits.'-bit PHP.'.'
';

self::log('[ERROR] '.$error);

$error .= 'Possibibles solutions:
';

$error .= '- Use the file filters to get your package lower to support this server or try the package on a Linux server.'.'
';

$error .= '- Perform a Manual Extract Install'.'
';

switch ($no_of_bits == 32) {

case 32:

$error .= '- Ask your host to upgrade the server to 64-bit PHP or install on another system has 64-bit PHP'.'
';

break;

case 64:

$error .= '- Ask your host to upgrade the server to 128-bit PHP or install on another system has 128-bit PHP'.'
';

break;

}
if (self::isWindows()) {

$error .= '- Windows DupArchive extractor to extract all files from the archive.'.'
';

}

return $error;

}
//SIZE CHECK ERROR

if (($this->archiveRatio < 90) && ($this->archiveActualSize > 0) && ($this->archiveExpectedSize > 0)) {

self::log("ERROR: The expected archive size should be around [{$archiveExpectedEasy}]. The actual size is currently [{$archiveActualEasy}].");

self::log("ERROR: The archive file may not have fully been downloaded to the server");

$percent = round($this->archiveRatio);
$autochecked = isset($_POST['auto-fresh']) ? "checked='true'" : '';

$error = "Archive file size warning.
The expected archive size should be around [{$archiveExpectedEasy}]. "

. "The actual size is currently [{$archiveActualEasy}]. The archive file may not have fully been downloaded to the server. "

. "Please validate that the file sizes are close to the same size and that the file has been completely downloaded to the destination server. If the archive is still "

. "downloading then refresh this page to get an update on the download size.

";
return $error;

}
}

// OLD COMPATIBILITY MODE

if (isset($_GET['extract-installer']) && !isset($_GET['force-extract-installer'])) {

$_GET['force-extract-installer'] = $_GET['extract-installer'];

}

if ($manual_extract_found) {

// INSTALL DIRECTORY: Check if its setup correctly AND we are not in overwrite mode

if (isset($_GET['force-extract-installer']) && ('1' == $_GET['force-extract-installer'] || 'enable' == $_GET['force-extract-installer'] || 'false' == $_GET['force-extract-installer'])) {

self::log("Manual extract found with force extract installer get parametr");

$extract_installer = true;

} else {

$extract_installer = false;

self::log("Manual extract found so not going to extract dup-installer dir");

}

} else {

$extract_installer = true;

}
if ($extract_installer && file_exists($installer_directory)) {

self::log("EXTRACT dup-installer dir");

$scanned_directory = array_diff(scandir($installer_directory), array('..', '.'));

foreach ($scanned_directory as $object) {

$object_file_path = $installer_directory.'/'.$object;

if (is_file($object_file_path)) {

if (unlink($object_file_path)) {

self::log('Successfully deleted the file '.$object_file_path);

} else {

$error .= '[ERROR] Error deleting the file '.$object_file_path.' Please manually delete it and try again.';

self::log($error);

}

}

}

}
//ATTEMPT EXTRACTION:

//ZipArchive and Shell Exec

if ($extract_installer) {

self::log("Ready to extract the installer");
self::log("Checking permission of destination folder");

$destination = dirname(__FILE__);

if (!is_writable($destination)) {

self::log("destination folder for extraction is not writable");


if (self::chmod($destination, 'u+rwx')) {

self::log("Permission of destination folder changed to u+rwx");

} else {

self::log("[ERROR] Permission of destination folder failed to change to u+rwx");

}

}
if (!is_writable($destination)) {

self::log("WARNING: The {$destination} directory is not writable.");

$error = "NOTICE: The {$destination} directory is not writable on this server please talk to your host or server admin about making ";

$error .= "writable {$destination} directory on this server.
";

return $error;

}
if ($isZip) {

$zip_mode = $this->getZipMode();
if (($zip_mode == DUPX_Bootstrap_Zip_Mode::AutoUnzip) || ($zip_mode == DUPX_Bootstrap_Zip_Mode::ZipArchive) && class_exists('ZipArchive')) {

if ($this->hasZipArchive) {

self::log("ZipArchive exists so using that");

$extract_success = $this->extractInstallerZipArchive($archive_filepath);
if ($extract_success) {

self::log('Successfully extracted with ZipArchive');

} else {

if (0 == $this->installer_files_found) {

$error = "[ERROR] This archive is not properly formatted and does not contain a dup-installer directory. Please make sure you are attempting to install the original archive and not one that has been reconstructed.";

self::log($error);

return $error;

} else {

$error = '[ERROR] Error extracting with ZipArchive. ';

self::log($error);

}

}

} else {

self::log("WARNING: ZipArchive is not enabled.");

$error = "NOTICE: ZipArchive is not enabled on this server please talk to your host or server admin about enabling ";

$error .= "ZipArchive on this server.
";

}

}
if (!$extract_success) {

if (($zip_mode == DUPX_Bootstrap_Zip_Mode::AutoUnzip) || ($zip_mode == DUPX_Bootstrap_Zip_Mode::ShellExec)) {

$unzip_filepath = $this->getUnzipFilePath();

if ($unzip_filepath != null) {

$extract_success = $this->extractInstallerShellexec($archive_filepath);

if ($extract_success) {

self::log('Successfully extracted with Shell Exec');

$error = null;

} else {

$error .= '[ERROR] Error extracting with Shell Exec. Please manually extract archive then choose Advanced > Manual Extract in installer.';

self::log($error);

}

} else {

self::log('WARNING: Shell Exec Zip is not available');

$error .= "NOTICE: Shell Exec is not enabled on this server please talk to your host or server admin about enabling ";

$error .= "Shell Exec on this server or manually extract archive then choose Advanced > Manual Extract in installer.";

}

}

}

// If both ZipArchive and ShellZip are not available, Error message should be combined for both

if (!$extract_success && $zip_mode == DUPX_Bootstrap_Zip_Mode::AutoUnzip) {

$unzip_filepath = $this->getUnzipFilePath();

if (!class_exists('ZipArchive') && empty($unzip_filepath)) {

self::log("WARNING: ZipArchive and Shell Exec are not enabled on this server.");

$error = "NOTICE: ZipArchive and Shell Exec are not enabled on this server please talk to your host or server admin about enabling ";

$error .= "ZipArchive or Shell Exec on this server or manually extract archive then choose Advanced > Manual Extract in installer.";

}

}

} else {

DupArchiveMiniExpander::init("DUPX_Bootstrap::log");

try {

DupArchiveMiniExpander::expandDirectory($archive_filepath, self::INSTALLER_DIR_NAME, dirname(__FILE__));

} catch (Exception $ex) {

self::log("[ERROR] Error expanding installer subdirectory:".$ex->getMessage());

throw $ex;

}

}
$is_apache = (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false);

$is_nginx = (strpos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false);
$sapi_type = php_sapi_name();

$php_ini_data = array(

'max_execution_time' => 3600,

'max_input_time' => -1,

'ignore_user_abort' => 'On',

'post_max_size' => '4096M',

'upload_max_filesize' => '4096M',

'memory_limit' => DUPLICATOR_PHP_MAX_MEMORY,

'default_socket_timeout' => 3600,