Weekend mechanics -- Выходные под капотом вашего Linux'а

Автор: (C) Thomas Adam
Перевод: (C) Александр Куприн



Добро пожаловать на майский выпуск WM

[ ** Этот выпуск посвящается моему хорошему другу Natalie Wakelin, перед которой я в неоплатном долгу за оказанные мне поддержку и помощь. Она была моей путеводной звездой и верным другом, и не смотря на то, что она ни слова не понимает из всей этой "технической абракадабры" -- я всё-таки решил посвятить статью ей! Огромное спасибо, Natalie!! :-) ** ]


Что за песни пели сирены
или каким именем назывался Ахилл,
скрываясь среди женщин, --
уж на что это, кажется, мудрёные вопросы
а какая-то догадка и здесь возможна.

--Сэр Томас Браун

Взято:

"Убийство на улице Морг" -- Эдгар Аллан По [1]


Да, да, я знаю. Спасибо, большое спасибо. Довольно аплодисментов. Я вернулся :-) Серьёзно, прошу извинить меня за растянувшиеся на пару месяцев "каникулы", которые устроил себе LWM[2]. Я неожиданно совершил затяжной прыжок в мир свободы и университетской жизни, а адаптация к этому оказалась для меня сложнее, чем ожидалось.

Но что было, то было.....

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

