Posts Tagged ‘ Shell

Зеркало для обновлений программы «АРМ — Звiт Страхувальника»

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

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

  • Зеркалить все что есть на официальном ftp проги себе на машину.
  • Дать возможность любой машине в рабочей сети получать доступ к этой папке.
  • Соорудить какуюто уведомлялку чтобы узнавать о появлении нового обновления.

К слову сказать, эта задача напомнила мне о зеркале для Symantec Offline Updates, которую я вполне успешно решил уже давно, о чем писал отдельную статью ранее. Поэтому тут уже пошел по накатанной дорожке (читай: сделал все по образу и подобию зеркала для симантековских обновлений). Так как зеркалить надо по ftp, выбор клиента очевиден — lftp. Роздавать клиентам в рабочей сети решил по SAMBA, поскольку, все кому оно теоретически может понадобиться — виндомашины бухгалтеров. С уведомлялкой особо не заморачивался — шлем себе на мыло сообщение когда появляется новый апдейт. Замечу также, что в сети есть общая файлопомойка на которой лежат все общие документы, инсталяхи, драйвера и тп. Такчто дополнительно решил зеркалить и туда содержимое папки с программой и обновлениями. Итак скрипт, который я соорудил:

#!/bin/bash
# Script for Sync BestZvit Updates
WORK_DIR="/opt/BZvitPlus"

lftp_sync () {
lftp -c 'open -e "mirror" ftp://ftp.bestzvit.com.ua/BZPLUS/'
wget -c -r -nd -l 1 -A exe http://www.bestzvit.com.ua/updates/zvitplus.shtml
}

sync_to_winshare () {
mountpoint -q /media/samba/winshare || mount.cifs //winshare/Install /media/samba/winshare -o credentials=/root/.pass
[ -d /media/samba/winshare/Buhgalteria/Zvit_Plus_PFU ] && rsync -ru --numeric-ids /opt/BZvitPlus/ /media/samba/winshare/Buhgalteria/Zvit_Plus_PFU
}

notify_mail () {
UPDATE=`find /opt/BZvitPlus/ -mtime -1`
DATE=`date +%F`
[[ -z ${UPDATE} ]] || echo -e ${UPDATE} |mail -s "[${DATE}] - PFU Update Available!" black
}

## <- Lets do it! -> ##
cd ${WORK_DIR}
lftp_sync
sync_to_winshare
notify_mail

Как видно, скрипт совсем несложный для понимания. Локальным хранилищем выбрана директория /opt/BZvitPlus Сначала просто переходим в нее, далее синкаем сюда содержимое ftp://ftp.bestzvit.com.ua/BZPLUS/ После этого проверяем примонтирована ли самбовая общая шара, если нет — монтируем. Для этого используются мои авторизационные данные которые описаны в файлике /root/.pass Содержимое этого файлика у меня такое:

black:~# cat .pass
username=WORK\black
password=my_password
black:~#

Потом rsync-ом синкаем нашу папку /opt/BZvitPlus/ на общую шару /media/samba/winshare/Buhgalteria/Zvit_Plus_PFU. И уведомлялка, если в директории /opt/BZvitPlus/ за последние сутки появилось чтото новое — уведомляем по email локального пользователя black (меня) об этом. Все!

Этот скрипт запускается раз в сутки, для этого добавил такую задачу в crontab:

black:~/scripts# crontab -l
SHELL=/bin/bash
# m h  dom mon dow   command
## <- Sync PFU Updates -> ##
13    4    *    *    *    /root/scripts/bzplus_sync.sh
black:~/scripts#

Ну и ко всему прочему — розшарил на своей машинке эту директорию по SAMBA (на всякий случай). Добавлю также что samba  у меня настроена на доменную авторизацию, о чем я писал ранее, и то что розшарена еще одна папка для решения подобной задачи с симантековскими обновлениями 🙂 Итак, вот конфиг самба сервера:

black:~/scripts# cat /etc/samba/smb.conf
[global]
realm = MY.DOMAIN
workgroup = WORK
netbios name = black
security = ads
idmap uid = 10000-20000
idmap gid = 10000-20000
load printers = no
show add printer wizard = no
printing = none
printcap name = /dev/null
disable spoolss = Yes
show add printer wizard = No
template shell = /bin/bash
template homedir = /home/%D/%U
winbind use default domain = yes

[Symantec Updates]
comment = Symantec Offline Updates
path = /opt/symantec
browseable = yes
writable = no
valid users = @"WORK\domain admins", @"WORK\domain users"

[ARM Zvit]
comment = Setup and Update files
path = /opt/BZvitPlus
browseable = yes
writable = no
valid users = @"WORK\domain admins", @"WORK\domain users"
black:~/scripts#

Ну вот и все! В итоге получили на своей машине зеркало для обновлений и новых инсталях программы «АРМ — Звiт страхувальника». При появлении новых обновлений, шлем email мне! И также роздаем виндовозам всю эту папку по samba. Вот еще и скрин 🙂

Зеркало для АРМ Звiт Страхувальника - Роздаем по samba

Роздаем по samba

Вот как выглядят уведомления по почте:

Обновления "АРМ - Звiт Страхувальника" - Уведомление по почте.

Тут видим  тему письма. А вот что в самом письме:

АРМ Персонификация - Уведомление про обновления по почте

Видно что доступно новое обновление программы 8P_Upd893.exe

Со временем к уведомлению по email планирую добавить уведомлялку на десктоп средствами zenity.

Всем удачи и удачных отчетов по персонификации в придачу!

Автомаунт samba-шар в зависимости от сети

В силу мобильности своей электронно — вычислительной железки (владею ноутбуком Dell Inspiron 1420) приходится втыкаться в разного рода сети. Восновном рабочую и домашнюю. В зависимости от того куда воткнулся — нужно монтировать те или иные сетевые диски. Например на работе сетка 10.0.1.0/24, а дома — 192.168.13.0/24. Адрес и там и там получаю по DHCP. Соответственно и samba-сервера и шары и параметры монтирования совсем уж разные. Привести монтирование сетевых ресурсов к общему знаменателю неполучилось както 🙂 (может нешарю???) В итоге родилась мысль написать некий скриптик который при загрузке будет определять в какой сети я нахожусь и монтировать автоматом шары этой сетки.
Алгоритм примерно такой:

  • Получили адрес: Если это адрес домашней сети -> мотировать домашние samba-диски
  • Если это адрес из рабочей сети -> монтировать рабочие samba-диски
  • Если адрес не получили -> ничего не монтировать!

Задача совсем несложная для тех кто хоть чуток розбирается в bash. Вот что накалякал я:

#!/bin/bash
## // script for avtomount my home samba shares
## // writed by black_13 *31.01.2010*
IM_HOME=`ifconfig eth0 |grep 192.168.13`
IM_WORK=`ifconfig eth0 |grep 10.0.1`
if [[ -z ${IM_HOME} ]]; then
  echo 'Im not home! Nothing to mount from network :)'
else
  mountpoint -q /media/samba || mount.cifs //black/public /media/samba/ -o credentials=/root/.smb
  mountpoint -q /media/privat || mount.cifs //black/private /media/privat/ -o credentials=/root/.smb
fi
if [[ -z ${IM_WORK} ]]; then
  echo 'Im not in Work! Nothing to mount from network :)'
else
  mountpoint -q /media/samba || mount.cifs //server.work/DiskP /media/samba/ -o credentials=/root/.smb_work
  mountpoint -q /media/master || mount.cifs //samba.work/master /media/master/ -o credentials=/root/.smb_work
fi

Авторизационные данныя для доступа к шарам содержатся в файлах /root/.smb и /root/.smb_work для дома и работы соответственно. Формат содержания предельно прост:

laptop ~ # cat /root/.smb
username=home_user
password=my_passw_home
laptop ~ #

