Позднее Ctrl + ↑

Добавляем камеру в Domoticz

Небольшая правка

Была куча нюансов в работе камер с системой «умного дома». Например, не отображались скриншоты и «живое» видео при нажатии на соответствующие пункты. Сегодня удалось это победить. Как я уже ранее писал, камеры у меня китайские, от Xiong Mai. Ну вот так получилось...
Чуть отступлю от темы. На днях разобрал обе камеры и припаял к ним выходы для внешних микрофонов. Нашелся штекер чуть больше размером, но, после доработки напильником, он четко встал на положенное место (обе камеры были с нужными разъемами, но не выведенными наружу). В итоге вывел три контакта: питание, землю и контакт микрофона. Остальные пока что остались в камере, при желании их можно за короткое время тоже начать использовать. Например, для подключения аудиоколонок. Микрофоны оказались ОЧЕНЬ чувствительными, спокойно ловят звук открывающейся двери на первом этаже. Или звук отъезжающего с другой стороны дома автомобиля. Один «минус» — звук как из бочки, глухой. Я бы подумал, что это просто неисправный микрофон, но он такой не один. Очень надеюсь побороть этот дефект.
Но вернемся к нашим баранам. Поиск в интернете навёл меня на одну страницу, с которой я перепробовал несколько ссылок. Одна из них оказалась вполне себе рабочей, но недокументированной. Выглядела она таким образом:

http://192.168.1.15/webcapture.jpg?command=snap&channel=1?

Используя эту ссылку (IP камеры, конечно, нужно изменить на нужный), можно получить текущий скриншот с камеры.
Вторая часть, которая дала мне понимание почему Domoticz так плохо работает с камерами, нашлась на официальном форуме. Суть состоит в том, что «домик» не берет поток с камер как таковой, а использует систему ежесекундных скриншотов. Именно поэтому для так важен адрес их получения. Да, изображение получается дерганым, но с этим, похоже, ничего не сделать. По крайней мере, пока что.
Еще один «минус», который всплыл после этой перенастройки — мобильная версия Domoticz плевать хотела на них и просто не отображает видеопоток. Также, если настроить отправку скриншотов при обнаружении движения, они отправляются только на электронную почту. В тот же Telegram отправки нет. Почему?

Открытый почтовый релей

Внезапно обнаружил, что мой почтовый сервер стал полностью открытым. Если честно, то даже не помню когда вносил какие-то сколь значимые изменения в конфигурацию postfix. С какого перепуга произошло это событие — для меня пока что загадка. Единственное, что косвенно указывало на это — возросшая нагрузка на сервер. Но я «грешил» на другое. Команда mailq сегодня выдала очередь из более чем 100 тысяч сообщений на отправку. Пришлось убивать всю очередь, не искать же нормальные письма в такой куче. Изменил несколько параметров почтовика, вроде бы все более-менее пришло в норму, даже сервер стал отвечать побыстрей. Но тесты все равно выдают, что у меня открытый релей, поэтому завтра, если будет свободное время, придется сбрасывать конфигурацию postfix и dovecot на «заводскую» и настраивать всё заново. Благо, что есть рабочий корпоративный сервер и часть настроек можно перенести оттуда. Впрочем, настройка с нуля поможет освежить мою память в этом плане и, возможно, пересмотреть некоторые настройки безопасности.

Синхронизация данных с Nextcloud

Должен сказать, что до этого я предпочитал использовать другие программы для хранения данных, но постепенно отказался от них в пользу своего сервера. Если, например, носить данные только на флэшке, то достаточно велика вероятность повредить или совсем их утерять. А ручная синхронизация — это не для нас, она занимает время и можно банально забыть или не успеть её сделать и опять же потерять данные.
Итак, что мы будем синхронизировать? Пройдемся по списку.

  1. Конечно же, пароли. Это одна из самых важных частей нашей жизни.
  2. Файлы. Каждый день мы работаем с кучей файлов: документы, рисунки и прочее.
  3. Контакты. Очень обидно утерять нужный контакт.
  4. Закладки браузера. Казалось бы зачем? Но одно из главных правил системного администратора: бэкап, бэкап и еще 100 раз бэкап. Поэтому пусть будет.

