понедельник, 4 июля 2016 г.

Про OCR

Исходные данные: 
Xubuntu 14.04, средняя во всех отношения рабочая станция.

  Задачу представитель заказчика прописал предельно просто - надо поставить на (имя, адрес) какую-нибудь OCR, что там есть... А что там есть? Общение с Гуглем показало что реально свежего материала-то и нету... То есть совсем. Нормальные толковые статьи имеют давность пары лет, а то и поболее, что смущает. Удалось нарыть лишь одну единственную статью, которая понравилась. Осталось тупо попробовать.
   Вот какие получились выводы. Для большинства применений подходит yagf, возможно где-то будет интересен ocrfeeder. Это фронт-енды. В качестве движка понравился tesseract, как есть без обучалок и т.п. ну "до кучи" ставим cuneiform (как самого старого и заслуженного). Собственно установка
apt-get install tesseract-ocr tesseract-ocr-eng tesseract-ocr-equ tesseract-ocr-rus tesseract-ocr-osd cuneiform ocrfeeder yagf unpaper

   А вот что касается использования... тут учиться, учиться и учиться. А в связи с тем что людей надо научить... В общем по-хорошему надо бы написать нечто вреде инструкции. В связи с тем что это само по себе трудно - много - лениво, ограничусь простой констатацией данного факта (пока).

четверг, 23 июня 2016 г.

Делаем backup virtualbox VM по-неправильному

Исходные данные: 
Xubuntu 14.04 server (64 разряда), на нем virtualbox с единственной VM, и это, как легко догадаться, Win-server.


  Тому, как бэкапить винду ее собственными средствами посвящены гигабайты в других местах, дело это простое и понятное... ровно до того момента как ее нужно восстанавливать... Отсюда и есть пошла виртуализация, и копирование VM (Виртуальной машины) целиком. Если все делать совсем правильно, следует ознакомится с этой вот статьей в качестве примера. Можно еще подумать в сторону lvm.
  Мы будем делать не правильно и по-тупому - приостановил, скопировал, отпустил работать дальше. Собственно скрипт (запуск по четвергам из крона чуть за полночь).

#!/bin/bash

# DEFAULTS
OLDFILE=10

# Config file in $1, if absent - default config from /usr/local/etc/vm/vm.conf
if [ ! -z ${1} ] ; then
 test -r ${1} && . ${1}
else
. /usr/local/etc/vm/vm.conf
fi

# Remove olds
icount=0
for i in `ls -r $BACKUPDIR/vm-$VBOXNAME-20*` ; do
 if [ $((icount++)) -ge $((OLDFILE))  ] ; then
  rm -f "$i"
  echo "$i" " removed"
 fi
done

echo `date +%F%t%X` "stop vm"
VBoxManage controlvm ${VBOXNAME} savestate
sync
sleep 10
echo `date +%F%t%X` "tar vm"
DATETIMENOW=`date -I`
tar cvf $BACKUPDIR/vm-$VBOXNAME-$DATETIMENOW.tar $VBOXPATH
sync
sleep 10
echo `date +%F%t%X` "start vm"
VBoxHeadless --startvm ${VBOXNAME} &
nice gzip $BACKUPDIR/vm-$VBOXNAME-$DATETIMENOW.tar
echo `date +%F%t%X` "tar gziped"
~
И к нему конфиг
# settings
VBOXPATH="/home/storage/virtualbox"
VBOXDVD="host:/dev/cdrom"
VBOXNAME="Win2008r2"
VBOXOS="Windows2008_64"
VBOXRDEADDR="10.0.0.1"
VBOXRDEPORT="3389"
BACKUPDIR=/home/storage/backup/vms
OLDFILE=15
  Конфиг общий для скриптов управления и бэкапа. Это традиция. Что касается скрипта, в самом начале или конфиг из файла, имя которого передается в качестве аргумента при запуске, или по умолчанию. Потом стирание старых копий. Потом приостановка - копирование - запуск. Ну и в конце ужимаем полученный архив (жмется в 3 раза, есть смысл).

среда, 15 июня 2016 г.

Ubuntu-сервер в качестве pptp-клиента Windows-2008

