#!/usr/local/bin/bash # mirrorpg-generate Version 2.7 2017-01-27 17:00 Author: Sergej Qkowlew # This file is Public Doimain Я передаю это в общественное достояние for i in config functions generate allsites 1site abandoned childs do [ ! -s ./mirrorpg-$i ] && wget http://mirrorpg.arda.ru/mirrorpg/mirrorpg-$i [ ! -s ./mirrorpg-$i ] && echo "No file mirrorpg-$i here. Download it from http://mirrorpg.arda.ru/mirrorpg/$i" [ ! -s ./mirrorpg-$i ] && exit [ ! -x ./mirrorpg-$i ] && chmod a+x ./mirrorpg-$i done . ./mirrorpg-config . ./mirrorpg-functions if [ ! -z $SqMyHall ] ; then echo "===================================== ======================================" echo "Send some info about us to Old hall. Сообщаем о себе старому залу." SqReferer="--referer=http://$SqMyHall/$SqVersion/mirrorpg-generate" else echo "===================================== ======================================" echo "Nothing to send - EDIT CONFIG Нечего сообщать - РЕДАКТИРУЙТЕ КОНФИГ." sleep 2 SqReferer= fi [ ! -x $SqAddHost ] && echo " Script for adding host to webserver Не найден скрипт добавления хоста в config not found. Edit global config конфиг вебсервера. Если у Вас есть parameters in the begining of file: такой - отредактируйте конфиг в файле: mirrorpg-config for your own webserver configuration. под Вашу конфигурацию. If you have no such script - create. Если такого скрипта нет - создайте его " [ ! -x $SqAddHost ] && exit # =================================== ====================================== # GENERATE NEW MIRROR HALL ГЕНЕРАЦИЯ НОВОГО ЗЕРКАЛЬНОГО ЗАЛА SqRetPath=`pwd` mkdir -p /tmp/mirrorpg SqBuildLines mirrorpg.arda.ru SqMakeDirDom if [ ! -z "${SqOldHall}" ] then SqAddConf $SqUser $NowDomain mirrorpg.${SqMyHall} mirrorpg.${SqOldHall} else SqAddConf $SqUser $NowDomain mirrorpg.${SqMyHall} fi SqRobots cd mirrorpg.arda.ru mkdir mirrorpg cd mirrorpg for i in functions generate allsites 1site abandoned childs do cp $SqRetPath/mirrorpg-$i ./ [ ! -s ./mirrorpg-$i ] && wget http://${SqOldHallSite}/mirrorpg/mirrorpg-$i [ ! -s ./mirrorpg-$i ] && wget http://mirrorpg.arda.ru/mirrorpg/mirrorpg-$i [ ! -s ./mirrorpg-$i ] && echo "No file mirrorpg-$i here and cannot download it" [ ! -s ./mirrorpg-$i ] && exit [ -x ./mirrorpg-$i ] && chmod a-x ./mirrorpg-$i done echo '# Created by mirrorpg-generate Options +Indexes -Includes -ExecCGI IndexOptions +FancyIndexing +IgnoreClient ForceType "text/plain; charset=utf-8"'>.htaccess cd .. echo " Малый зеркальный зал ${SqMyThemeTitle} на ${SqMyHall}

Малый зеркальный зал ${SqMyThemeTitle} на $SqMyHall

Версия $SqVersion; Занимает

Архивы

<< P C >>

Хорошо

Скопированные сайты

С нами

Залы

Суть

Зеркальный зал предназначен для того, чтобы информация, содержащаяся на сайтах X Y Z, была в принципе доступна в интернете, даже если сами сайты X Y Z, их хостинги и-или домены прекратят своё существование любым способом.

Зеркальный зал - это:

Помощь

Если Вы хотите мне помочь хотя бы чем-нибудь - пожалуйста, пройдите по ссылкам справа (прежде всего по тем, что помечены красным цветом) и внимательно сравните сайты-отражения с оригиналами. О несоответствиях - сообщайте, пожалуйста, ${SqMyThemeLink}.

Мне уже помогли:

Иерархия

Зеркальный зал может участвовать в иерархии зеркальных залов, а может быть совершенно самостоятельным. Это определяется человеком, который скачал к себе копию скриптов зала и отредактировал конфигурационный файл в соответствии со своими целями.