По хорошему, в этот список еще бы включить заметки, но я пока что не нашел способа их синхронизации.
Пароли.
Для этого мы будем использовать известную программу KeePass (или любой из ее форков). Программа старая, проверенная, с открытым исходным кодом. Кому-то она может показаться некрасивой из-за своего интерфейса, но, по моему мнению, это только сохраняет ресурсы системы при работе с ней.
Где нам чаще всего нужны пароли? Во-первых, конечно, в браузере для входа на какой-то сайт. Во-вторых, на телефоне. Например, для входа на те же сайты, но на чужом компьютере или на самом телефоне. В-третьих, на компьютере. Тут вариантов применения множество.
Для начала нужно создать саму базу данных. Для этого на компьютере запускаем программу KeePass, создаем базу, настраиваем её и сохраняем в файл. Далее этот файл нам нужно перенести в облако Nextcloud. Ну тут вы уже сами :-) Для пущей безопасности создаем в облаке еще одного пользователя с произвольным именем и паролем и дадим ему доступ только к файлу паролей. Зачем это нужно я объясню чуть позже.
Браузер.
Так как я использую Firefox, то мне пригодится расширение под названием KeePass Tusk. Это расширение может работать с файлами, расположенными не только в Nextcloud, но и Google Drive, Dropbox, Onedrive, PCloud. В список возможностей так же входит открытие базы по ссылке общего доступа или через протокол WebDAV. Устанавливаем и настраиваем расширение по своему вкусу. Надо отметить, что за несколько месяцев использования у меня были проблемы с доступом по ссылке общего доступа («забывало», что доступ есть), но ни разу — через WebDAV. Но так как имя пользователя и пароль в таком случае хранятся на диске незашифрованными, то велика вероятность их компрометации. Именно поэтому я и создал отдельного пользователя Nextcloud с доступом только к одному файлу.
Телефон на Android.
Здесь я использую программу Keepass2Android. Из «плюсов» программы стоит отметить возможность разблокировки базы через отпечаток пальца, синхронизацию баз при открытии, автоматическое создание резервной копии и нормальный поиск.
Компьютер.
Так как у меня на домашнем компьютере стоит Linux, то я решил использовать KeepassXC. Но вы, при желании, можете использовать и «основную» версию Keepass, которая, начиная со второй версии, поддерживает Mono, что, в свою очередь позволяет запускать ее в Linux.
Файлы.
Ну тут проще всего использовать клиента Nextcloud для настольного компьютера. Что это дает? Во-первых, копию всех ваших файлов в облаке. В том числе и копию вашей базы с паролями. Во-вторых, согласитесь, что редактировать файлы лучше всего на компьютере, не заходя в облако.
Контакты.
На мой взгляд, одна из самых важных вещей. И вторая по сложности восстановления после паролей. Помнится очень давно я настраивал свой старый телефон на синхронизацию контактов (и еще чего-то, уже помню точно чего) с одним сервером. И в какой-то момент телефон начал «глючить» настолько, что мне пришлось сбросить его до заводских настроек. Дело это было на улице, поэтому сразу восстановить все данные у меня не получилось бы. Но я помнил адрес сервера, имя пользователя и пароль. Поэтому мне оставалось только вбить эти данные в настройки телефона и через несколько минут вся моя адресная книга была в телефоне. Это было очень приятное ощущение :-)
Где мы можем добавлять и редактировать контакты? Конечно, в телефоне. Но я не люблю этого делать там просто из-за некоторого неудобства редактирования. Поэтому я обычно записываю только основные данные (имя, фамилию и номер телефона), а остальное добавляю уже на компьютере.
Где обычно используются данные контактов? В телефоне — раз. Чтобы позвонить или написать смс. В почтовом клиенте — два. Чтобы отправить письмо по электронной почте. Про остальные способы общения пока умолчим.
Тут должен упомянуть, что помимо Nextcloud, у меня развернут свой Cal/CardDAV сервер на базе Baikal и упор сделан на синхронизацию с ним. Это позволяет мне синхронизировать контакты, заметки и задачи на любом телефоне, поддерживающем SyncML, а не только Android. На мой взгляд, это достаточно удобно.
Начнем с мобильного телефона. Для синхронизации контактов и задач используем приложения DAVx5 и Open Tasks. В них у меня зарегистрированы два сервера: Nextcloud и Baikal. Если также установить клиент для мобильного Nextcloud, то контакты будут автоматически копироваться в облако в отдельный скрытый каталог.
Для почтового клиента Thunderbird установлено расширение CardBook. И, наконец, установлен плагин CardDAV для веб-интерфейса Roundcube.
Закладки.
Для синхронизации данных между браузерами, установленными на разных компьютерах и телефонах, я изначально использовал учетную запись Mozilla. Но лишняя копия не помешает же? Тем более, что много места она не занимает. Поэтому устанавливаем расширение Floccus и настраиваем его в соответствии со своими предпочтениями. В Nextcloud нам понадобится приложение Bookmarks.