Немножко о логике скрипта, хоть все понятно и непосвященным 🙂
Если переменная IM_HOME содержит ip с сетки 192.168.13 — значит я дома и монтируем мои домашние шары. Если же она ничего не содержит — то просто выводим «Im not home! Nothing to mount from network :)» Со вторым случаем тоже самое. Если переменная IM_WORK не пуста — то монтируем диски с работы. Иначе выводим что велено echo.

Для старта этого скриптика при старте системы …. в Gentoo надо в конфиг /etc/conf.d/local.start добавить такое:

laptop ~ # cat /etc/conf.d/local.start
# /etc/conf.d/local.start
# This is a good place to load any misc programs
# on startup (use &>/dev/null to hide output)
### for avtomount samba shares if i'm home or work ###
/root/bin/home_samba_avtomount.sh
laptop ~ #

Ну вот и все 🙂 Теперь если я включаю ноут в домашней сети — получаю подмонтированные домашние сетевые диски. Если же сеть окажется рабочей — получаю примонтированными рабочие самбовые шары. Очень удобно. Кстати повесить срабатывание скрипта лучше на поднятие интерфейса — тоесть по if-up. Такчто если охота — то так и сделайте.
Ну вот и все. Рукам даем свободу от ввода километровых команд, а мозгам отдых и силы на будущие открытия. Наслаждаемся 😉

Настройка urxvt

Linux есть Linux! И без консоли в нем ну никак не выживеш. Когото это пугает, когото наоборот — хлебом не корми, дай в консоли посидеть. Чтоже за консольные эмуляторы для X11 предлагает нам Linux? Их много, я бы даже сказал — очень много. Сам их перепробовал около десятка … от xterm до konsole но понравился больше всего rxvt-unicode. Как видно из названия, он поддерживает Unicode, а также XFT. Вот собственно и все чем он отличается от своего родителя — rxvt. Примечательна в нем возможность покрутить очень много настроек. Использую даную прогу как в Gentoo  так и в Debian. Собственно о настройке этого прекрасного x11 terminal-эмулятора и хотел сказать несколько слов.

Ну во-первых — установка:

  • Для Debian выглядит так:
# apt-get install rxvt-unicode
  • Для Gentoo тоже неособо сложно, за исключением того что следует обратить внимание на USE флаги 😉
# emerge -av x11-terms/rxvt-unicode

У меня, к примеру, собран вот так:

laptop ~ # eix rxvt-unicode
[I] x11-terms/rxvt-unicode
Available versions:  9.06-r3 ~9.07 {afterimage iso14755 perl truetype vanilla wcwidth xterm-color}
Installed versions:  9.06-r3(15:15:42 10.01.2010)(perl truetype vanilla -afterimage -iso14755 -wcwidth -xterm-color)
Homepage:            http://software.schmorp.de/pkg/rxvt-unicode.html
Description:         rxvt clone with xft and unicode support

laptop ~ #

Этого вполне хватает для псевдопрозрачности и поддержки перловых модулей 🙂 Только не забываем как установить обоину на рабочий стол, говорю это скорее для себя, так как использую fluxbox на работе. В fluxbox это делается командочкой:

fbsetbg /_path_to_picture_

В Gentoo использую e16, тут проще — есть специальная настройка в менюшке 🙂

Во-вторых — настройка! Что нам предлагает man страница? Насколько я понял, (и проверил на практике в последствии) конфигурировать вид терминала можно как с помощью конфига $HOME/.Xdefaults так и запуская сам терминал с нужными ключами. Оба метода являются вполне приемлемыми и рабочими. Итак, моя настройка в gentoo несколько странная. Почему то я заюзал одновременно оба метода … в итоге часть настроек у меня в конфиге и также некоторые опции передаю в виде ключей при запуске. Почему так сложилось — уже не помню, настраивал очень давно. Вот что в $HOME/.Xdefaults