Исходные данные: 
Xubuntu 14.04 server (64 разряда), не единственный, но на нем установлен squid и openvpn нужно подключить к внешнему Win-серверу для подготовки и сдачи каких-то там экзаменов (учеников пимерно 20 - 50 и они ходят через squid наружу).  Есть инструкция с картинками про Win7.

  Начнем с инструкции. Суть ее такова. Есть ip-адрес, имя и пароль и еще ip, на который ломиться броузером. Все по умолчанию. В конце скромно сказано, что если нужен параллельный доступ в интернет (default route явно поворачивается в сторону туннеля, то нужно сделать...) - делаем пометку, что скорее всего там целая сеть, маршрут на которую не отдается автоматом, а вместо этого используется default. Нам достаточно сделать доступ для squid-а, и можно обойтись без NAT-а. 

Проверяем на крысах.

Берем рабочую станцию с установленным Network-manager и пробуем в ручном режиме подобрать параметры соединения. Это не слишком сложно. Вот пара картинок, что у нас получилось. Заодно это наикратчайшее руководство по подключения к Win-Server



 Броузером сходили, посмотрели, все хорошо, можно переходить к испытаниям на людях.

Конфигурация pptp-клиента

 Несмотря на некоторую избитость темы, толкового руководства как-то не случилось. Самое подходящее и еще, хоть там и про сервер. Ну и чтение man-ов никто не отменял.

 /etc/ppp/options.pptp приводим к виду.

# Lock the port
lock

# Authentication
# We don't need the tunnel server to authenticate itself
noauth

# We won't do PAP, EAP, CHAP, or MSCHAP, but we will accept MSCHAP-V2
# (you may need to remove these refusals if the server is not using MPPE)
refuse-pap
refuse-eap
refuse-chap
refuse-mschap
Все остальное комментарим.

/etc/chap-secrets содержит

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses

"student" OLIMPOKS "passwordfrominstruction"
Дали разумное имя (OLIMPOKS, оно нужно для идентификации, см. ниже...).

 Собственно опции для этого соединения (имя соединения при вызове будет olimpoks, не путать, оно на нижнем регистре) содержатся в новом файле /etc/ppp/peers/olimpoks

# Olimpoks