Влажность в квартире

Собрал мини-метеостанцию для зала (планирую установить подобные во все комнаты квартиры), подключил её к Domoticz. Получилось отлично — сама станция размером со спичечный коробок, нужно только подобрать ей корпус.
Показания поначалу ввели в ступор: давление около 1000 и влажность около 20%. Залез в документацию, оказалось что давление датчик измеряет в гПа. Пришлось в прошивке ESP8266 создавать еще один виртуальный датчик и пересчитывать для него показания в мм ртутного столба. Всё таки в России используется такая единица измерений. А вот с влажностью непонятно до сих пор. Текущие показания — 17%, хотя норма составляет 40-50%. Поначалу думал, что что-то с датчиком. Распаковал новый, установил — картина не изменилась. Сейчас на работе вспомнил об этом, подключил AM2302 — тоже около 18%. Хоть на улицу выноси! Пришлось пойти на сайт narodmon.ru. Там картина поинтересней — показания колеблются от 14% до 24%. Хм, ладно, допустим, что все используют одно и то же оборудование. В таком случае нужно обратиться к более официальному источнику. Но «официалы» показали примерно ту же картину — от 20% до 30%.
В общем, пока что можно успокоиться и провести несколько экспериментов по её повышению, вроде кипящего рядом чайника.

Показания барометра
Показания барометра
Виртуальный датчик
Виртуальный датчик

Новые ESP8266

Дней 10 назад полностью пришел мой заказ: 10 ESP8266 12E, 10 плат-адаптеров для них и 20 штук регуляторов напряжения HT7833 с нужной распиновкой. Первым делом, конечно, решил собрать пару штук. Регуляторы по размеру оказались чуть меньше, чем контакты под них на адаптере, но это полбеды. Чуть больше припоя — и все замечательно. Пайка ESP тоже проблем не вызвала. А вот включение этой сборки меня напрягло — регуляторы ощутимо «жарили». Пробовал другой источник питания — картина не менялась. Напряжение на входе было стабильно низким и его явно не хватало для запуска модуля. Вроде бы и проверял все на несколько раз, но все равно оставалось непонятным такое их поведение. Решил отложить пока в сторону, ибо были и другие задачи.
Сегодня, когда появилось свободное время, решил вернуться к этому вопросу. Смахнул с платы регулятор, впаял перемычку и... На мое удивление все заработало в штатном режиме. Питание не проверял. Взял еще один набор, собрал без HT7833, подал 3.3 вольта. Все работает. Хм... Вернулся к предыдущему, припаял новый HT7833, подал питание. Регулятор не грелся, ESP-ха приветственно мигнула индикатором WiFi, типа «привет, хозяин». Погоняв модуль несколько минут, единственным вариантом почему у меня они грелись в последний раз осталась переполюсовка. Может быть, меня тогда «перемкнуло»?
Запустил прошивку модуля. Тут во весь «рост» стала другая проблема. Оказалось, что «ноги» для адаптера имеют чуть меньший диаметр, чем нужно. Вследствие чего у меня наблюдался крайне нестабильный контакт. Но как-то обошел этот момент и удалось залить прошивку ESPEasy. Подключился к модулю, посмотрел информацию. Вроде бы все нормально. Но что-то не давало покоя... После прошивки третьей микросхемы и промотра информации о ней, понял — по документации в этих модулях 512 Кб памяти, а прошивка мне показывает, что реальный размер — 4 Мб. Да это же мне позволяет обновляться через OTA!!! Скачал более свежий релиз прошивки и пошел накатывать на все модули, которые успел спаять.

Модификация камеры