Кроме основной работы в университете, я активно помогал решать проблемы группы пользователей Linux в Ганте (Hants LUG, http://www.hants.lug.org.uk), участвуя в этом и лично, и "виртуально" через почтовую рассылку. Это было очень увлекательно и позволило мне не только учить, но и многому научиться самому!

Так. Думаю, для одного месяца такой преамбулы более чем достаточно. Читайте и наслаждайтесь. Или я не прав?


Краткое введение: Squid


Что есть Squid?

Те из вас, кто читал сентябрьский номер LG, помнят, что я писал статью об использовании Apache. Я получил несколько неплохих откликов (спасибо всем, кто прислал свои комментарии). Я подумал, что будет неплохо написать небольшой "букварь" по squid.

Для тех, кто не в курсе, Squid (http://www.squid-cache.org) (не путайте с морским созданием, родственником цефалоподов) -- это программа, работающая под Linux и выполняющая функции proxy-сервера Интернет. Почему он так называется? Очевидно потому что (цитирую: "все нормальные имена уже заняты").

Squid обрабатывает туннельные интернет-запросы, посылаемые через машину, тоже именуемую proxy-сервер.

Дополнительно он предоставляет возможность фильтровать определённые web-страницы, соответственно позволяя или блокируя их просмотр пользователем. Это осуществляется при помощи ACL (Access Control Lists -- списки контроля доступа). Более подробно об этом мы поговорим позже.


Инсталляция

Инсталляция squid не слишком сложна. Он поддерживается в большинстве дистрибутивов (RedHat, SuSE, Caldera, Debian и т.д.), так что я уверен, что вы обязательно найдёте его на своих компакт-дисках.

Если ваш Linux-дистрибутив поддерживает RPM-пакеты, то вы можете проверить установлен ли squid на вашей машине вот такой командой:

rpm -qa | grep -i squid[11]

Если пакет установлен, то rpm вернёт вам примерно такую строку (или что-то на неё похожее):

squid2-2.2.STABLE5-190

Если же squid не установлен, то его можно поставить с компакт-дисков дистрибутива. [3]

Если по какой-то причине на компакт-дисках вашего дистрибутива squid не оказалось, или вы используете дистрибутивы Linux'а (такие как Debian или Slackware), которые не поддерживают формат пакетов RPM, то загрузите "тарбол" (.tgz или .tar.gz) с исходным кодом proxy-сервера: http://www.squid-cache.org/download.

Для установки squid из "сырцов" распакуйте "тарбол" в "/tmp" и выполните следующие команды:

1. Если вы сейчас не зарегистрированы как пользователь "root", то
воспользуйтесь либо su, либо sudo, либо авторизуйтесь в системе как root через
отдельную консоль
2. cd /tmp
3. tar xzvf ./имя_пакета_squid.tar.gz -- [или возможно .tgz]
4. Теперь запустите скрипт конфигурации:

./configure

5. После того, как он без ошибок закончит свою работу , введите

make && make install

для компиляции и установки файлов, относящихся к squid.

Обычно при установке из RPM-пакета файлы squid размещаются по директориям

/usr/bin
/etc
/etc/squid (возможно, использовалось в RH 5.0)
/var/squid/log/
[/usr/local/etc] -- может устанавливаться, как "симлинк" на /etc

Если же вы собрали squid из исходников, то файлы располагаются иначе: [4]

/etc
/etc/squid (возможно, использовалось в RH 5.0)
/usr/local/bin
/var
[/usr/local/etc] -- может устанавливаться, как "симлинк" на /etc

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

Теперь, когда вы установили squid, давайте перейдём к следующему разделу, а именно, к его настройке.


Настройка

Итак, вы установили squid и слегка удивлены...."И это всё?" Если бы это было так, мой дорогой читатель. Увы нет....нам предстоит сделать ещё массу вещей, прежде чем в наших руках окажется старый добрый (и к тому же работающий) proxy-сервер.

Теперь наши усилия должны быть сосредоточены на /etc/squid.conf[12]. Этот файл содержит все настройки squid и, учитывая, что нам придётся его редактировать, советую сделать резервную копию. Хотя бы так

cp /etc/squid.conf /etc/squid.conf.orig

После чего запустить ваш любимый редактор и приступить к редактированию squid.conf

На самом деле, попытка использовать оригинальный файл /etc/squid.conf без внесения исправлений ни к чему хорошему не приведёт. Прежде чем у нас получится поднять и запустить proxy-сервер, в конфигурационном файле необходимо сделать множество изменений. На первый взгляд может показаться, что этот файл длиною в несколько миль. Но вашу задачу облегчат комментарии, которые вставлены везде, где только возможно.

Во-первых, нужно сообщить squid'у IP-адрес вашей машины и номер порта, на котором он будет "слушать" запросы. В squid.conf вы найдёте вот такую закомментированную строку:

#http_port 3128

Раскомментируйте её, удалив символ "решётки" (#). По умолчанию выбран порт 3128. Тем не менее, вы можете задать squid'у слушать другой порт!! На своей машине я указал такие параметры:

http_port 10.1.100.1:8080

Это заставляет squid "слушать" пакеты, приходящие на адрес 10.1.100.1, порт 8080. Прежде чем выбирать номер порта, убедитесь, что он не занят другим приложением. Это самая часто встречаемая ошибка при настройке squid.

Движемся дальше. В процессе настройки конфигурационного файла важной опцией является cache_mem. Она определяет количество оперативной памяти, которую может использовать proxy-сервер для кеширования.

Я просто раскомментировал эту строку и оставил значение по умолчанию -- 8 Мб.

Далее следуют опции, указывающие процент минимального и максимального уровня заполнения дискового кеша. При достижении уровня cache_swap_high, начинается ускоренный процесс удаления данных из кеша. Процесс прекращается при уровне заполнения cache_swap_low.

#cache_swap_low  90
#cache_swap_high 95

Я раскомментировал и изменил эти строки. Указанные мною значения были выбраны исходя из того, что в моём распоряжении был жесткий диск на 60 Гб:

cache_swap_low  97
cache_swap_high 98

Так....пока всё хорошо. Мы сообщили squid'у на каком порту и для какого адреса он должен слушать приходящие пакеты, сколько памяти он может использовать и какую долю объема дискового кеша (в процентах) он может занимать, прежде чем начнёт удалять старую информацию. Замечательно! Если вы внесли все изменения, о которых я говорил, то самое время сохранить их.

Следующая и предпоследняя опция, которую я менял, была одной из наиболее важных -- она определяла местоположение и размер подкаталогов дискового кеша. Настроил я её вот так:

cache_dir /var/squid/cache 100 16 256

Что и о чём тут говорит? "/var/squid/cache" указывает на путь к дисковому кешу с максимальным размером в 100 Мб, содержащему 16 подкаталогов верхнего уровня, каждый из которых в свою очередь содержит 256 подкаталогов.

Последнее, что нужно "подкрутить" в этом файле, прежде чем переходить к настройке фильтров, это использование регистрационных журналов. Следующими за опциями настройки кеша (cache_dir) идут опции, описывающие расположение регистрационных журналов (логов). Как правило, squid пишет информацию в четыре журнала:

  • access log
  • cache log
  • store log
  • swap log

Каждый из журналов имеет в работе proxy-сервера своё собственное назначение. Обычно я "веду" только два из них -- access log и cache log (журналы доступа и использования кеша). По здравому размышлению, остальные мне просто не нужны. :-)

Журнал доступа (access log) регистрирует все запросы, которые делает пользователь (т.е. на какой сайт он хочет попасть, какой файл скачать и т.д.). Когда я учился в школе, мне было не очень интересно, кто и куда пытался попасть. Теперь же я рекомендую всем сисадминам включать эту опцию -- этот журнал очень важен.

Итак, я сделал следующее (расскоментировав соответствующие строки):

cache_access_log /var/squid/logs/access.log
cache_log /var/squid/logs/cache.log

Рекомендую вам оставить пути к файлам журналов как есть.

Обычно я оставляю большинство опций в squid.conf закомментированными. Существует множество ключей, подходящих для различных ситуаций. Каждая опция хорошо (я бы сказал, избыточно) документирована, поэтому, если вы захотите выяснить, что она делает, то прочтите соответствующие комментарии в squid.conf.[5]


Фильтрация (контроль доступа)

В этом разделе мы продолжаем рассматривать "/etc/squid.conf" и я собираюсь подробнее остановиться на контроле доступа (access control).

Контроль доступа предоставляет системному администратору способ проконтролировать какие пользователи, через какие IP-адреса, порты и т.д. могут подключатся к proxy-серверу. Такой контроль может быть удобен в больших сетях.

Обычно ACL (Access Control Lists -- списки контроля доступа) содержат следующие настройки:

  • src - Источник, т.е. IP-адрес клиента
  • dst - Пункт назначения, т.е. IP-адрес сервера
  • srcdomain - Источник, т.е. имя домена клиента
  • dstdomain - Пункт назначения, т.е. имя домена сервера
  • time - Время суток и день недели
  • url_regex - Шаблон (регулярное выражение) для поиска в URL
  • urlpath_regex - Шаблон (регулярное выражение) для поиска в пути, содержащемся в URL, исключая протокол и имя хоста
  • proxy_auth - Аутентификация пользователя посредством внешних процессов
  • maxconn - Максимальное количество соединений для конкретного IP-адреса клиента

Все правила контроля доступа имеют следующий формат:

acl   acl_config_name   type_of_acl_config values_passed_to_acl

В конфигурационном файле squid.conf найдите строку:

http_access deny all

После неё добавьте следующее:

acl weekendmechnetwork 10.1.100.1/255.255.255.0
http_access allow weekendmechnetwork

Вы можете изменить имя ACL-правила "weekendmechnetwork" на любое другое по вашему выбору. В нашем случае правило с именем "weekendmechnetwork" используется для определения IP-адреса 10.1.100.1 (proxy-сервер) с сетевой маской 255.255.255.0 Таким образом, "weekendmechnetwork" является именем, ассоциируемым с клиентом сети.

Строка "http_access allow weekendmechnetwork" говорит, что для клиента "weekendmechnetwork" разрешён доступ через http-протокол.

Следующее, что мы должны сделать -- разрешить доступ в Интернет определённым клиентам. Этот приём используется в случае, когда доступ к Интернет должны получить не все пользователи в сети, а только часть из них.

Кроме того, что мы уже добавили в squid.conf, мы можем добавить примерно следующее:

acl valid_clients src 192.168.1.2 192.168.1.3 192.168.1.4
http_access allow valid_clients
http_access deny !valid_clients

Эти правила разрешают клиентам с IP-адресами из группы "valid_clients" доступ по протоколу http (http_access allow valid_clients) и запрещают его для для клиентов, чей IP-адрес не входит в группу "valid_clients" (http_access deny !valid_clients).

Если вы хотите разрешить доступ в Интернет любой машине, то объявите следующее правило:

http_access allow all

В дальнейшем мы можем расширить список правил, говоря squid'у, какое из ACL-правил будет активно в определённое время. Например:

1.   acl clientA src 192.168.1.1
2.   acl clientB src 192.168.1.2
3.   acl clientC src 192.168.1.3
4.   acl morning time 08:00-12:00
5.   acl lunch time 12:30-13:30
6.   acl evening time 15:00-21:00
7.   http_access allow clientA morning
8.   http_access allow clientB evening
9.   http_access allow clientA lunch
10.  http_access allow clientC evening
11.  http_access deny all

[ ** N.B. При создании правил, не забудьте опустить номера строк. Я добавил их, чтобы сделать понятнее дальнейшие объяснения -- Thomas Adam ** ]

Строки 1-3 задают имена ACL-правил, которыми идентифицируются машины.
Строки 4-6 задают имена ACL-правил, обозначающих временные отрезки (24-часовой формат).
Строка 7 разрешает clientA (и только ему) доступ в "утренние" часы.
Строка 8 разрешает clientB (и только ему) доступ в "вечерние" часы.
Строка 9 разрешает clientA (и только ему) доступ в "обеденное" время.
Строка 10 разрешает clientC (и только ему) доступ в "вечерние" часы.
Строка 11 отвергает попытку соединения любого другого клиента, за исключением тех клиентов и правил для них, что описаны выше.

Но мы можем применять ACL-правила, запрещая доступ к URL, соответствующим заданным регулярным выражениям. Хорошо "зашвырнуть" такие запросы в корзину для мусора или, что более корректно, в "&>/dev/null" :-)

Чтобы сделать это, мы можем определить новые именованные ACL-правила, содержащие регулярные выражения. Например:

1.  acl naughty_sites url_regex -i sex
2.  http_access deny naughty_sites
3.  http_access allow valid_clients
4.  http_access deny all

[ ** И опять напоминаю -- не используйте номера строк!! ** ]

Строка 1 настраивает связь между словом "sex" и ACL-правилом под именем "naughty_sites""; ключ url_regex указывает на тип правила, т.е. оно проверяет совпадение между шаблоном и URL. Ключ -i устанавливает режим поиска без учёта регистра.
Строка 2 запрещает доступ всем клиентам к web-сайту, чьё имя совпадает с шаблоном, описанным в "naughty_sites"
Строка 3 разрешает доступ клиентам "valid_clients".
Строка 4 блокирует все остальные запросы.

Хммм... Думаю, вы задаёте себе вопрос...."как определить несколько регулярных выражений?" Что ж, ответ прост....вы можете их разместить в отдельном файле. Предположим, вы хотите фильтровать слова

sex
porn
teen

и блокировать доступ к тем URL, в которых они встречаются. Вы можете добавить их в файл (каждое слово на отдельной строке), назовём его:

/etc/squid/bad_words.regex

Теперь в "/etc/squid.conf" укажите следующее:

acl bad-sites url_regex -i "/etc/squid/bad_words.regex"
http_access deny bad_sites
http_access allow valid_clients
http-access deny all

Это делает нашу жизнь намного проще! :-) В случае необходимости вы сможете добавлять в этот файл новые слова.