Смысл участия в иерархии в том, что домен A, сервер и человек точно так же не вечны, как и домены X Y Z, их владельцы и сайты. Передавая же эстафету, мы можем надеяться продлить существование.

Если Вы заранее считаете, что создать самому зеркальный зал - слишком сложно для вас лично - не читайте дальше. :)" >index.php [ -s mirrorpg1.jpg ] || [ -s "${SqRetPath}/mirrorpg1.jpg" ] && cp "${SqRetPath}/mirrorpg1.jpg" ./ [ -s mirrorpg1.jpg ] || [ -z "${SqOldHallSite}" ] || wget http://${SqOldHallSite}/mirrorpg1.jpg [ -s mirrorpg1.jpg ] && echo "\"Вы" >>index.php echo "

По умолчанию предлагаемый для скачивания конфигурационный файл, а также и скрипт генерации нового зала обеспечивает участие в иерархии:

Грани

Техническое

Скрипты, используемые в малом зале: В опубликованной в данный момент версии $SqVersion пока не доделано кое что задуманное:
  1. сбор .tar.gz архивов с \"дочерних\" залов
  2. функционал генерации виртуального хоста для вебсервера (я не могу охватить всё многообразие)

Ресурсы

Для создания своего зеркального зала нужны следующие ресурсы:
  1. реальный или виртуальный сервер на Linux/FreeBsd/CentOs/Debian... любом другом Unix'e. Root доступ не обязателен.
  2. веб-сервер с PHP (c работающими функциями file_exists file_get_contents и preg_match)
  3. возможность создавать произвольное число виртуальных хостов на этом сервере.
  4. доменное имя, которму можно вписать в зону * IN A $SqMyIP.
  5. bash, wget (версии не менее примерно 1.17), perl, awk, iconv, sed, md5, utf-8 локаль на сервере.
  6. не вполне кривые руки того, кто будет редактировать эти скрипты и запускать их.

Инструкция