Как уже писал ранее, в коридоре у меня висит камера, записывающая все события, происходящие в нем. Но, как обычно, хочется же большего. Например, также записывать и звук. Но увы, такой функционал эта камера не предоставляет. Поискав камеры с записью звука в городе, немного взгрустнулось — такую цену за нее я отдать не готов. Как финансово, так и морально.
Попробовал отдельно подключить микрофон к аудиовходу регистратора — оказалось, что он работает только в «гибридном» режиме или в аналоговом. В режиме NVR — увы. Хотя чувствительность микрофона оказалась очень высокой — он слышал речь жены, когда она находилась в зале, через закрытую входную дверь. Мою речь он почему-то не слышал. Видимо, более низкие частоты не проходят через дверь. В итоге пришел к выводу, что микрофон нужно подключать непосредственно к камере.
Какое-то время спустя попытался поискать варианты подключения. И наткнулся на одно любопытное видео, где было показано как это сделать. Снимать установленную камеру и разбирать её мне не хотелось, поэтому решил купить еще одну такую же. Всё равно хотел расставить еще несколько по квартире.
Итак, сегодня забрал камеру, вернулся на рабочее место и разобрал её. По коду на наклейке нашел документацию. Оказалось, что это одна из 2.0M Hi3518EV200 Network Camera Module. Но в документации не оказалось распиновки заинтересовавших меня разъемов. На самой плате оказался еще один код, который и привел меня к нужной информации. Любопытно, что она оказалась на известном мне форуме и притом только там. Больше ни одна ссылка не пригодилась.
Изучая описание, пришлось воспользоваться переводчиком с китайского. И вот тут меня ожидал небольшой сюрприз. Дело в том, что по указанной выше ссылке, человек пытался подключить к камере хоть какой-то накопитель (USB-флэшку, SD-карту и т. п.), чтобы записывать видео на него. А я для себя обнаружил не только вход микрофона, но также и выход на динамики. Иными словами, при помощи одного разъема я могу организовать двухстороннюю связь через камеру, а при помощи второго — использовать ее как полноценный видеорегистратор.

Продление домена

Вчера утром пришло очередное напоминание об окончании срока регистрации домена. И, хотя до него оставалось еще около трех недель, решил не откладывать и продлить срок регистрации.
Для начала зашел на сайт «основного» регистратора, посмотрел цену — 899 рублей. В памяти всплыло, что где-то видел дешевле. Зашел на сайт партнерского регистратора, где первоначально регистрировал домен. И верно, цена в полтора раза ниже — 599 рублей. Деньги лишними не бывают, поэтому будет продлевать тут :-) Выбираю пополнение баланса, в качестве метода пополнения — списание с банковской карты. Подтверждаю пополнение, получаю смс о списании денег. В личном кабинете выбираю продление, деньги списываются со счета, текущий баланс становится равным 1 рублю. Следом падает еще одна смс и письмо на почтовый ящик. Поначалу подумал, что это подтверждение о продлении. Открываю смс, а в ней информация об отказе в приеме платежа и возврате средств. Странно... Открываю письмо — оно от системы Яндекс.Деньги. В письме текст, говорящий что что-то пошло не так, поэтому деньги они мне возвращают. Да ёпрст! Возвращаюсь в личный кабинет — там то же самое, что и в письме от Яндекса. Блjad! Открываю список доменов, а мой продлен до 2020 года. Не понял! Подождал несколько часов, проверил снова — продлен. По подсказке в одном чате смотрю результаты whois — тоже продлен. Хм...
Насколько я понял, деньги поступили на лицевой счет регистратора, я успел оплатить продление, списав деньги со счета в личном кабинете. Затем что-то пошло не так и Яндекс вернул всю сумму, которую я успел перевести. По итогу, домен продлен, денег на это не потрачено. Но для полной уверенности нужно дождаться 23 апреля и посмотреть не изменится ли ситуация.

Задолбал Gmail

Как и у большинства людей, на чьих телефонах установлен Android, на моем стоит почтовый клиент Gmail. Хороший почтовик, особенно когда появилась возможность добавлять любые серверы. Но с некоторых пор он меня начал люто бесить.
Итак, что имеем. В программе заведены две учетные записи: google и моего личного сервера. Обе работают через IMAP. И если с учеткой google все более-менее в порядке, то с моей... полный швах. Причем раньше такого не было.
Допустим, пришло мне 20 писем. Я подключаюсь к домашней сети по WiFi. Телефон радостно мне сигнализирует звуком и вибрацией о том, что есть новая почта. Хорошо, все норм, вроде бы. Ага, разбежались! 20 писем пришло — получите один звуковой сигнал, светоиндикацию и 20 раз вибрацией. В принципе, это можно было бы пережить, если бы не второй нюанс. Если «смахнуть» уведомление о пришедшей почте, то через некоторое время, в случае поступления нового письма, оно прилетит обратно. Угадайте, сколько раз будет вибрировать телефон? Один? О, вы наивны! Двадцать один!
Другая ситуация. Уведомление не «смахиваем». Итак, 20 писем пришло, просматриваю их на компьютере (или на телефоне, роли особой не играет), по прочтении удаляю ненужные. Как и в большинстве программ, если просматривать письмо в течение заданного времени, то оно отмечается прочтенным. Несколько прочтенных, несколько удаленных. Закончили просматривать почту, взяли в руки телефон, «смахнули» уведомление о новой почте. Так-так... Было же 20 новых писем? Стало 0? Сколько раз будет сигналить телефон? Как обычно, один звуковой сигнал, светоиндикация и 20 раз вибрировать. И не дай вам бог, в процессе всего этого действа снова «смахнуть» уведомление. Получите еще один звуковой сигнал! Телефон-то помнит, что у вас было 20 новых писем! А что их стало меньше — не его проблема, будет сигнализировать о каждом, по его мнению, непрочтенном.
И вот такое поведение сильно раздражает. Не знаешь, то ли тебе кто-то что-то написал, то ли пришло уведомление от какой-то охранной системы, то ли просто gmail бесится.