pty "pptp 95.181.47.90 --nolaunchpppd"  #тип и адрес сервера
name student                            #логин 
remotename OLIMPOKS                     #имя соединения
require-mppe-128                        #включаем поддержку MPPE
nodefaultroute                          #не создавать маршрут по умолчанию
unit 12                                 #номер ppp интерфейса, число счастливое
persist                                 #переподключаться при обрыве
maxfail 30                              #количество попыток переподключения
holdoff 40                              #интервал между подключениями секунд
file /etc/ppp/options.pptp
ipparam olimpoks-pptp
В последней строке имя скрипта (на самом деле их два up и down, но, как показали испытания, второй нам не нужен, маршруты гибнут вместе с падением интерфейса.

Устраиваем натурные испытания и пишем скрипт.

 Ну испытания состоят из совсем простых действий, запускаем pon olimpoks nodetach, смотрим маршруты и пробуем вручную прописать минимальный набор. В нашем случае достаточно только на хост. Строку с добавлением маршрута один-в-один заталкиваем в скрипт. 
Вот он, /etc/ppp/ip-up.d/olimpoks-pptp - имя из предыдущего файла.  И внутри

#! /bin/bash

route add -host 100.10.1.13 dev ppp12
Та самая строка.

 Пробуем по-взрослому, без nodetach и смотрим маршруты. Все хорошенько проверяем. Осталось для верности повесть табличку "прохода нет". В конфиг firewall-а добавляем пару строк...

#!/bin/bash

# Интерфейсы
export PPP=ppp12


### Для туннеля отдельно все сделаем
# Разрешить входящие пакеты для установленных нами соединений
 iptables -A INPUT -m state --state ESTABLISHED,RELATED -i ${PPP} -j ACCEPT
# Дропаем тупо все остальное
 iptables -A INPUT -i ${PPP} -j DROP
#### Конец туннеля
Пока все!

суббота, 28 мая 2016 г.

Делаем backup (бэкап) больших массивов файлов, продолжение

В первой части все-все-все написано, и там же есть список хотелок. Это собственно реализация оных. Список отличий от исходной версии.

  1. Сначала стираем старые файлы, потом пишем новые.
  2. Храним заданное число копий, а не количество дней.
  3. Изменился формат конфиг-файла (исчез "+" у параметра OLD, теперь это просто число)
  4. Нет необходимости вручную создавать исходную копию.
  5. Нет проблем с повторным запуском в течении тех же суток.
  6. Добавлен ключ -F rsync, нужно использовать файлы .rsync-filter

В общем и целом получилась вполне себе боевая вещь.
Собственно скрипт /usr/local/bin/rsync.increment3
#! /bin/bash

### Определения по-умолчанию
MAP='root@10.0.0.3::samba-private/'
DEST='/storage/increment/samba-priv'
LOGF=/var/log/rsync-samba-priv-add.log
OLD=10

### в $1 передаем имя конфиг-файла
if [ ! -z ${1} ] ; then
  test -r ${1} && . ${1}
fi

### Стираем старые копии по числу, а не по дате создания (это важно!)
# Стираем только каталоги, файлы типа .notes.txt нам не интересны

icount=0
for i in `ls -dr $DEST/20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]` ; do
 if [ $((icount++)) -ge $((OLD))  ] ; then
  rm -rf "$i"
 fi
done

### Начали
DAY0=`date -I`
DAY1=`date -I -d "1 day ago"`

# Защита от повторного запуска (передвижка крона, например, для тестов удобно опять же)
if [ -d $DEST/$DAY0 ] ; then
 mv -f $DEST/$DAY0 $DEST/$DAY0-previous
fi

# Самый свежий каталог по маске date -I с 2010 по 2099 годы :-)
# Можно было сохранить $i на первом проходе стирания, но проще еще раз
# дернуть ls

LNK=`ls -dr $DEST/20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]|head -n 1`

# Если совсем пусто, создаем вчерашний пустой
if [ -z $LNK ] ; then
 LNK=$DEST/$DAY1
 mkdir -p $LNK
 echo "LNK not exist..." |logger
fi

# Опять про повторный запуск, крутим обратно...
if [ -d $DEST/$DAY0-previous ] ; then
 mv -f $DEST/$DAY0-previous $DEST/$DAY0
 echo "Previous DAY0 exist..." |logger
fi

### Собственно копируем
rm -f $LOGF
rsync --log-file=$LOGF -aHxAF --del  --link-dest=$LNK  $MAP $DEST/$DAY0

   
И конфиг
MAP='root@10.0.0.3::samba-public/'
DEST='/storage/increment/samba-pub'
LOGF=/var/log/rsync-samba-pub.log
OLD=30
    
Все остальное без изменений.

Дополнение от 21 апреля 2020. 

  Для анализа логов совсем простой скриптик. Он посылает на почту лаконично имена лог-файлов, содержащих "rsync error:" Условием работы (из крона) является правильная установка "почтовых" переменных MAILTO и MAILFROM.

#! /bin/bash

FMASK="/var/log/rsync-*.log"

status=""
for i in `ls  $FMASK` ; do
  if [ `cat $i |grep "rsync error:" | wc -l` -ne 0 ] ; then
    status=$i" "$status
  fi
done
if [[ -n $status ]] ; then 
  echo  $status
fi

среда, 25 мая 2016 г.

Делаем backup больших массивов файлов

Исходные данные: 
Xubuntu 14.04 server (64 разряда) в качестве SAMBA-сервера с большой ФС и огромным количеством файлов.

  Нужно объяснить подробнее. Есть сервер не самой высокой производительности, он когда-то сам должен был стать архивом, но звезды на небе расположились таким образом, что на него была взгромождена САМБА (+squid, apache, и много чего еще), в общем это наше все, кроме LTSP. Все - все - все живет на массиве размером 5,1Т, система отдельно. Занято существенно более половины, вернее сказать осталось там меньше терабайта. Вот его надо сбэкапить по сетке, держать несколько актуальных копий в удобноваримом виде и прочее, прочее, прочее. В качестве архива вообще не Бог весть что - 2 Гигабайта памяти, массив около 4Т, остальное под стать, - собрано все из хлама. Копировать нужно /home/storage/samba/public, /home/storage/samba/private, /home за вычетом /home/storage Всего примерно 1,5Т. В идеале хранить 30 ежедневных копий всего. По-тупому точно не получится 1,5Т*30дней=45Т... Не наш уровень затрат.

Про удобноваримость.

 Вот что важно оказалось (для больших объемов и больших количеств файлов) - хранение при помощи какой-то базы (bacula) не очень подходит. Обычно приходится искать файл по каким-то не вполне точным признакам (тыкать мышкой или mc-шкой). То же касается и архивов типа tar - его и положить-то некуда, не дай бог физ. сбой (прощай кусок после сбоя, как на ленте), ну и поиск нужного "чего-то типа как вот тут" - мука адская. Должно быть файловое дерево, по которому можно "лазить" стандартными средствами. 

Про транспорт.

 Рутовый доступ к источнику по ssh не самое приятное, хочется чтоб по чтению, и чтоб не nfs... В общем rsync в виде rsyncd вполне себе безопасен, абсолютный чемпион по скорости и много чего еще (например не оставляет оторвавшихся и повисших процессов на сервере). Есть классическая статья Майка Рубеля, дающая "правильное представление". И еще один ресурс навел на мысли... Не описываю сам принцип, слов там много, не нужно переписывать... Но решил все-таки пару слов написать. Идея в том, что правильно используя хардлинки можно хранить огромное количество копий очень больших массивов (поскольку основная масса файлов меняется редко, они прилинковываются к новым каталогам, в случае стирания теряют линки и освобождают место для новых...).

Карты в руки

 На сервере - источнике заводим карты (они же модули) для сохраняемых ресурсов. Вот кусочек /etc/rsyncd.conf (некоторые цифры пришлось поменять)
# /etc/rsyncd.conf

# GLOBALs
address = 10.0.0.3

[samba-public]
path = /home/storage/samba/public
comment = Samba common
read only = true
hosts allow = 10.0.0.2
hosts deny = 0.0.0.0/0
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso

[rootfs]
path = /
comment = root and LTSP sandbox
uid = root
read only = true
hosts allow = 10.0.0.1 10.0.0.2
hosts deny = 0.0.0.0/0
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso

[homefs]
path = /home
comment = home (not storage)
uid = root
read only = true
hosts allow = 10.0.0.2 10.0.0.1
hosts deny = 0.0.0.0/0
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso
exclude "storage/***"

[samba-private]
path = /home/storage/samba/private
comment = Samba common
uid = root
read only = true
hosts allow = 10.0.0.2
hosts deny = 0.0.0.0/0
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso


В приведенном фрагменте нет ничего необычного, интересен разве что пример исключения /home/storage, но это есть в man-е... и работает не слишком хорошо, лучше -F и .rsync-filter в нужные каталоги.

Ну и собственно скрипт


#! /bin/bash

### Определения по-умолчанию
MAP='root@10.0.0.3::samba-private/'
DEST='/storage/increment/samba-priv'
LOGF=/var/log/rsync-samba-priv.log
OLD=+10

### в $1 передаем имя конфиг-файла
test -r ${1} && . ${1}

### Начали
DAY0=`date -I`
DAY1=`date -I -d "1 day ago"`
DAY2=`date -I -d "2 day ago"`
LNK=$DEST/$DAY1
rm -f $LOGF
# Ищем вчерашнюю копию, если нет - позавчерашнюю, если ее нет - стоп!
if [ ! -d $LNK ] ; then
 LNK=$DEST/$DAY2
  if [ ! -d $LNK ] ; then
   echo "LNK not exist..." |logger
   exit 0
  fi
fi
### Собственно копируем
rsync --log-file=$LOGF -aHxA --del  --link-dest=$LNK  $MAP $DEST/$DAY0
### Стираем старые копии
find $DEST -ctime $OLD -delete
    
В конце мы просто удаляем старые копии по-крестьянски. Исходный (самый первый) бэкап делаем ручками. Если лениво, достаточно создать пустой каталог со вчерашней или позавчерашней датой.

И один конфиг

 В качестве примера (/usr/local/etc/bcp/samba-pub).

MAP='root@10.0.0.3::samba-public/'
DEST='/storage/increment/samba-pub'
LOGF=/var/log/rsync-samba-pub.log
OLD=+10
    

Хранение настроено на 10 дней, будем посмотреть... В кроне (/usr/cron.d/local) все выглядит примерно так

15 20 * * *     root  /usr/local/bin/rsync.increment /usr/local/etc/bcp/samba-priv.conf >/dev/null 2>&1
05 21 * * *     root  /usr/local/bin/rsync.increment /usr/local/etc/bcp/samba-pub.conf >/dev/null 2>&1

    

Чего еще хочется (ToDo)

 В скрипте проверяется "вчера" и "позавчера". Хочется "последний раз". С ходу не придумалось. Надеюсь что будет обновление. Прошла ночь. Есть еще пара новых хотелок. Во-первых, нужно сделать старт в случае отсутствия исходного бэкапа (самый первый запуск). Во-вторых нужно не удалять копии по времени жизни, а следить за их количеством и поддерживать заданное (количество), это будет правильно. И правильно будет, в условиях дифицита места, сначала стирать старую копию, а потом уже записывать новую.

Закономерное продолжение, реализующее пожелания...









воскресенье, 1 мая 2016 г.

NIS netgroup и samba

Исходные данные: 
Xubuntu 14.04 server (64 разряда) в качестве SAMBA-сервера и много-много (сотни 2 с хвостом) разнообразных клиентов.



  В какой-то момент количество шар с самыми разными правами доступа стало напрягать, размер секции в smb.conf стал неприлично большим. Закономерно упростить синтаксис за счет создания групп пользователей. Unix-группы решил не трогать, не всегда они подходят, а для целей дележки самбошных ресурсов сделать свои похожие группы, числом немногие. Свои, значит NIS, прикручивание оного NIS-а описано ранее, работает просто и понятно (в чем принципиальное отличие от от LDAP). 

Заводим собственно группы. в /etc/netgroup
admin_smb (,pvd,) (,iks,) (,super,) (,dedkov_mn,) 
boss_smb (,petrov_ii,) (,ivanova_ma,) (,sidorova_aa,)
Обновляем NIS
cd /var/yp
make
И прописываем наши группы в smb.conf
[Кадры]
    comment = Отдел кадров
    path = /home/storage/samba/private/kadr
    writable = yes
    inherit permissions = Yes
    create mask = 0666
    directory mask = 0777 
    valid users = @admin_smb, @boss_smb, ikadr_1, ikadr_2, ikadr_3, \
    ikadr_4, narishkin_ap
    

В реальной жизни списки куда как поболее, но принцип именно такой. Все настолько просто, что можно и забыть :-)!