black@laptop ~ $ cat .Xdefaults
urxvt*saveLines: 2024
urxvt*transparent: true
urxvt*shading: 40
urxvt*background: Black
urxvt*foreground: Grey
urxvt*scrollBar: false
urxvt*cursorColor: Grey
urxvt*tintColor: Black
urxvt*blurRadius: 3
urxvt*font:-*-terminus-medium-*-*-*-14-*-*-*-*-*-*-r
urxvt*geometry: 155x62
urxvt*cursorBlink: true
URxvt.tabbed.tabbar-fg: 7
URxvt.tabbed.tabbar-bg: 0
URxvt.tabbed.tab-fg:    0
URxvt.tabbed.tab-bg:    8
black@laptop ~ $

И запускаю я его используя hotkeys Win+T  командой

 urxvt -vb -pe tabbed

В итоге получаю псевдопрозрачный терминал с поддержкой tab-ов примерно такого вида:

Вчера настраивал в Debian с нуля 🙂 Решил все что мне нужно прописать в $HOME/.Xdefaults Вот что получилось:

black@black:~$ cat .Xdefaults
URxvt*font: -*-terminus-medium-r-*-*-16-*-*-*-*-*-*-u
URxvt*background: black
URxvt*foreground: grey
URxvt*cursorColor: grey
URxvt*transparent: true
URxvt*tintColor: black
URxvt*shading: 70
URxvt*scrollBar: false
URxvt*cursorBlink: true
URxvt*pointerBlank: true
URxvt*pointerBlankDelay: 13
URxvt.perl-ext-common: default,tabbed
URxvt.tabbed.tabbar-fg: 6
URxvt.tabbed.tabbar-bg: 0
URxvt.tabbed.tab-fg: 0
URxvt.tabbed.tab-bg: 7
black@black:~$

Запускаю уже без какихлибо ключиков! Выглядит терминал с данным конфигом примерно так:

Помоему получилось красиво 🙂 Что означают каждая из опций, понятно и просто прочитав их. Думаю коментарии излишни 🙂 Юзаем, наслаждаемся 🙂

Зеркало для Symantec Offline Updates

Многие знают о софтварных продуктах компании Symantec. Антивирус разработанный этой компанией используется у нас на работе. Оличительные черты данного антивируса пожалуй невсех впечатлят, но всеже:

  • вменяемая корпоративная лицензия
  • возможность централизированного управления и мониторинга
  • неслабая тормознутьсть в работе 🙂

Есть еще много всяких плюшек и радостей. Мне, к примеру, нравится наличие так называемых Offline Updates. Это обычные exe файлы, предназначенные для обновления антивируса на машинах которые не имеют доступа к интернету. Такие экзешнички можно скачать из офсайта symantec или с ftp. Для того чтобы иметь актуальную версию этих обновлений — приходилось частенько их качать (они обновляются примерно раз в сутки). Поэтому сама собой появилась задача:

  1. сделать на своей машине зеркало нужных мне директорий с симантековского ftp
  2. роздать доступ к ним в сети по samba (поскольку клиенты восновном с WinXP)

Учитывая особенности моего доступа в интернет, нужно чтобы скрипт работал через http прокси-сервер http://my.proxy:3128 (тем у кого прямой доступ в интернет необходимо просто закомментировать первых 6 строчек скрипта, там где задаются переменные ftp_proxy и http_proxy)
Ну чтож, покопавшись немного с bash, родился вот такой скрипт под названием /root/scripts/symantec_update.sh

#!/bin/bash
if [ -z ${ftp_proxy} ]; then
 export ftp_proxy="http://my.proxy:3128"
fi
if [ -z ${http_proxy} ]; then
 export http_proxy="http://my.proxy:3128"
fi
#URL="ftp://ftp.symantec.com/AVDEFS/symantec_antivirus_corp/"
WORK_DIR="/opt/symantec"
[ -d ${WORK_DIR} ] || mkdir ${WORK_DIR} ; mkdir ${WORK_DIR}/{SAV,SEP}
### <- Remove ALL OLD MD5 Summs -> ###
find ${WORK_DIR} -atime +1 -exec rm '{}' \;
cd ${WORK_DIR}