«Умный» дом

Добавляем камеру в Domoticz

Во-первых, почему Domoticz? Мне он показался намного более простым по сравнению с Majordomo и другими системами. Во-вторых, этот пакет присутствует в репозитории на роутере (с установленным OpenWrt). С одной стороны ставить такую программу я предпочел бы на сервер, с другой — именно роутер является точкой, соединяющей все сетевые устройства в квартире. Поэтому пусть пока будет так.
Так как камера у меня — «чистый» китаец, то просто так добавить ее в систему не получится. По крайней мере, мне это не удалось. Пришлось идти обходным путем.
Строка подключения к камере выглядит примерно так:

rtsp://192.168.1.12:554/user=admin&password=&channel=1&stream=0.sdp?real_stream

Открыв этот адрес, например, через плеер VLC, можно увидеть основной поток камеры. В принципе, строку можно чуть-чуть сократить, убрав всё после sdp. В любом случае, Domoticz такое не понимает. Поэтому нам понадобится пакет под названием motion. У меня он уже установлен и отправляет мне в Telegram фото событий. Камера у меня пока что одна, но в будущем планируется еще несколько, поэтому все настройки, отличающиеся от настроек по умолчанию, я вынес в отдельный файл, который подключил в motion.conf. Там нам понадобятся несколько параметров, перечисленных ниже.

netcam_url rtsp://192.168.1.12:554/user=admin&password=&channel=1&stream=1.sdp?real_stream
netcam_keepalive on
width 704
height 576
stream_port 8091
on_event_start /root/motion/actions/on_event_start
on_event_end /root/motion/actions/on_event_end

Первая строка — подключение к самой камере на вторичный поток. Вторая — поддержка подключения, можно пропустить. Третья и четвертая — размеры кадра вторичного потока, у меня они такие. Можно выбрать, конечно, и основной, но это повлечет за собой увеличение трафика в сети и времени подключения. Самая «интересная» строка — следующая. Она указывает motion через какой порт выводить картинку. И последние две строки — пути к скриптам, которые будут выполняться при возникновении и завершении события. У скриптов должны быть установлены права на выполнение.
Запускаем motion и первым делом проверяем наличие потока, просто открыв ссылку в браузере. Например, motion у нас будет установлен на компьютер с адресом 192.168.1.10. Тогда в браузере набираем:

http://192.168.1.10:8091/

Вы должны увидеть видеопоток с камеры. Если его нет — придется разбираться что не так. Чаще всего просто не открыт указанный порт на компьютере. Если картинка есть — идем дальше.
Открываем Domoticz и пробуем добавить камеру.

Нужное меню в Domoticz Добавляем камеру в Domoticz
Добавляем камеру в Domoticz

