2009-07-07

Квотирование пробела и запятой в make

Нашёл решение "неудобной" задачи.

Не очень красивое - но работает. Лучше чем вот так напрягать sed через шелл:
var2=`echo $(var) | sed s/\ /,/g`

Нужно в Makefile заменить в переменной все пробелы запятыми. Если бы меняли все двоеточия на точки с запятой - проблем никаких:
$(subst :,;,$(var))

А нужная нам конструкция явно не работает:
$(subst ,,,$(var))

Решение - сделать переменные содержащие пробел и запятую. Более того - переменные можно сделать с "говорящими" именами: $(,) и $( ). На самом деле можно их использовать как "$ " и "$," - без кавычек :) Вот "код":

, := ,
space :=
space +=
$(space) :=
$(space) +=

После него работает, например, такой вызов:
$(subst $ ,$(,),$(var))

акм и все-все-все

Никто может и не заметил, но в К+ с какого-то времени появилась замечательная опция: /makeqr
Что крайне удобно для автоматической онлайн-регистрации.

Клоны АКМ работают "по-старинке" - то есть ищут окошки, нажимают кнопки, копируют и вставляют текст..

А процедура "онлайн-регистрации" куда проще..

0. Сносите регистрацию и историю пополнений. По желанию.
del DISTR\BIS\*.BIS
1. Формируете файлы SEND\*.QR:
cons.exe /makeqr
2. Отправляете файлы на сервер регистрации.
3. Получаете архив с файлами ответов (*.AR).
4. Распаковываете его в папку RECEIVE
5. Запускаете cons.exe /REG
"Все базы зарегистрированы"

Причём если запросы не поменялись (например всего лишь были приняты обновления на другой машине - и базы перенесены оттуда, или была переустановленна система
== если те же din и тот же BIOS), то и ответы будет идентичными :)

То есть ответы на регистрацию могут использоваться неоднократно. Надо только сохранить архив с ответами и выполнять пункты 4 и 5 :)

Например в скрипте, автоматически рассылающем через rsync обновлённые базы..

Если ваш комплект содержит DIN от разных ИЦ - кроме cons.qr появляются индивидуальные файлы запросов. Лучше всего их собрать в один файл - если номер ИЦ вас не беспокоит. Да и всем так удобнее и проще..

Для работы "в автоматическом режиме" есть пара скриптиков для такой "активности".

1. Active Perl (клиентская часть: создаёт QR, собирает в один файл, отправляет на сервер, принимает архив, распаковывает, запускает регистрацию..)
Может быть эту часть проще переписать на .net - чтобы уйти от зависимости перла.. Хотя опять же - проще использовать Gen чтобы формировать ответы на месте. Но тогда уже есть АКМС - переписанный на Цэ Gen.. Только его исходников особо не видно.. Но можно использовать бинарник..
Вариантов много, благодаря автору Gen открывшего источник получения магических чисел :)

2. perl+CGI+Gen.html (серверная часть: принимает запросы от клиентов, ищет в них запросы консультанта, запускает javascript-функцию из "Генератора циферок", собирает ответы в zip файл и посылает клиенту).. Для работы нужен javascript Gen.html (который может быть без особого труда найден на просторах рунета) :)

Без Gen'а, имхо, всё выглядит вполне "лицензионно чистым" и ничьих прав в принципе даже и не нарушает - нет программ "нарушающих работу баз данных".. Останется проблема легализации нахождения у вас К+..

Ngnix как почтовый прокси сервер

Возникла задачка - закинуть почту из старого корпоративного сервера в гугль аппс..
Сборщик POP3 у гугля естественно есть. Провайдер даёт pop3 доступ.
Казалось бы всё просто. Ан-нет!

Провайдер (ЦентрТелеком) не пускает к себе на POP3 из внешних сетей.
То есть порт то открыт - но всегда auth failed.

Сначала решение "в лоб". Попытаться открыть ssh туннель.
Но пол-часика помучившись - так и не удалось.
Руки кривые и что-то не так делал :)

Второе решение - разобраться таки с nginx.
Ну чего там - "прокси сервер" :)
Но вот где адрес сервера к которому подключаться надо - в конфигах
"прокси" подозрительно не находилось. Всё указывало на необходимость
использовать какой-то http_auth.
Опять же - для этого нужен внешний скрипт, а скрипты к ngnix'у прикручивать..
Безопасно пока не научился :)

Однако можно заставить самого nginx отвечать на свои же запросы :)

1. Ставим:
sudo apt-get install nginx
sudo apt-get build-dep nginx

2. Скачиваем nginx с родного сайта.
И распаковываем. unp nginx*
Тот, что идёт в комплекте с убунтой во-первый старый, (даже из самой свежей репки не говоря о харди что у меня стоит). Во вторых собран без поддержки mail proxy.

Можно, конечно, сделать apt-get source nginx
Добавить в файле debian/rules опцию --with-mail
и сделать apt-get source -b nginx
Но это слишком просто :)

3. В папке создаём файлик config-run
./configure --conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--with-mail

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

4. Собираем:
. config-run
make

5. Копируем на будущий прокси обновлённый бинарник.
scp objs/nginx root@myproxy:/usr/sbin/

6. Правим конфиг /etc/nginx/nginx.conf
user www-data;
worker_processes 1;

events {worker_connections 10;}

http {server {
listen 8080;
location /auth { # mailcheck
add_header Auth-Status OK;
add_header Auth-Server 212.26.224.70;# pop3.ryazan.ru;
add_header Auth-Port 110;
return 204;
}
}}

mail {
auth_http localhost:8080/auth;
server {
listen 110;
protocol pop3;
proxy on;
}
}


7. Запускаем и проверяем.

Что ещё можно. Можно проверять доступ - запрос на /auth содержит поле Client-IP.
Можно сделать "настоящий" скрипт. Или использовать возможности rewrite самого nginx..
Например для перенаправления на разные pop сервера для разных IP - или например для разных логинов..