Существует более простой способ фильтрации с использованием регулярных выражений и доменных имён -- это программа SquidGuard. Но об этом чуть позже.....


Инициализация Squid

Теперь мы переходим к более важной части -- запуску squid. К сожалению, если вы впервые столкнулись со squid, то вам придётся "перелопатить" несколько опций, используемых при его запуске.

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

Флаг Описание
-z Ключ заставляет создать swap-директории, необходимые для squid. Используется только в том случае, если squid запущен впервые или ваши кеш-директории были удалены.
-f Эта опция позволяет вместо "/etc/squid.conf" использовать альтернативный конфигурационный файл. Однако, эта опция используется не часто.
-k reconfigure Этот ключ говорит squid перегрузить конфигурационный файл, без остановки демона squid.
-k rotate Эта опция заставляет squid произвести ротацию журналов -- старые записи удаляются и журналы начинаются заново. Как правило, этот ключ используется при запуске squid через cron.
-k shutdown Остановить выполнение squid.
-k check Проверить запущен ли демон squid.
-k parse То же, что и "-k reconfigure".

А это полный список существующих ключей:

Usage: squid [-dhsvzCDFNRVYX] [-f config-file] [-[au] port] [-k signal]
       -a port   Установить номер HTTP-порта (по умолчанию: 3128).
       -d level  Записывать отладочную информацию в stderr.
       -f file   Использовать конфигурационный файл, вместо
                 /etc/squid.conf
       -h        Напечатать справочное сообщение.
       -k reconfigure|rotate|shutdown|interrupt|kill|debug|check|parse
                 Разобрать [parse] конфигурационный файл, затем послать сигнал
                 запущенной копии (исключая -k parse) и выйти.
       -s        Включить запись в syslog.
       -u port   Определить номер ICP-порта (по умолчанию: 3130), 0 - отключить.
       -v        Показать номер версии.
       -z        Создать swap-директории
       -C        Не обрабатывать критические сигналы (fatal signals).
       -D        Отключить начальные тесты DNS.
       -F        Заново загрузить все мета-данные прежде, чем приступить к выполнению запросов.
       -N        Запустить squid в не-демон режиме.
       -R        Не устанавливать REUSEADDR на порт.
       -V        Виртуальный хост httpd-акселератор.
       -X        Включить отладочный режим.
       -Y        Возвращать  только UDP_HIT или UDP_MISS_NOFETCH при быстрой перезагрузке.