Протокол оставляем HTTP, в качестве IP-адреса указываем адрес компьютера, куда установили motion. Порт указываем тот же самый, что и в файле настроек motion. Имя пользователя и пароль заполняем в том случае, если для просмотра камеры нужна авторизация. Ну и в ImageURL забиваем полный путь к потоку, тот же самый, который вбивали в браузере при проверке потока камеры. Нажимаем «Тест соединения» и надеемся, что картинка появится. Обычно на это нужно до 10 секунд. Если картинки нет, значит что-то пошло не так и придется всё проверять. В моем случае картинка нормально появляется когда я работаю в домашней сети. Если я запускаю Domoticz с рабочего компьютера, то она не показывается.
Нажимаем кнопку «Add», чтобы добавить камеру в список. И тут тоже есть нюанс. В строке с камерой тоже есть предварительный просмотр, но в моем случае он не работает. Также не работают кнопки «Сделать снимок» и «Stream video». Но это не важно, камера работает.
Не зря же мы это все делали? Пусть теперь камера работает датчиком движения — нечего ей просто так висеть на потолке. Например, включает освещение в коридоре, когда обнаружит движение.
В качестве выключателя с удаленным доступом у меня стоит простой Sonoff Basic, подключенный к моей сети через WiFi. Идем в настройки Domoticz, выбираем «Оборудование». В выпадающем списке ищем пункт «Dummy (Does nothing, use for virtual switches only)», называем его как-нибудь и нажимаем кнопку добавить. Теперь в списке чуть выше нажимаем кнопку «Создать виртуальные датчики», вводим название выключателя (придумываем сами) и указываем тип «Переключатель». Жмем «ОК». Всё, мы создали виртуальное устройство, которое будет управлять освещением в коридоре. Остается теперь соединить между собой камеру и выключатель.
Вспоминаем, что у нас есть два скрипта от motion, которые выполняются при возникновении и завершении события, в данном случае — в коридоре. Добавляем в каждый из скриптов по одной строке. В  /root/motion/actions/on_event_start добавляем

/usr/bin/curl -s "http://api_username:api_password@domoticz_server:domoticz_port/json.htm?
type=command&param=switchlight&idx=your_ID&switchcmd=On"

а в  /root/motion/actions/on_event_end такую строку:

/usr/bin/curl -s "http://api_username:api_password@domoticz_server:domoticz_port/json.htm?
type=command&param=switchlight&idx=your_ID&switchcmd=Off"

Теперь разберем, что это за бред.
curl — программа, позволяющая выполнить те или иные действия по указанному адресу, используя только командную строку.
api_username и api_password — имя пользователя и пароль, которые вы установили для доступа к Domoticz. Если не устанавливали, то эту часть «api_username:api_password@» можно не вводить.
domoticz_server и domoticz_port — IP-адрес и порт компьютера, где у вас установлен Domoticz. В качестве порта нужно указать стандартный 8080, если, конечно, вы не делали перенаправления портов.
idx=your_ID — в качестве your_ID нужно указать значение выключателя из колонки Idx таблицы устройств. У меня это значение равно «1».

Таблица устройств
Таблица устройств

Ну и последний параметр switchcmd может принимать значения On или Off, в зависимости от того, хотите ли вы включить освещение или выключить соответственно. Подозреваю, что можно также указать «1» и «0» соответственно, но, если честно, лень проверять :-)
Должен также отметить, что в Sonoff установлена не стандартная прошивка с привязкой к китайскому облаку (и возможностью потерять доступ к своему выключателю из-за рвения Роскомнадзора заблокировать всех и вся), а Tasmota. Возможностей у нее немного, но лично мне хватит с избытком. Не будет же выключатель вещать радио, когда мне скучно? :-)
Теперь почему мы используем такой сложный способ включения/выключения? Просто при таком способе состояние выключателя будет корректно отображаться в Domoticz в случае возникновения или завершения движения в коридоре.

Зеркало NOD

Немного прошелся по своему зеркалу, «причесал», подправил недочеты. Сделал страницу регистрации, ибо негоже когда человеку приходится писать тебе, чтобы получить доступ к нему. Сейчас можно просто открыть страницу регистрации, ввести свой email, который будет являться логином и после нажатия кнопки «Отправить» скрипт сохранит данные на сервере и отправит их копию пользователю на указанную электронную почту.
Поначалу хотел использовать команду системы для генерации хэша пароля, но оказалось, что последний генерируется неправильно. На счастье в интернете нашелся PHP-код, который выполняет те же самые действия, но уже правильно.
Потом хотел сделать чтобы все страницы сайта располагались в одном файле, но что-то пошло не так и я отказался от этой затеи. Не настолько я знаю PHP и JS, чтобы отлавливать и исправлять ошибки в коде.
В конце страницы появилась небольшая статистика: сколько всего зарегистрировано пользователей, сколько в этом месяце использовало зеркало и сколько человек сейчас находится на сайте. Любопытно, что зарегистрировалось около 50 человек, а используют примерно 30. Где остальные? Судя по журналам, они даже не пытались скачивать обновления. По этому поводу мелькает мысль примерно раз в полгода удалять тех, кто ни разу не обновлялся с зеркала. Или уже оставить как есть?

Ранее Ctrl + ↓