Положим, Вы решили сделать свой зеркальный зал на основе моих скриптов.
  1. Домен

    Все сайты, которые Вы покажете интернету в своём зеркальном зале, имели свои отдельные исходные доменные имена (чаще всего никак друг с другом не связанные), лежали на разных серверах с разными IP.

    Все они в предыдущем зале получили отдельные доменные имена третьего, четвёртого или более уровня в домене предыдущего зала.

    Так, я владею, например, доменом второго уровня $SqMyHall, который хочу применить для зеркального зала. И сервером на IP адресе $SqMyIp. Я захожу в интерфейс управления записями в зоне этого домена (у регистратора доменов или у хостера, или на своём ДНС сервере) и добавляю туда запись A вида:

    * IN A $SqMyIp
    
    и сохраняю зону. Всё. Все необходимые действия с доменом сделаны. Убедиться в результате можно по мере обновления зоны на ДНС серверах, набирая в командной строке любого компьютера ping mirrorpg.$SqMyHall и убеждаясь, что IP выдаётся тот самый.

    Если Вы решили задействовать домен третьего или более уровня в принадлежащем Вам домене. Например archive.allrpg.ru в домене allrpg.ru. Следует в интерфейсе управления записями в зоне домена allrpg.ru добавить запись A следующего вида:

    *.archive IN A $SqMyIp
    
    Аналогично - ping mirrorpg.archive.allrpg.ru и убеждаемся в результате.
  2. Вебсервер

    К сожалению, готовых скриптов, которые бы подошли к любому вебсерверу, сегодня не завезли. Кроме того, авторы всех таких программ систематически меняют синтаксис и параметры конфигурационных файлов, а также способ их расположения в операционной системе.

    Так как данная система рассчитана на многолетнее существование, я не могу предполагать, что написанный мной сегодня скрипт будет корректно делать конфиг для apache или nginx хотя бы через два года.

    Поэтому, если Вы не хотите делать много ручной работы - Вам придётся написать минимальный скрипт для Вашего вебсервера самостоятельно. Пример для apache 2.2:

    echo \"<VirtualHost $SqMyIp:80>
    ServerName \$2
    ServerAlias \$3 \$4
    ServerAdmin webmaster@mirrorpg.$SqMyHall
    DocumentRoot $SqBasePath/\$2$SqHtmlDir
    </VirtualHost>
    \">>/usr/local/etc/apache22/Includes/mirrorpg.conf
    mkdir $SqBasePath/\$2$SqHtmlDir
    
  3. Конфигурация

    Правильнее всего все дальнейшие действия совершать в Unix Shell. Если Вы не умеете этим пользоваться - научитесь.
    mkdir ~/mirrorpg
    cd ~/mirrorpg
    wget http://mirrorpg.$SqMyHall/mirrorpg/mirrorpg-config
    sh ./mirrorpg-config
    
    Этот скрипт скачает все остальные скрипты и установит им возможность исполнения.

    Теперь отредактируйте скачанный mirrorpg-config, указав в нём все требуемые параметры. Описание того, каков смысл этих параметров непосредственно там же и написан, поэтому здесь я его не привожу.

  4. Создание зала

    Запускаете ./mirrorpg-generate Этот скрипт сделает следующее:
    1. Создаст виртуальный хост для вашего основного сайта и поместит в него скрипты и такой же index.php
    2. Создаст каталоги .First .Latest .Previous для хранения архивов сайтов
    3. Скачает по крайней мере в каталог .First все файлы с предыдущего зала из каталога First
    4. Проверит md5 контрольные суммы скачанных архивов, не совпавшие сочтёт неудачными и сотрёт
    5. Для каждого из проверенных архивов создаст виртуальный хост
    6. Развернёт эти архивы в их виртуальные хосты
    7. Внесёт информацию об этих хостах в mirrorpg_good.csv
    8. Преобразует mirrorpg_good.csv в mirrorpg_good.htm и поместит эти два файла на основной сайт зала
    Если Вы после этого перезапустите вебсервер (для Apache это обычно apachectl restart) - то по адресу mirrorpg.Ваш_Домен увидите уже свой зеркальный зал со всеми ссылками на скрипты, на каталоги First Latest Previous и на копии сайтов, в точности как и на этой странице.

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

  5. Обновление

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

    Если конкретный оригинальный сайт не работает, его следует исключить из процедуры обновления зеркала. Если этого не сделать, то вы испортите то содержимое копии сайта, что показывается в вашем зеркальном зале.

    Для исключения сайта из процедуры текстовым редактором перенесите относящиеся к нему строки (начинающиеся со строки SqBuildLines его_домен и завершающиеся строкой SqAddCsv в файл mirrorpg-abandoned

    Если теперь Вы запустите скрипт mirrorpg-allsites, то по окончании его работы скрипта содержимое лежащих у Вас прописанных в него сайтов будет обновлено с их оригиналов, а свежие архивы получившихся копий будут сложены в папку Latest.

    Предыдущие архивы этих копий будут передвинуты в папку Previous.

Добавить ещё сайт в свой зал

Собственно КОНФИГ ОБНОВЛЕНИЯ САЙТОВ зеркального зала - файл mirrorpg-allsites

Каждая секция сайта - это последовательность \"кирпичиков\". Некоторые из \"кирпичиков\" достаточно очевидны - например, выкачивание одного файла с очевидного URL

Работая над конкретным сайтом, я экспериментирую с ним в файле mirrorpg-1site, начиная с простейшего сочетания \"кирпичиков\" SqBackStatic; SqReplace. Редактирую, запускаю этот скрипт и смотрю на результат.

Если какая-то часть вызывает сложности, но похожа на уже существующую на каком-то из старых сайтов в allsites - я копирую соответствующий кусок из старой секции сюда.

Если какая-то сложная конструкция явно потребуется ещё не раз - оформляю её в функцию и, отладив, перебрасываю в mirrorpg-functions

По получению успешной конфигурации нового сайта в 1site я добавляю строку SqAddCsv в его конец, запускаю его ещё раз, после чего полученную конфуграцию переношу в mirrorpg-allsites как секцию данного сайта.

Устройство

Данный раздел написан ради понимания вами того, как это устроено.

Что копируем

Любой находящийся в сети на одном домене сайт, доступный по http протоколу. При условии, что применяется достаточно неиспохабленный HTML 3-4 версии, ссылки на содержательные страницы сайта прописаны как A HREF, ссылки на стилевые файлы заданы тегами STYLE, URL картинок в HTML коде и CSS файлах соответствуют тегу IMG и url() соответственно.

Что получается

Статическая HTML копия всех страниц сайта - \"отражение\" сайта на какой-то момент времени. JS функциональность в некоторых случаях может сохраняться, Macromedia Flash и Java Applett - скорее не сохраняются. Часть стилевых решений, фоновые изображения могут не сохраняться.

Основой обработчика является программа wget с ключами -x -nH -np -r -l 0 - отсюда проистекают особенности:

Именование и типы файлов
Допустимыми символами имён файлов на unix файловой системе являются любые, кроме / и нулевого байта, поэтому все URI могут быть сохранены в виде точно таких полных путей, какими они отображаются в адресной строке броусера или указаны в HREF.

Однако есть 3 важных относительно легко исправимых исключения:

  1. /some_path/ вебсервером воспринимаются как показ файла /some_path/index.html - с этим ничего делать не надо, и так хорошо
  2. /some_path/some_file.php?some_query - вебсервер отображает /some_path/some_file.php и передаёт ему QUERY_STRING some_query - требует наличия файла-обработчика /some_path/some_file.php, который отрабатывает три ситуации:
    1. пустая query_string - показываем то, что было по URI /some_path/some_file.php
    2. непустая query_string и файл /some_path/some_file.php?some_query существует - показываем его
    3. непустая query_string и файла нет - вовзращаем Error 404
  3. /some_path/?some_query - вебсервер отображает /some_path/index.html и передаёт ему QUERY_STRING some_query - точно такой же обработчик, как в предыдущем пункте.
Для работы такого обработчика в настроенных сравнительно по умолчанию вебсерверах и требуется PHP. Хотя можно применить и SSI или какой другой язык программирования, лишь бы его логика позволяла простым и незамысловатым способом поместить в теле самого файла some_file.php (index.html) как HTML код страницы \"как она была скачана\", так и код обработчика.

Наиболее совершенная функция \"дорисовывания обработчика Query\" ко всем случившимся в дереве подкаталогов с текущего каталога таким файлам - SqAddQueryReportTree.

Менее совершенная ранее написанная - SqFilePage. Она обрабатывает только файлы в текущем каталоге, требует задания вручную имени .php файла и подразумевает, что самого такого файла как страницы нету, а есть только страницы с query.

Для корректной работы получившихся обработчиков в случае, если файлы some_file не имеют расширения .php - требуется настройка вебсервера. Например, если на сайте такие страницы имеют расширение /shtml - при сервере Apache следует добавить в конфиг сайта в файле allsites строку

echo 'AddHandler application/x-httpd-php .shtml'>.htaccess
Структура каталогов сайта

Где что лежит

Если Вы не редактировали конфиг, следующие две структуры не создаются.

Version $SqVersion Public Doimain. Общественное достояние." >>index.php wget http://www.w3.org/Icons/valid-html401 [ -s valid-html401 ] && mv valid-html401 valid-html401.png && echo "\"Valid">>index.php wget http://jigsaw.w3.org/css-validator/images/vcss [ -s vcss ] && mv vcss valid-css.gif && echo "\"Правильный">>index.php echo "

" >>index.php echo 'AddDefaultCharset utf-8'>.htaccess [ ! -z ${SqOldHallSite} ] && wget http://${SqOldHallSite}/mirrorpg.txt [ ! -s mirrorpg.txt ] && [ -s $SqRetPath/mirrorpg.txt ] && cp $SqRetPath/mirrorpg.txt ./ cd $SqRetPath # ----------------------------------- -------------------------------------- # Build default config for child hall Строим конфиг по умолчанию нового зала # Move some 'My' to 'Old' values. Передвигаем параметры из 'My' в 'Old' # This causes child hall to ask our Это заставит следующий зал качать # site for scripts and content. скрипты и контент с нашего. cat mirrorpg-config | perl -pe " \$NewRule=q($SqRuleMyHall); ~s!^SqMyHall=.*!SqMyHall=!gi ; ~s!^SqOldHall=.*!SqOldHall=$SqMyHall!gi ; ~s!^SqOldHallSite=.*!SqOldHallSite=mirrorpg.$SqMyHall!gi ; ~s!^SqRuleMyHall=.*!SqRuleMyHall=!gi ; ~s!^SqRuleOldHall=.*!SqRuleOldHall='\$NewRule'!gi ; ~s!^SqUser=.*!SqUser=!gi ; ~s!^SqGroup=.*!SqGroup=!gi ; ~s!^SqAddHost=.*!SqAddHost=!gi ; ~s!^SqMyIp=.*!SqMyIp=!gi ; ~s!^SqBasePath=.*!SqBasePath=!gi ; ~s!^SqHtmlDir=.*!SqHtmlDir=!gi ; ~s!^SqLogPath=.*!SqLogPath=!gi ; ~s!^SqLogFiles=.*!SqLogFiles=!gi ; " >mirrorpg.arda.ru/mirrorpg/mirrorpg-config # =================================== ====================================== # .First exists - keep files from it Если есть .First - сохраняем из него # to .Zero (hardlinked if can) файлы в .Zero (хардлинками если можно) for i in .First/*.tar.gz ; do [ -e $i ] && [ ! -d .Zero ] && mkdir .Zero && cp -l .First/*.tar.gz .Zero/ break done if [ -z $SqBasePath ] ; then echo "# =================================== ====================================== # No webserver virtualhosts path here Нет путей к вирт хостам вебсервера. # combine .Zero .tar.gz archives and Только собираем лежащие в .Zero и ска- # downloaded from old hall .tar.gz чиваемые со старого зала .tar.gz файлы" [ ! -z $SqOldHallSite ] && [ ! -d .Zero ] && mkdir .Zero [ ! -z $SqOldHallSite ] && SqDlTarGzMd5 Zero $SqOldHallSite First else echo "# =================================== ====================================== # Webserver virtualhosts path exists Есть пути к вирт хостам вебсервера. # Update content of these virt hosts Содержимое вирт хостов восстанавливаем # from .tar.gz archives kept in .Zero из архивов сохранённых в .Zero или # or downloaded from Old Hall скачанных со старого зала." SqReplace mirrorpg.arda.ru NoTarGz SqCreate First SqCreate Latest SqCreate Previous SqCreate Childs [ -d .Zero ] && cp -l .Zero/*.tar.gz .First/ SqUpdateIndex First if [ ! -z $SqOldHallSite ] ; then echo "===================================== ======================================" echo "old .tar.gz archives downloading... Скачивание .tar.gz архивов" SqDlTarGzMd5 First $SqOldHallSite First SqUpdateIndex First SqDlTarGzMd5 Previous $SqOldHallSite Previous SqUpdateIndex Previous SqDlTarGzMd5 Latest $SqOldHallSite Latest SqUpdateIndex Latest SqDlTarGzMd5 Childs $SqOldHallSite Childs SqUpdateIndex Childs fi # [ ! -z $SqOldHallSite ] ; then if [ -x $SqAddHost ] ; then echo " ===================================== ====================================== Hosts for .tar.gz archives creating Создание вирутал хостов под архивы and unpacking them to hosts dirs и распаковка их в каталоги хостов" for i in First Latest Previous do dirname=$i for j in .$i/*.tar.gz do [ -s $j ] || continue file=${j##.*/} domain=${file%%.tar.gz} echo -n "${domain}" SqBuildLines ${domain} SqAddConf >/dev/null 2>&1 SqExtract $dirname SqLatestDate=`stat -q -t %Y-%m-%d $j | awk '{print $10;}'` SqAddCsv echo -n '. ' done sleep 1 done echo " ===================================== ====================================== Initialize childs collection Инициализируем коллекцию детей" . ./mirrorpg-childs Init echo " ===================================== ====================================== Update .csv to .htm file апдейт .csv в .htm" SqUpdateCsv fi # [ -x $SqAddHost ] ; then fi # [ -z $SqBasePath ] ; then else echo "===================================== ======================================" # FINISH GENERATING NEW MIRROR HALL ОКОНЧАНИЕ ГЕНЕРАЦИИ ЗЕРКАЛЬНОГО ЗАЛА # =================================== ======================================