пятница, 8 апреля 2016 г.

Windows XP, bat-файлы и русские имена

Исходные данные: 
Windows XP + samba. Нужно организовать архивирование файлов средствами самой XP.

  Встроенные средства XP теоретически позволяют в нужное время запускать bat-файл для выполнения утилитарных задач типа резервного копирования. В случае подключения сетевого диска, можно, в том числе и на сервер... Убогость этого всего хозяйства обсуждать бесполезно, какое есть... Если использовать 1С версии 8 (скромненькая какая-то версия для ИП и ООО мелкого размера), то, по умолчанию, всё интересное оказывается в Мои документы\Infobase. Ну и вообще оные Мои документы много чего полезного содержать могут. Попытка использовать многочисленные советы "как напрямую это все копировать" успехом не увенчалась. Не смог я победить русские буковки. Обходной путь оказался куда более интересным. Вот что вышло.
set now=%TIME:~0,-3%
set now=%now::=%
set now=%now: =0%
set now=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%now%

"C:\Program Files\7-Zip\7z.exe" a -tzip h:\1C-bcp\%now%1c-bak.zip @H:\1C-bcp\1c.lst

7z абсолютно бесплатен (огромное спасибо авторам). Ну и списочек делается простым блокнотом в кодировке UTF-8. У меня в нем
C:\Documents and Settings\buhgalter\Мои Документы\Infobase\*
Можно туда еще строчек добавить, если нужно. И список, и сам bat-файл лежат на сетевом же диске и доступны только по чтению (на всякий случай).

Пара слов об альтернативах.

Можно расшарить виндовый диск и чем-то типа smbtar забирать. В моем случае сервер слабенький, думать ему вредно. Винда сидит на WiFi - медленно... Ну и в части безопасности там все сложно. В общем несмотря на другие сложности запуск на локальной винде кажется наиболее удобным. 

Куда потом...

...Деваются эти файлы? Они перемещаются в тихое сухое место, невидимое снаружи и лежат там примерно 30 дней.