#!/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
Зеркальный зал предназначен для того, чтобы информация,
содержащаяся на сайтах X Y Z, была в принципе доступна
в интернете, даже если сами сайты X Y Z, их хостинги
и-или домены прекратят своё существование любым способом.
Зеркальный зал - это:
человек, который занимается залом
и контролирует домен и
сервер.
домен A - главный домен зала.
сервер, на котором запускаются скрипты
и находятся сайт зала c архивами и статические копии X.A Y.A Z.A
сайтов 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 "
По умолчанию предлагаемый для скачивания конфигурационный файл,
а также и скрипт генерации нового зала обеспечивает участие в иерархии:
для зала есть один старый зал - с которого скачиваются
скрипты и копии сайтов.
для тех, что скачает и запустит скрипты с этого зала - этот зал
является старым залом.
зал сообщает о своём доменном имени старому залу
при скачивании со старого зала какой-либо информации
abandoned - сохранённые конфиги для уже неработающих сайтов
В опубликованной в данный момент версии $SqVersion пока не доделано кое что задуманное:
сбор .tar.gz архивов с \"дочерних\" залов
функционал генерации виртуального хоста для вебсервера (я не могу охватить всё многообразие)
Ресурсы
Для создания своего зеркального зала нужны следующие ресурсы:
реальный или виртуальный сервер на Linux/FreeBsd/CentOs/Debian... любом другом Unix'e. Root доступ не обязателен.
веб-сервер с PHP (c работающими функциями file_exists file_get_contents и preg_match)
возможность создавать произвольное число виртуальных хостов на этом сервере.
доменное имя, которму можно вписать в зону * IN A $SqMyIP.
bash, wget (версии не менее примерно 1.17), perl, awk, iconv, sed, md5, utf-8 локаль на сервере.
не вполне кривые руки того, кто будет редактировать эти скрипты и запускать их.
Инструкция
Положим, Вы решили сделать свой зеркальный зал на основе моих скриптов.
Домен
Все сайты, которые Вы покажете интернету в своём зеркальном зале,
имели свои отдельные исходные доменные имена (чаще всего никак друг с
другом не связанные), лежали на разных серверах с разными 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 и убеждаемся в результате.
Вебсервер
К сожалению, готовых скриптов, которые бы подошли к любому вебсерверу,
сегодня не завезли. Кроме того, авторы всех таких программ систематически
меняют синтаксис и параметры конфигурационных файлов, а также способ их
расположения в операционной системе.
Так как данная система рассчитана на многолетнее существование,
я не могу предполагать, что написанный мной сегодня скрипт будет
корректно делать конфиг для apache или nginx хотя бы через два года.
Поэтому, если Вы не хотите делать много ручной работы - Вам придётся
написать минимальный скрипт для Вашего вебсервера самостоятельно. Пример
для apache 2.2:
Правильнее всего все дальнейшие действия совершать в Unix Shell.
Если Вы не умеете этим пользоваться - научитесь.
mkdir ~/mirrorpg
cd ~/mirrorpg
wget http://mirrorpg.$SqMyHall/mirrorpg/mirrorpg-config
sh ./mirrorpg-config
Этот скрипт скачает все остальные скрипты и установит им возможность
исполнения.
Теперь отредактируйте скачанный mirrorpg-config, указав в нём все
требуемые параметры. Описание того, каков смысл этих параметров
непосредственно там же и написан, поэтому здесь я его не привожу.
Создание зала
Запускаете
./mirrorpg-generate
Этот скрипт сделает следующее:
Создаст виртуальный хост для вашего основного сайта и поместит в него скрипты и такой же index.php
Создаст каталоги .First .Latest .Previous для хранения архивов сайтов
Скачает по крайней мере в каталог .First все файлы с предыдущего зала из каталога First
Проверит md5 контрольные суммы скачанных архивов, не совпавшие сочтёт неудачными и сотрёт
Для каждого из проверенных архивов создаст виртуальный хост
Развернёт эти архивы в их виртуальные хосты
Внесёт информацию об этих хостах в mirrorpg_good.csv
Преобразует mirrorpg_good.csv в mirrorpg_good.htm и поместит эти два файла на основной сайт зала
Если Вы после этого перезапустите вебсервер (для Apache
это обычно apachectl restart) - то по адресу
mirrorpg.Ваш_Домен увидите уже свой зеркальный зал со
всеми ссылками на скрипты, на каталоги First Latest Previous
и на копии сайтов, в точности как и на этой странице.
Пройдя по ссылкам справа под заголовком Хорошо -
убеждаетесь в том, что зеркала работают.
Обновление
Прежде чем запускать обновление копий сайтов с их оригиналов,
мы настоятельно рекомендуем пройтись по ссылкам раздела Хорошо
и убедиться в том, что оригинальные сайты работают.
Если конкретный оригинальный сайт не работает, его следует
исключить из процедуры обновления зеркала. Если этого не сделать,
то вы испортите то содержимое копии сайта, что показывается в вашем
зеркальном зале.
Для исключения сайта из процедуры текстовым редактором перенесите
относящиеся к нему строки (начинающиеся со строки
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 важных относительно легко исправимых исключения:
/some_path/ вебсервером воспринимаются как показ файла /some_path/index.html - с этим ничего делать не надо, и так хорошо
/some_path/some_file.php?some_query - вебсервер отображает /some_path/some_file.php и передаёт ему QUERY_STRING some_query -
требует наличия файла-обработчика /some_path/some_file.php, который
отрабатывает три ситуации:
пустая query_string - показываем то, что было по URI /some_path/some_file.php
непустая query_string и файл /some_path/some_file.php?some_query существует - показываем его
непустая query_string и файла нет - вовзращаем Error 404
/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 строку
Созданный Вами каталог mirrorpg, в который Вы скачали
mirrorpg-config и в котором лежат все остальные
исполняемые скрипты mirrorpg-*. В нём также присутствуют:
Симлинки - имена доменов, создаваемые mirrorpg-allsites или
mirrorpg-1site при скачивании с оригинальных сайто. Указывают во
временные каталоги /tmp/mirrorpg/домен/
Каталог .Zero - если он существует, то .tar.gz файлы из него
добавляются в зал. Если вы будете запускать mirrorpg-generate
уже при работающем зале, в этом каталоге будут сохраняться архивы
из First.
Симлинки .First .Latest .Previous - на
каталоги First Latest Previous в структуре виртуал
хоста mirrorpg.arda.ru
Если Вы не редактировали конфиг, следующие две структуры не создаются.
Скрипты считают, что корневые каталоги вирт хостов вашего вебсервера
находятся в путях образца \$SqBasePath/\$NowDomain/\$SqHtmlDir.
В виртуал хосте mirrorpg.arda.ru имеется структура (относительно его корня):
First/ - сюда generate складывает .tar.gz архивы скачанные с предыдущего зала Latest/ - сюда allsites складывает .tar.gz архивы новых копий с оригинальных сайтов Previous/ - сюда allsites перекладывает архивы из Latest Childs/ - сюда собираются архивы с детей mirrorpg/ - здесь лежат все предназначенные для скачивания в следующий
зал скрипты и заготовка конфига, причём флаг исполнения со всех файлов снят чтобы
случайно их не запустить index.php - Эта страница mirrorpg-good.csv - таблица сайтов, создаваемая и обновляемая автоматически mirrorpg-good.htm - столбец Хорошо этой страницы - ссылки на зеркала и оригиналы mirrorpg-childs.txt - список главных доменов других залов. Обновляется автоматически mirrorpg-childs.htm - ссылки на другие залы (столбец под заголовком \"С нами\") robots.txt
" >>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 ОКОНЧАНИЕ ГЕНЕРАЦИИ ЗЕРКАЛЬНОГО ЗАЛА
# =================================== ======================================