Если вы запускаете squid первый раз, то запустите его под правами root'а с ключом "-z":

squid -z

Это создаёт кеш на диске.

Теперь вы можете выполнить команду:

squid

Вот и всё!! Теперь в вашем распоряжении находится работающий proxy-сервер.


Краткое введение: SquidGuard


Что такое SquidGuard?

SquidGuard -- внешняя программа переадресации ("редиректор"), с помощью которой squid осуществляет фактическую пересылку пришедших к нему запросов. Задача SquidGuard'а -- лучшее управление процессом фильтрации, чем это делает сам Squid.

Хочу сразу заметить, что использовать SquidGuard при построении простых фильтров не имеет смысла.


Установка

SquidGuard можно найти на http://www.squidguard.org/download (забавно, правда?). Этот сайт содержит много информации о том, как его настраивать.

Как и Squid, SquidGuard можно скачать в двух форматах -- rpm и .tar.gz.

Если ваш дистрибутив поддерживает пакеты RPM, установить его можно так:

su - -c "rpm -i ./SquidGuard-1.2.1.noarch.rpm"

Если же формат RPM не поддерживается, то можно скачать и откомпилировать исходники, вот так:

tar xzvf ./SquidGuard-1.2.1.tgz
./configure
make && make install

Файлы будут установлены в "/usr/local/squidGuard/"