check_md5 () {
MD5_SYMANTEC="md5-hash.txt"
FILES=`ls |grep .exe`
for FILE in ${FILES}
do
   if [ -f ${FILE/exe/md5} ]; then
     continue
   else
     MD5_ORIG=`grep ${FILE} ${MD5_SYMANTEC} |tr [A-Z] [a-z] |cut -d' ' -f1`
     echo "${MD5_ORIG}  ${FILE}" > "${FILE/exe/md5}"
     md5sum --check --status "${FILE/exe/md5}"
     # echo "For file ${FILE} exit status = $?"
        if [ $? -ne 0 ]; then
          echo "${FILE} --- bad checksum !!!" > ../md5sum_${FILE}.log
        else
          [ -f ../md5sum_${FILE}.log ] && rm ../md5sum_${FILE}.log
        fi
   fi
done
}
get_updates_SAV () {
lftp -c 'open -e "mirror -e -c --no-recursion -i -x86.exe -i md5-hash.txt" hftp://ftp.symantec.com/AVDEFS/symantec_antivirus_corp'
}

get_updates_SEP () {
lftp -c 'open -e "mirror -e -c --no-recursion -i -v5i32.exe -i md5-hash.txt" hftp://ftp.symantec.com/AVDEFS/symantec_antivirus_corp'
}

cd SAV
get_updates_SAV
check_md5
cd ../

cd SEP
get_updates_SEP
check_md5
cd ../

Возможно, он далек от совершенства, но главное работает!

Добавляем запись в crontab для автоматического запуска каждых 8 часов в 53 минуты

53    0-23/3    *    *    *    /root/scripts/symantec_update.sh

Конфиг /etc/samba/smb.conf для роздачи этих двух директорий по samba выглядит так:

[global]
realm = MY.DOMAIN
netbios name = black
workgroup = WORK
security = ads
idmap uid = 10000-20000
idmap gid = 10000-20000
disable spoolss = Yes
show add printer wizard = No
template shell = /bin/bash
template homedir = /home/%D/%U
winbind use default domain = yes

[Symantec Updates]
comment = Symantec Offline Updates
path = /opt/symantec
browseable = yes
writable = no
create mask = 0664
directory mask = 0777
valid users = @"WORK\domain admins", @"WORK\domain users"

Обьяснения что к чему, думаю ненужны. Особенно учитывая то что в передыдущей записи я рассказывал о вводе своей машинки в домен 🙂

Ну вот и все! С заданием справились на 100% — апдейты автоматом качаются, и роздаются по samba с авторизацией в домене 🙂

Настройка bash

Так уж получилось что первый дистрибутив из мира Open Source который довелось мне использовать был Ubuntu Linux 6.06 Собственно я и рад что так получилось, могло же быть и хуже … например, я бы совсем не познакомился с Linux. Ну неважно, дело не в этом, а в том, что так или иначе пришлось осваивать консоль. Командной оболочкой по-умолчанию в Ubuntu (как и в подавляющем большинстве других Linux) есть bash. К чему это я? Да к тому, что даже ставя себе OS из семейства BSD, я всеравно сразу собираю bash. Ну привычен он мне … гораздо более превычен нежели csh или ksh.

Собственно про настойку этой прекрасной оболочки и хотел сказать несколько фраз, а точнее сделать небольшую шпаргалку себе на будущее. Главный конфиг bash-а называется bashrc и располагаться он может, в зависимости от дистрибутива Linux, в /etc или в /etc/bash. Незнаю как кто, но я там ничего не трогаю — использую умолчательные настройки. Но есть еще и доступный для правки «под себя» конфиг в домашней директории каждого пользователя. Найти его можно тут $HOME/.bashrc Как видите — он скрытый. Также bash-ем используются файлы $HOME/.bash_profile и $HOME/.bash_history С .bash_history все есно — тут хранятся выполненные команды командной оболочки bash. А вот что такое .bashrc и .bash_profile — требует пояснений. Назначение этих файлов согласно документации (приведу только нужную часть):