Настройка

Прежде чем мы начнём править конфигурационный файл "/etc/squidGuard.conf", требуется внести небольшие изменения в конфигурационный файл нашего старого друга "/etc/squid.conf". Найдите в нём такое место:

#redirect_program none

Раскомментируйте строку и замените слово "none" на путь к главному файлу SquidGuard. Если не знаете, где он -- воспользуйтесь командой:

whereis squidGuard

после чего впишите нужные путь и имя файла. Выглядеть это будет примерно так:

redirect_program /usr/local/bin/squidGuard

Сохраните файл и перезагрузите squid:

squid -k reconfigure

Это заставит его заново перечитать конфигурационный файл.

Хорошо. Теперь начинается самое интересное. Указав squid'у, что мы будем фильтровать приходящие к нему запросы с помощью внешней программы переадресации, мы должны определить соответствующие правила:

Основной конфигурационный файл SquidGuard -- это "/etc/squidGuard.conf". Выглядит он примерно так:

-------------------

(текстовая версия файла)

logdir /var/squidGuard/logs
dbhome /var/squidGuard/db

src grownups {
    ip     10.0.0.0/24    # диапазон 10.0.0.0  - 10.0.0.255
                          # И
    user   foo bar        # идентификаторы foo и bar
}

src kids {
    ip     10.0.0.0/22    # диапазон 10.0.0.0 - 10.0.3.255
}

dest blacklist {
    domainlist blacklist/domains
    urllist    blacklist/urls
}

acl {
    grownups {
        pass all
    }

    kids {
        pass !blacklist all
    }

    default {
        pass none
        redirect http://localhost/cgi/blocked?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u
    }
}

-------------------

Теперь разберём каждую секцию отдельно:

logdir /var/squidGuard/logs
dbhome /var/squidGuard/db

Первая строка указывает каталог, где будет размещаться файл журнала, и создаёт его, если он не существует.

Вторая строка описывает каталог баз(ы) данных, в которых будут храниться имена запрещённых сайтов, регулярные выражения для фильтров и прочее.

src grownups {
    ip     10.0.0.0/24    # диапазон 10.0.0.0  - 10.0.0.255
                          # И
    user   foo bar        # ident foo or bar
}

Этот блок настраивает сразу несколько параметров. Во-первых, src "grownups" определяет диапазон IP-адресов и пользователей, являющихся "членами" этого блока. Обычные "неопределенно-личные" идентификаторы "foo" и "bar" используются здесь в качестве примера.

Следует заметить, что метка [TAG] user может использоваться, если идентифицирующий сервер [6] запущен на том же сервере, который перенаправляет запросы proxy-серверу, иначе оно будет недействительным.

src kids {
    ip     10.0.0.0/22    # диапазон 10.0.0.0 - 10.0.3.255
}

Этот раздел настраивает другой блок, называемый "kids". Он описывает только диапазон IP-адресов, без указания имён пользователей.

Вы можете думать о grownups и kids, как о таких же именах ACL, определенных в "/etc/squid.conf".

dest blacklist {
    domainlist blacklist/domains
    urllist    blacklist/urls
    expression blacklist/expressions
}

Этот раздел кода важен, т.к. описывает список (dest), используемый конкретными фильтрами. В своей работе SquidGuard использует три основных способа фильтрации:

1. domainlist -- список доменов, каждый в отдельной строке, например:

nasa.gov.org
squid-cache.org
cam.ac.uk

2. urllist -- список web-страниц с пропущенным префиксом "www.", например:

linuxgazette.com/current
cam.ac.uk/~users

3. expression -- слова (регулярные выражения) встречающиеся в URL:

sex
busty
porn

Последний блок кода:

acl {
    grownups {
        pass all
    }

    kids {
        pass !blacklist all
    }

    default {
        pass none
        redirect http://localhost/cgi/blocked?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u
    }
}

Здесь, в разделе "grownups" acl-блока описывается разрешение на полный доступ к Интернет пользователям, входящим в группу "src grownups", вне зависимости от URL, наличия в их составе регулярных выражений и прочих ограничений, определённых в dest blacklist.

Раздел "kids" разрешает пользователям, входящим в группу "src kids" получать результат любого запроса, за исключением подпадающих под правила из dest blacklists. В случае, если URL совпадает с одним из определений dest blacklists, запрос перенаправляется по адресу, определённому в секции default.

В секцию default запрос перенаправляется в том случае, если его источник не принадлежит ни "grownups", ни "kids". При этом клиент попадает на web-страницу, , которая выглядит как страница с сообщением об ошибке.

Переменные, приходящие вместе с командой переадресации, указывают тип запроса и другую информацию, которая может использоваться cgi-скриптом, например для создания специального сообщения об ошибке.

Следует отметить, что для того, чтобы фильтрация работала, как минимум должен присутствовать следующий участок кода:

default {
  pass none
}

С командой переадресации или без неё.

Существует множество "навороченных" опций конфигурации, которые могут быть применены в этом файле. Примеры вы можете найти на http://www.squidguard.org/configuration.

На этом введение в "основы" Squid и SquidGuard заканчивается. Дополнительную информацию можно найти по ссылкам, которые встречались в этой статье или на моём сайте: www.squidproxyapps.org.uk


Keyfiles: удобный BASH-скрипт для резервного копирования

Да, да. Я знаю, вы все думаете: "Что! Опять! Только не это! Ещё один скрипт для создания резервных копий!". Я пару раз слышал разговоры на эту тему в почтовой рассылке и подумал, почему бы и мне не поучаствовать в них....

Этот скрипт прост как "кусок хозяйственного мыла" [7] -- он использует конфигурационный файл (plain text), который содержит список файлов и директорий, с которых вы хотите сделать копии и упаковать в "за-gz-ипованный тарбол" в определённом месте.

Те из вас, кто хорошо знаком с созданием скриптов на BASH'е найдут это немного забавным, но я надеюсь, что мои комментарии помогут тем, кто только пытается изучить программирование на BASH'е.

-------------------

(Текстовая версия файла)[13]

#!/bin/bash
#################################################
#Keyfiles - tar/gzip configuration files        #
#Version:   Версия  1.0 (черновик)              #
#Ackn:      основан на идее Dave Turnbull       #
#Authour:   Thomas Adam                         #
#Date:      Понедельник 28 мая 2001, 16:05 BST  #
#Website:   www.squidproxyapps.org.uk           #
#Contact:   [email protected]        #
########################################Комментарии

#Комментарии для Dave Turnbull. Чтобы он не заблудился :-).

#объявление переменных
configfile="/etc/keyfiles.conf"
tmpdir="/tmp"
wrkdir="/var/log/keyfiles"
tarfile=keyfiles-$(date +%d%m%Y).tgz
method=$1           #опции выбора операции
submethod=$2        #дополнительные опции для "$1"
quiet=0             #вывод отладочной информации (по умолчанию)

cmd=`basename $0`   #удаляем путь из имени файла
optfiles="Usage: $cmd [--default (--quiet)] [--listconffiles] [--restore (--quiet)] [--editconf] [--delold] [--version]"
version="keyfiles: Автор Thomas Adam, Версия 1.0 (Вторник 5 июня 2001, 23:42)"

#проверка конфигурационного файла...
if [ ! -e $configfile ]; then
  for beepthatbell in 1 2 3 4 5; do
    echo -en "\x07"
  done
  echo " " | mail -s "[Keyfiles]: отсутствует файл $configfile" $USER
  echo " [Ошибка!]: отсутствует файл $configfile" $USER
  exit -1
fi

#проверяем существование рабочей директории, если её нет, то создаём
[ ! -d $wrkdir ] && mkdir $wrkdir

#проверка того, запущен ли скрипт без опций
if [ -z $method ]; then
  echo $optfiles
  exit 0
fi

#синтаксический разбор командной строки
check_syntax ()
{
  case $method in
    --default)
    cmd_default
    ;;
    --listconffiles)
    cmd_listconffiles
    ;;
    --restore)
    shift 1
    cmd_restore
    ;;
    --editconf)
    exec $EDITOR $configfile
    exit 0
    ;;
    --delold)
    cd $wrkdir && rm -f ./*.old > /dev/null
    exit 0
    ;;
    --version)
    echo $version
    exit 0
    ;;
    --*|-*|*)
    echo $optfiles
    exit 0
    ;;
  esac
}

#Вот теперь и начинается самое интересное.....
#объявление функции используемой опцией "--default"
cmd_default ()
{

  #пакуем все файлы, указанные в $configfile

  if [ $submethod ]; then
    tar -cZPpsf $tmp/$tarfile $(cat $configfile) &>/dev/null 2>&1
  else
    tar -vcZPpsf $tmp/$tarfile $(cat $configfile)
  fi

  #если содержимое каталогов пусто......
  if test $(ls -1 $wrkdir | grep -c -) = "0"; then
    mv $tmp/$tarfile $wrkdir
    exit 0
  fi

  for i in $(ls $wrkdir/*.tgz); do
    mv $i $i.old
  done

  mv $tmp/$tarfile $wrkdir
}

#вывести список, содержащийся в $configfile
cmd_listconffiles ()
{
  sort -o $configfile $configfile
  cat $configfile
  exit 0
}

#восстановить файлы......
cmd_restore ()
{
  cp $wrkdir/keyfiles*.tgz /
  cd /

  #проверка флага тишины :-)
  if [ $submethod ]; then
    tar vzxfmp keyfiles*.tgz &>/dev/null 2>&1
    rm -f /keyfiles*.tgz
    exit 0
  else
    tar vzxfmp keyfiles*.tgz
    rm -f /keyfiles*.tgz
    exit 0
  fi
}

#вызов головной функции
check_syntax

-------------------

Следует заметить, что основные изменения, которые вы можете делать в скрипте -- это изменять три переменные:

configfile="/etc/keyfiles.conf"
tmpdir="/tmp"
wrkdir="/var/log/keyfiles"

Тем не менее, мой скрипт достаточно "интеллектуален", чтобы проверить существование рабочей директории и в случае необходимости создать её.

Вы должны убедится, что установили для файла со скриптом соответствующие права доступа:

chmod 700 /usr/local/bin/keyfiles

Самый важный файл -- конфигурационный. В моём случае он выглядит так:

-------------------

(Текстовая версия файла)

/etc/keyfiles.conf
/etc/rc.config
/home/*/.AnotherLevel/*
/home/*/.fvwm2rc.m4
/home/solent/ada/*
/root/.AnotherLevel/*
/root/.fvwm2rc.m4
/usr/bin/header.sed
/usr/bin/loop4mail
/var/spool/mail/*

-------------------

Основные функции в скрипте базируются на утилите tar, которая использует конфигурационный файл, точнее шаблоны имен файлов [wildcards][8] указанные в нём.

Обратите внимание, что каждый раз, когда скрипт выполняется, создаётся копия последнего архива, т.е. файл "keyfiles-DATE.tgz" (если он, конечно, существует) переименовывается в "keyfiles-DATE.tgz.old" прежде, чем будет создан новый.

Всё, что вам нужно для восстановления данных из архива, мой скрипт уже знает -- последний созданный архив имеет расширение ".tgz".

Благодаря этой особенности, я добавил в скрипт ещё одну опцию, которая удаляет из каталога $workdir все старые резервные копии -- "--delold".

Для того, чтобы создать резервную копию, введите:

keyfiles --default

Если вы не хотите, чтобы в процессе работы скрипт выдавал какую-либо информацию, воспользуйтесь вторым ключом -- "--quiet"[9]:

keyfiles --default --quiet

Думаю, названия остальных опций программы говорят сами за себя.

Предложенный вашему вниманию скрипт резервного копирования далёк от совершенства, существуют более удачные аналоги. Но, в любом случае, замечания и пожелания по поводу его работы приветствуются!!


Обзор программы: Nedit

Вернёмся назад, в те дни, когда когда прославленный основатель этого специализированного журнала John Fisk писал для этой колонки. Другой автор, Larry Ayers, имел обыкновение делать обзоры программ. Он кратко упомянул о программе Nedit. Но никогда рассматривал её более подробно.

В таком случае, это сделаю я :-)

Вот уже три года я использую Nedit. Всю работу я делаю в нём -- когда нахожусь в "иксах", как сейчас. Внешний вид Nedit вы можете увидеть на этом скриншоте.

Эта программа обладает огромными возможностями. Наиболее популярная из них -- синтаксическая подсветка для языков программирования. Вот их список:

  • C
  • C++
  • Java
  • JavaScript
  • Ada
  • Fortran
  • Pascal
  • Lex
  • Yacc
  • Perl
  • Python
  • Tcl
  • Awk
  • Sh Ksh Bash
  • Csh
  • Makefile
  • SGML HTMK
  • LaTeX
  • Postscript
  • SQL
  • Matlab
  • VHDL
  • Verilog
  • Xresources
  • Nedit Macro
  • CSS
  • Regex
  • XML

Если случается так, что вы пишете на языке программирования, который не перечислен выше, то вы можете сами написать для него шаблоны в виде регулярных выражений.

Nedit также предоставляет развитый механизм поиска и замены, использующий всё те же шаблоны (регулярные выражения) как с учётом регистра, так и без него.

Типичный пример окна диалога поиска/замены выглядит так:

В нём имеется возможность формировать сложные запросы.

Каждый из пунктов меню (имеется ввиду меню 1-го уровня), может быть "оторван" и расположен в отдельном окне. Это может быть полезно, если какой-то из пунктов приходится вызывать очень часто.

Программа может быть загружена со множеством ключей, большинство из которых я использую, но мне ещё не удалось найти применение для всех опций, с которыми может быть запущен Nedit. Если вам этого мало, то учтите, что Nedit позволяет писать свои собственные макросы, так что вы можете сами создавать "супернавороченные" функции.

Рекомендую эту программу всем и каждому. В то же время, не желая изобретать новый велосипед в стиле Emacs/Vim, я всё-таки считаю Nedit реальной заменой и альтернативой "X11-Emacs", пожирающему слишком много оперативной памяти!! :-)

Вы можете скачать Nedit отсюда:

www.nedit.org

Попробуйте и наслаждайтесь им :-)


"А напоследок я скажу..."

Ну что ж, пора и этому месяцу закончиться -- я не ожидал, что он будет таким длинным!! Мой академический год более-менее приближается к концу и в последних числах мая меня ждут экзамены. После них я буду свободен целое лето, достаточно, чтобы привести в порядок все мои идеи относительно Linux'а, поселившиеся у меня в мозгу ( -- после того, как Ben Okopnik промыл его) :-)

До следующего месяца. Удачи и берегите себя.


Любые комментарии и предложения можно отослать мне, не поленившись и щелкнув по ссылке:

[email protected]


Примечания переводчика

[Если у вас возникнет вопрос: "А почему ссылки не по порядку?", отвечу: "Вам шашечки или чтобы ехать?" ;-)]

[1]Перевод Р. Гальпериной, сборник рассказов Эдгара Аллана По, Москва, 1980, "Художественная литература".

[2] LWM -- Linux Weekend Mechanic.

[3] Для rpm-совместимых дистрибутивов:

rpm -ivh полное_имя_пакета_squid

Для обладателей ALT Linux Master 2.0 или/и Debian:

apt-get install squid

[4]Для этого достаточно "поиграть" с настройками конфигурационного скрипта configure (--prefix, --exec-prefix и т.п.).

[5] Если вы с английским на "ты" или хотя бы на "вы".

[6] Не могу сказать с уверенностью на все "сто", но, по моему, речь идёт о DNS-сервере.

[7] Вообще-то я не уверен в том, есть ли в Объединенном Королевстве хозяйственное мыло. 8-)

[8] Цитата из "Инсталляция Linux и первые шаги", автор М. Уэлш: "Ключевое свойство большинства оболочек Unix -- это способность ссылаться сразу более, чем на один файл, используя специальные символы ... так называемые "дикие карты" (wildcards)..."

[9] Только не спутайте очерёдность ключей.

[10] Автор немного забыл обновить свои автобиографические данные. Судя по всему, теперь он "обычный" студент "обычного" университета. И не исключено, что времени для игры на пианино у него сейчас меньше обычного. В любом случае спасибо ему за то, что нашёл время возобновить работу колонки LWM. 8-)

[11] Хм... Проще будет воспользоваться командой:

rpm -q squid

[12]Либо /etc/squid/squid.conf

[13] В скрипт пришлось внести небольшие изменения -- вряд ли вам нужно, чтобы он отсылал пять одинаковых сообщений о том, что не найден конфигурационный файл "/etc/keyfiles.conf".



Thomas Adam

Меня зовут Thomas Adam. Мне 18, и в настоящее время я готовлюсь к A-Levels (= вступительные экзамены в университет). Живу на маленькой ферме в округе Дорсет в Англии. Я большой энтузиаст Linux, и помогаю в школе со всеми делами, связанными с его повседневным использованием. Linux использую уже около шести лет. Когда я не работаю с Linux, то играю на пианино, люблю пешие прогулки и кататься на мотоцикле.[10]


Copyright (C) 2002, Thomas Adam.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 78 of Linux Gazette, May 2002

Вернуться на главную страницу