# man bash

INVOCATION
A login shell is one whose first character of argument zero is a -, or one started with the --login option.

An  interactive  shell is one started without non-option arguments and without the -c option whose standard input and error are both
connected to terminals (as determined by isatty(3)), or one started with the -i option.  PS1 is set and $- includes  i  if  bash  is
interactive, allowing a shell script or a startup file to test this state.

The  following  paragraphs describe how bash executes its startup files.  If any of the files exist but cannot be read, bash reports
an error.  Tildes are expanded in file names as described below under Tilde Expansion in the EXPANSION section.

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads  and  exe
cutes  commands  from  the  file  /etc/profile,  if  that  file  exists.   After  reading  that  file, it looks for ~/.bash_profile,
~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is  readable.   The
--noprofile option may be used when the shell is started to inhibit this behavior.

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.

When  an  interactive  shell  that  is  not  a login shell is started, bash reads and executes commands from ~/.bashrc, if that file
exists.  This may be inhibited by using the --norc option.  The --rcfile file option will force bash to read  and  execute  commands
from file instead of ~/.bashrc.

Чтоже получается? А то что .bash_profile отрабатывает когда дело касается авторизиции (вход по ssh например), а .bashrc когда авторизированный пользователь открывает командную оболочку. Поэтому я делаю так, чтобы даже зайдя по ssh у меня подгружался .bashrc

root@gw:~# cat .bash_profile
# include .bashrc if it exists
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# set PATH so it includes user's private bin if it exists
if [ -d ~/bin ] ; then
PATH=~/bin:"${PATH}"
fi

# only for OpenBSD
export PATH="/usr/local/sbin/:${PATH}"
export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.6/packages/`machine -a`/
export TERM="wsvt25m"

Это для OpenBSD. Для Linux можно выкинуть последние 4 строчки 🙂

Ну и, собственно, .bashrc

root@gw:~# cat .bashrc
# don't put duplicate lines in the history. See bash(1) for more options
export HISTCONTROL=ignoredups
export HISTCONTROL=ignorespace
#Если нужно - Proxy Servers
#export http_proxy="http://my.proxy:3128"
#export ftp_proxy=${http_proxy}

## Одна из главных вкусностей - aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
alias lt='ls -lt'

## Colour Prompt
COLOR_RED="\[\033[1;31m\]"
COLOR_WHITE="\[\033[0;00m\]"
COLOR_GREEN="\[\033[0;32m\]"

export PS1="${COLOR_RED}\u${COLOR_WHITE}@${COLOR_RED}\h:${COLOR_WHITE}\w# "

root@gw:~#

Это для пользователя root — у него красное приглашение. Для рядового пользователя она зеленая. Вот конфиг:

root@gw:~# cat /home/radmin/.bashrc
## aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
alias lt='ls -lt'
## Colour Prompt
COLOR_RED="\[\033[1;31m\]"
COLOR_WHITE="\[\033[0;37m\]"
COLOR_GREEN="\[\033[0;32m\]"

export PS1="${COLOR_GREEN}\u${COLOR_WHITE}@${COLOR_GREEN}\h:${COLOR_WHITE}\w$ "

root@gw:~#

Выглядит это примерно так:

Чтобы показывать нужный вам цвет PS1 можно использовать в том же .bashrc проверку юзера в духе if $USER = root тогда PS1 с красным приглашением else PS1 — зеленый. Но мне чегото неохота чтобы каждый раз при открытии терминала система это проверяла — один раз написал и все 🙂

В данном случае я задавался целью немного розукрасить bash и придать ему более userfriendly качества. Конечно, это далеко не все что можно настроить через bashrc, поэтому за дополнительной информацией обращайтесь к документации. Удачи! И красочных всем консолей!