Установка и удаление X-сервера для RHEL Linux

Устанавливать X-сервер на серверную машину конечно же не правильно. Но бывают ситуации, когда без этого не обойтись. Например, нужно установить что-либо, а установщик только GUI и экспортировать дисплей нельзя. Для этого можно установить X-сервер (в этой статье будет использован оконный менеджер Gnome), сделать дело и удалить X-сервер полностью.

В общем, от философии к делу.

Для установки X-сервера в RHEL-подобных ОС Linux (Oracle Linux, RedHat, CentOS, Fedora), которые были установлены без Xorg достаточно выполнить команду:

yum groupinstall “GNOME Desktop Environment” “X Window System” “Desktop”

В большинстве случаев создавать/редактировать конфигурационные файлы не понадобиться. Колдовать с конфигом Xorg придётся в случае нестандартных драйверов, режима нескольких мониторов и т. п., что не есть наш случай просто временной установки X-сервера. Запускаем X-сервер:

startx

Далее логинимся, делаем своё черное дело и после этого можно так же легко удалить X сервер вместе со всеми его пакетами:

yum groupremove “GNOME Desktop Environment” “X Window System” “Desktop”

http://geckich.blogspot.com/

Использование библиотеки Mechanize в Python для авторизации, отправки веб-форм и скачивания файлов

Для языка Python существует довольно много библиотек для работы с веб-ресурсами. Это и стандартная urllib / urllib2 и сторонние – mechanize, Twill, Request, Client Form.

В данной статье я рассмотрю работу с библиотекой mechanize, т. к. именно ее инструменты помогли мне “победить” задачу автоматизации скачивания материала с одного веб-сайта.

Суть проблемы я буду излагать достаточно пространно, т. к. не могу приводить здесь конкретный пример, но надеюсь – вам будет примерно понятно.

Проблема заключалась в следующих моментах:

  • для скачивания нужно было авторизоваться на сайте. Причем, авторизация с помощью forms, а не Basic HTTP. 
  • необходимо было хранить кукисы, дабы авторизация не пропала. 
  • путем манипуляций со списками (SelectControl) выбирались параметры скачивания. 
  • далее нужно было получить ссылку, содержащую уникальный токен, не позволявший сачать файл по одной и той же ссылке боле 1 раза просто поменяв параметры GET запроса. 
  • и авторизация и скачивание и всё остальное нехорошие программисты сделали на одной html-странице в одной и той же форме, только с разными кнопками типа Submit.

Итак, начнемс. Вначале импорт необходимых библиотек. Mechanize не идет в стандартной поставке с Python  и его необходимо установить или с помозью PiPy или вручную, как написано на официальном сайте (python setup.py install).

import cookielib, shutil, os
from mechanize import Browser

Далее, создаем объекты: основной Browser и объект для хранения кукисов, который прикрепляем к нашему Browser. Объект Browser представляет собой контейнер по смыслу похожий на вкладку настоящего браузера. Т. е. в пределах его можно оществлять навигацию по web-сайту, авторизацию, хранить кукисы и т. д.

br = Browser()
# Create cookie jar and attach it to Browser
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

Затем, добавляем html хэдэры и открываем URL нужной странички в объекте Browser.

# Add some headers
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
# Open url in Browser instance
br.open('http://www.example.com/download.aspx')

Далее выбираем форму, в которую будем вносить данные. nr=0 – индекс формы по счету в коде веб-страницы (0,1,2 …) И вводим данные в поля для авторизации в формате (для элементов типа TextControl):

br[“id_html_элемента”] = “Значение”

id элементов и возможные значения можно посмотреть двумя способами:

  • в браузере Google Chrome нажать правой кнопкой мыши на нужном элементе и выбрать Просмотр исходного кода элемента, затем правой кнопкой на выделенном элементе и Copy as HTML. После этого, вставить текст в любой текстовый редактор. 
  • выполнив код в интерпретаторе python или в отдельном скрипте:

import cookielib
from mechanize import ParseResponse, urlopen
response = urlopen("http://www.eoddata.com/download.aspx")
forms = ParseResponse(response, backwards_compat=False)
form = forms[0]
print form

Вы получите список всех элементов формы и их возможных значений в формате:

<Тип(id=список_значений)>

Вроде такого:

<aspnetForm POST http://www.example.com/download.aspx application/x-www-form-urlencoded
  <SelectControl(ctl00$DataFormat=[17, 2, 36, 16, 27, 28, 33, 32, 8, 24, 35, *9, 1, 39, 11, 14, 6, 5, 4, 12, 3, 26, 15])>
  <SubmitControl(ctl00$Download=Download) (readonly)>
  <TextControl(ctl00$txtEmail=)>
  <PasswordControl(ctl00$txtPassword=)>
  <CheckboxControl(ctl00$Remember=[on])>
  <SubmitControl(ctl00$btnLogin=Login) (readonly)>>

Итак, пример кода основного скрипта для авторизации:

# Select form for modification and "enter" login info
br.select_form(nr=0)
br["ctl00$txtEmail"] = "User"
br["ctl00$txtPassword"] = "Secret"
# Submit form
br.submit(nr=3)

Обратите внимание на строку

br.submit(nr=3)

В скобках указан номер кноки типа Submit по порядку её нахождения в html-коде страницы. Это важно, если в форме есть несколько кнопок типа Submit, но выполняющих различные функции (как в нашем случае). Нумерация 0,1,2…

Далее, выбираем необходимые данные в списках значений, например (значения посмотреть описанными выше методами):

br.select_form(nr=0)
# Select Options
br["ctl00$cboSomething"] = ["EXAMPLE",]
br["ctl00$cboDataFormat"] = ["11",]
# Update page
br.submit(nr=1)

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

Скачиваем файл (считая, что искомый URL на файл находится в переменной download_url):

local_path = "/home/user"
filename = "very_important.txt"
f = br.retrieve(download_url)[0]
# Copy saved file to normal location
shutil.copy2(f,os.path.join(local_path, filename))

В переменной f мы получаем путь к скачанному файлу, обычно это какое-то случайное имя в директории /tmp. Далее перемещаем его в нужное нам место.

Ссылки:

  • http://stockrt.github.io/p/emulating-a-browser-in-python-with-mechanize/
  • http://www.voidspace.org.uk/python/articles/authentication.shtml
  • http://mozgovipc.blogspot.com/2012/06/python-http-basic-authentication-with.html
  • http://docs.python-requests.org/en/latest/
  • http://stackoverflow.com/questions/9541677/urllib2-post-request
  • http://docs.python.org/2/howto/urllib2.html
  • http://stackoverflow.com/questions/9288662/need-more-mechanize-documentation-python
  • http://www.pythonforbeginners.com/cheatsheet/python-mechanize-cheat-sheet
  • http://blog.spritecloud.com/2010/01/posting-forms-with-python/
http://geckich.blogspot.com/

Регулирование частоты CPU (энергосбережение) в Linux Debian

CPU загружен полностью не всегда, потому для повышения энергосбережения современные поколения процессоров позволяют уменьшать свою частоту во время простоя. В Windows Vista, 7, 8 этот принцип реализован по-умолчанию (включается/выключается в настройках BIOS), а в OS Linux для этого нужно установить специального демона cpufrequtils:

aptitude install cpufrequtils

Он запустится и по-умолчанию в нем настроен т. н. governor (регулятор) управления частотой ondemand. Регуляторы бывают:

  • performance, производительность (по умолчанию). Этот регулятор встроен в ядро и заставляет работать CPU с максимальной скоростью; 
  • ondemand. Динамически изменяет частоту процессора в зависимости от нагрузки на систему (повышает частоту при достижении 95% нагрузки на текущей частоте); 
  • conservative. Похоже на регулятор ondemand, разница лишь в том, что повышает частоту при достижении 75% нагрузки на текущей частоте; 
  • powersave. Выставляет минимальную частоту для процессора; 
  • userspace. Пользователь выставляет частоту вручную. 

Задать регулятор можно в файле /etc/default/cpufrequtils (если его нет, нужно создать), например:

# valid values: userspace conservative powersave ondemand performance 

# get them from cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
GOVERNOR=”conservative”


Также не забываем включить демона в автозагрузку:

update-rc.d cpufrequtils defaults

Для Gnome 3 shell можно установить дополнение, которое будет показывать в верхней строке состояния текущую частоту и даст возможность менять регулятор “на лету” мышкой.

Заходим сюда – https://extensions.gnome.org/extension/47/cpu-frequency/ и включаем регулятор вверху справа в On.

Этим мы установим дополнение, но активировать его нужно в апплете Advanced Settings (пакет gnome-tweak-tool):

Результат:

Ссылки:

http://geckich.blogspot.com/

Определение и вызов fabric task в одном Python скрипте

Библиотека fabric для Python является хорошим средством для автоматизации действий (админимстрирования, deployment и т. д.) для инфраструктуры серверов под управлением ОС Linux. Библиотека использует протокол open ssh для выполнения команд и перемещения данных.

Подробнее о библиотеке можно прочитать на официальном сайте или здесь.

Бывают ситуации, когда необходимо в одном скрипте и объявить таск из библиотеки fabric и выполнить его.

Пример структуры такого скрипта:

#!/usr/bin/env python
# Script dependencies: python-devel, fabric (https://github.com/fabric/fabric/archive/master.zip)
# Usage: python script.py
import fabric
from fabric.api import *
# Define ssh-like address user@server_hostname
remote_host = user@server

def some_fab_task():
# Define fabric task here
# hide('everything') helps to execute task with minimum output to console
with settings(hide('everything')):
try:
....
except:
....

# Main function
if __name__ == '__main__':
# Call fabric task from here
fabric.tasks.execute(some_fab_task, hosts=[remote_host])

Для того, чтобы скрипт выполнялся “тихо” – без запросов на ввод пароля для удаленного пользователя, необходимо организовать доступ на удаленноый сервер с помощью ssh-ключей,  например как я описывал здесь.

Update:

Для передачи аргументов в скрипт, указываем их перед hosts=.

fabric.tasks.execute(some_fab_task, arg1, arg2, hosts=[remote_host])

Для передачи xargs, можно указывать их также до или после hosts=

fabric.tasks.execute(some_fab_task, arg1, arg2, hosts=[remote_host], xarg1=value1)
http://geckich.blogspot.com/

Автоматизация скриптов с помощью expect

Недавно открыл для себя интересную консольную утилиту expect. Сия утилита является интерпретатором (со своим языком) для взаимодействия с интерактивными (т. е. требующими какого-либо ввода от пользователя) программами.
Дабы не писать много лишнего, рассмотрим использование expect на примере.
Допустим,

  • есть удалённый sftp-сервер с адресом 192.168.1.2,
  • к которому у нас есть доступы вида user/SECRET, порт 20022,
  • нам нужно автоматически брать с этого сервера файл вида TODAYDATE_smtng_important.txt, где TODAYDATE – текущая дата вида YYYYMMDD,
  • файлик лежит в корневой директории.

При авторизации на sftp-сервере требуется ввод пароля, который никак ни опцией ни указать, ни ключ не прокинуть (предположим, нет административного доступа на sftp-сервер).
Вот именно здесь в автоматизации этой задачи поможет нам линуксовая консольная утилита expect.
создаем файл get_file.sh со следующим содержимым:
#!/usr/bin/expect
# Script to get important file from sftp quetly. Uses expect (yum install expect -y)
# Usage: ./get_file.sh YYYYMMDD
# where YYYYMMDD – today’s date

set today [lindex $argv 0]
spawn sftp -oPort=20022 user@192.168.1.2:${today}_smtng_important.txt /home/user/${today}_smtng_important.txt
expect “password:”
send “SECRET\n”;
interact

Строки после комментария:

  1. Создаем переменную today, присваивая ей первый аргумент, переданный скрипту при запуске.
  2. Выполняем команду для подключения к sftp, где вместо ${today} интерпретатор вставляет значение даты (переданное скрипту)
  3. Далее скрипт ждет указанного запроса (prompt) – здесь возможно много вариантов, в т. ч. и таймауты и различные prompt-ы, об этом можно прочитать в мане или в более расширенных статьях.
  4. Получив указанный выше промпт, посылаем в ответ наш пароль и знак окончания строки (аналог нажатия пользователем [Enter])
  5. Далее скрипт полностью передает управление пользователю.

Запускать скрипт, понятное дело после chmod o+x, например так:
./get_file.sh 20142902
Минусом изложенного подхода, конечно же, является хранение пароля для sftp в открытом, не зашифрованном виде.
Ссылки:

  1. Хорошая статья по командам expect
  2. Туториал по expect
  3. Ман по sftp в Linux
http://geckich.blogspot.com/

Установка системы мониторинга Nagios Core 4 на Linux Debian 6

Недавно возникла необходимость установить систему мониторинга Nagios Core 4 на сервер под управлением Linux Debian 6 (Squeeze). Здесь изложу свой опыт. В принципе, на Debian 7, Ubuntu, а также RHEL-ы (CentOS, Oracle Linux, Fedora) Nagios ставится походим образом. Необходимо лишь учитывать особенности путей на этих системах и наименования пакетов для установки.

Подробнее про Nagios, различие его редакций и т. д. можно прочитать на официальном сайте проекта.

Планируется установить следующие компоненты:

  • Nagios Core, 
  • Nagios Plugins, 
  • NRPE, 
  • Nagios V-Shell (симпатичный фронт-энд для Nagios Core). 

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


1. Установка зависимостей

apt-get install wget build-essential apache2 php5-gd libgd2-xpm libgd2-xpm-dev libapache2-mod-php5 php-apc libssl-dev

2. Создание пользователей и групп

useradd -m nagios
groupadd nagios
groupadd nagcmd
usermod -a -G nagcmd nagios

3. Скачивание необходимых архивов. На момет написания статьи последняя версия Nagios Core – 4.0.2, NRPE – 2.15

mkdir downloads
cd downloads
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-4.0.2.tar.gz
wget http://assets.nagios.com/downloads/nagiosplugins/nagios-plugins-master.tar.gz
wget http://assets.nagios.com/downloads/exchange/nagiosvshell/vshell.tar.gz
wget http://sourceforge.net/projects/nagios/files/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz

4. Распаковка архивов

tar zxvf nagios-4.0.2.tar.gz
tar zxvf nagios-plugins-master.tar.gz
tar -xzvf vshell.tar.gz
tar -xzvf nrpe-2.15.tar.gz

5. Компиляция и установка Nagios Core

cd nagios-4.0.2
./configure –with-nagios-group=nagios –with-command-group=nagcmd –with-mail=/usr/bin/sendmail
make all
make install 
make install-init
make install-config
make install-commandmode
make install-webconf
cp -R contrib/eventhandlers/ /usr/local/nagios/libexec/
chown -R nagios:nagios /usr/local/nagios/libexec/eventhandlers
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

6. А здесь я столкнулся с такой проблемой, что скрипты запуска в 4-й версии написаны несовместимо с Debian 6. Поэтому, необходимо содержимое файла /etc/init.d/nagios заменить на следующее:

#!/bin/sh

### BEGIN INIT INFO
# Provides: nagios
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start nagios daemon at boot time
# Description: Nagios 4.0.2 daemon 
### END INIT INFO

#
# chkconfig: 345 99 01
# description: Nagios network monitor
#
# File : nagios
#
# Author : Jorge Sanchez Aymar (jsanchez@lanchile.cl)
#
# Description: Starts and stops the Nagios monitor
#              used to provide network services status.
#
# Load any extra environment variables for Nagios and its plugins

if test -f /etc/sysconfig/nagios; then
 . /etc/sysconfig/nagios
fi
status_nagios ()
{
 if test -x $NagiosCGI/daemonchk.cgi; then
  if $NagiosCGI/daemonchk.cgi -l $NagiosRunFile; then
          return 0
  else
   return 1
  fi
 else
  if ps -p $NagiosPID > /dev/null 2>&1; then
          return 0
  else
   return 1
  fi
 fi
 return 1
}
printstatus_nagios()
{
 if status_nagios $1 $2; then
  echo “nagios (pid $NagiosPID) is running…”
 else  echo “nagios is not running”
 fi
}
killproc_nagios ()
{
 kill $2 $NagiosPID
}
pid_nagios ()
{
 if test ! -f $NagiosRunFile; then
  echo “No lock file found in $NagiosRunFile”
  exit 1
 fi
 NagiosPID=`head -n 1 $NagiosRunFile`
}
# Source function library
# Solaris doesn’t have an rc.d directory, so do a test first
if [ -f /etc/rc.d/init.d/functions ]; then
 . /etc/rc.d/init.d/functions
elif [ -f /etc/init.d/functions ]; then
 . /etc/init.d/functions
fi
prefix=/usr/local/nagios
exec_prefix=${prefix}
NagiosBin=${exec_prefix}/bin/nagios
NagiosCfgFile=${prefix}/etc/nagios.cfg
NagiosStatusFile=${prefix}/var/status.dat
NagiosRetentionFile=${prefix}/var/retention.dat
NagiosCommandFile=${prefix}/var/rw/nagios.cmd
NagiosVarDir=${prefix}/var
NagiosRunFile=${prefix}/var/nagios.lock
NagiosLockDir=/var/lock/subsys
NagiosLockFile=nagios
NagiosCGIDir=${exec_prefix}/sbin
NagiosUser=nagios
NagiosGroup=nagios
# Check that nagios exists.
if [ ! -f $NagiosBin ]; then
    echo “Executable file $NagiosBin not found.  Exiting.”
    exit 1
fi
# Check that nagios.cfg exists.
if [ ! -f $NagiosCfgFile ]; then
    echo “Configuration file $NagiosCfgFile not found.  Exiting.”
    exit 1
fi
# See how we were called.
case “$1” in
 start)
  echo -n “Starting nagios:”
  $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
  if [ $? -eq 0 ]; then
   su – $NagiosUser -c “touch $NagiosVarDir/nagios.log $NagiosRetentionFile”
   rm -f $NagiosCommandFile
   touch $NagiosRunFile
   chown $NagiosUser:$NagiosGroup $NagiosRunFile
   $NagiosBin -d $NagiosCfgFile
   if [ -d $NagiosLockDir ]; then touch $NagiosLockDir/$NagiosLockFile; fi
   echo ” done.”
   exit 0
  else
   echo “CONFIG ERROR!  Start aborted.  Check your Nagios configuration.”
   exit 1
  fi
  ;;
 stop)
  echo -n “Stopping nagios: “
  pid_nagios
  killproc_nagios nagios
   # now we have to wait for nagios to exit and remove its
   # own NagiosRunFile, otherwise a following “start” could
   # happen, and then the exiting nagios will remove the
   # new NagiosRunFile, allowing multiple nagios daemons
   # to (sooner or later) run – John Sellens
  #echo -n ‘Waiting for nagios to exit .’
   for i in 1 2 3 4 5 6 7 8 9 10 ; do
       if status_nagios > /dev/null; then
    echo -n ‘.’
    sleep 1
       else
    break
       fi
   done
   if status_nagios > /dev/null; then
       echo ”
       echo ‘Warning – nagios did not exit in a timely manner’
   else
       echo ‘done.’
   fi
  rm -f $NagiosStatusFile $NagiosRunFile $NagiosLockDir/$NagiosLockFile $NagiosCommandFile
  ;;
 status)
  pid_nagios
  printstatus_nagios nagios
  ;;
 checkconfig)
  printf “Running configuration check…”
  $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
  if [ $? -eq 0 ]; then
   echo ” OK.”
  else
   echo ” CONFIG ERROR!  Check your Nagios configuration.”
   exit 1
  fi
  ;;
 restart)
  printf “Running configuration check…”
  $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
  if [ $? -eq 0 ]; then
   echo “done.”
   $0 stop
   $0 start
  else
   echo ” CONFIG ERROR!  Restart aborted.  Check your Nagios configuration.”
   exit 1
  fi
  ;;
 reload|force-reload)
  printf “Running configuration check…”
  $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1;
  if [ $? -eq 0 ]; then
   echo “done.”
   if test ! -f $NagiosRunFile; then
    $0 start
   else
    pid_nagios
    if status_nagios > /dev/null; then
     printf “Reloading nagios configuration…”
     killproc_nagios nagios -HUP
     echo “done”
    else
     $0 stop
     $0 start
    fi
   fi
  else
   echo ” CONFIG ERROR!  Reload aborted.  Check your Nagios configuration.”
   exit 1
  fi
  ;;
 *)
  echo “Usage: nagios {start|stop|restart|reload|force-reload|status|checkconfig}”
  exit 1
  ;;
esac
# End of this script

7. Далее добавляем Nagios в автостарт и запускаем демона
update-rc.d nagios defaults
service nagios start

8. Настройка веб-сервера Apache
8.1. Создаем пользователя и пароль для веб-интерфейса Nagios:

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin 

8.2. Теперь настроим ssl, т. к. использовать незашифрованное соединение – это как-то не спортивно.

Конечно, максимальную защиту даст только сертификат, выданный CA, но он стоит денег (около 99$ в год – зависит от цен конкретной CA), а бесплатно увеличить безопасность – пусть и не идеально – можно и с помощью самоподписанного сертификата. Конечно, при этом вы остаётесь уязвимыми для т. н. man-in-the-middle attack.

Если необходимо, то создать самоподписанный сертификат можно следующим образом:

mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout nagios.key -out nagios.crt

Предположим, мы будем использовать дефолтный файл конфигурации apache2 для ssl.
Удаляем конфиг, скопированный при установке, предварительно скопировав его содержимое:

rm /etc/apache2/conf.d/nagios.conf

Редактируем дефолтный конфиг ssl:

nano /etc/apache2/sites-available/default-ssl.conf

Куда помещаем следующее, изменяя на свои значения, если есть различия:

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
SSLEngine on
SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
BrowserMatch “MSIE [2-6]”
nokeepalive ssl-unclean-shutdown
downgrade-1.0 force-response-1.0
BrowserMatch “MSIE [17-9]” ssl-unclean-shutdown
<Directory />
  Options -Indexes
</Directory>
ScriptAlias /nagios/cgi-bin “/usr/local/nagios/sbin”
<Directory “/usr/local/nagios/sbin”>
   SSLRequireSSL
   Options ExecCGI
   AllowOverride None
   Order allow,deny
   Allow from all
#  Order deny,allow
#  Deny from all
#  Allow from 127.0.0.1
   AuthName “Nagios Access”
   AuthType Basic
   AuthUserFile /usr/local/nagios/etc/htpasswd.users
   Requir
e valid-user

</Directory>
Alias /nagios “/usr/local/nagios/share”
<Directory “/usr/local/nagios/share”>
   SSLRequireSSL
   Options None
   AllowOverride None
   Order allow,deny
   Allow from all
#  Order deny,allow
#  Deny from all
#  Allow from 127.0.0.1
   AuthName “Nagios Access”
   AuthType Basic
   AuthUserFile /usr/local/nagios/etc/htpasswd.users
   Require valid-user
</Directory>
</VirtualHost>
</IfModule>

Включаем модуль ssl, разрешаем наш ssl-сайт и перезапускаем службу:

a2enmod ssl
a2enmod cgi
a2ensite default-ssl
/etc/init.d/apache2 restart

Теперь приверяем. Заходим по адресу https://IP/nagios и после авторизации мы должны увидеть страшный веб-интерфейс Nagios Core:

Также походите по ссылкам в нём, чтобы проверить работоспособность скриптов.

9. Устанавливаем Nagios plugins

cd ../nagios-plugins-1.5-8-g9db76
which openssl
./configure –with-nagios-user=nagios –with-nagios-group=nagios –with-openssl=/usr/bin/openssl –enable-perl-modules –enable-libtap
make
make install

10. Устанавливаем NRPE

cd ../nrpe-2.15
./configure –with-ssl=/usr/bin/openssl –with-ssl-lib=/usr/lib/x86_64-linux-gnu
make
make all
make install
make install-plugin
make install-daemon
make install-daemon-config
cp init-script.debian /etc/init.d/nrpe
chmod 700 /etc/init.d/nrpe
/etc/init.d/nrpe start

Радактируем стартовый скрипт

nano /etc/init.d/nrpe

И для совместимости с Debian добавляем в начало файла:

#!/bin/sh
# Start/stop the nrpe daemon.
#
# Contributed by Andrew Ryder 06-22-02
# Slight mods by Ethan Galstad 07-09-02

### BEGIN INIT INFO
# Provides: nrpe
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start nrpe daemon at boot time
# Description: nrpe daemon 2.15
### END INIT INFO

Включаем в автозапуск:

update-rc.d nrpe defaults

Также не забываем в файл с командами Nagios’a /usr/local/nagios/etc/objects/commands.cfg дописать определение команды для NRPE серверной части:

define command{
        command_name    check_nrpe
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 30
        }

11. Устанавливаем vshell. Не забываем в файле install.php закомментировать строчку для RHEL дистрибутивов:

//define(‘APACHECONF’,”/etc/httpd/conf.d”);

А раскомментировать валидную для Debian:

define(‘APACHECONF’,”/etc/apache2/conf.d”);

Команды:

cd ../vshell
nano install.php
./install.php

Проверяем переходя по ссылке https://IP/vshell.
Далее необходимо приступить к настройке Nagios и серверов, которые планируется мониторить. Но, это уже тема для другой статьи. 
Надеюсь – данная будет полезной тем, кто только начал обустраивать свой мониторинг.
Ссылки:
1. Исправлены ошибки в статье.

2. Если возникает ошибка “Starting nagios:No directory, logging in with HOME=/” это значит, что вы не создали домашнюю директорию для пользователя nagios. Делаем: 
mkdir /home/nagios
chown-R nagios:nagios /home/nagios
http://geckich.blogspot.com/

Автодополнение в командной строке Linux

Автодополнение в командной строке Linux – это крайне удобная вещь. Вот скажем, нужно вам посмотреть информацию о пакете, скажем, php-mcrypt, но вы не помните как точно он пишется. С автодополнением достаточно в команде написать первые буквы и двойное нажатие [TAB] покажет вам варианты, а одинарное – дополнит, если вариант единственный:

rpm -q ph [TAB][TAB]

phonon-backend-gstreamer  php-devel                 php-mysql
php                       php-gd                    php-pdo
php-cli                   php-mbstring              php-xml
php-common                php-mcrypt                
Эта полезная фишка содержится в пакете bash-completion. При установке Debian-based систем этот пакет устанавливается по-умолчанию.А во многих же RHEL-дистрибутивах (например, Oracle Linux) – почему-то нет. Устанавливаем командой:

yum install bash-completion
aptitude install bash-completion

Для каких именно команд работает автодополнение – зависит от конкретной системы и установленного на ней софта. Поэтому, чтобы посмотреть список команд:

ls /etc/bash_completion.d

autoconf       gdbus-bash-completion.sh      mysqladmin        scl.bash
automake       getent                        ncftp             screen
bash-builtins  gpg2                          net-tools         service
bind-utils     gsettings-bash-completion.sh  nmap              sh
brctl          gzip                          ntpdate           shadow
bzip2          iconv                         openssl           smartctl
chkconfig      iftop                         perf              sqlite3
configure      ifupdown                      perl              ssh
coreutils      info                          pkg-config        strace
cpan2dist      iproute2                      pm-utils          subversion
cpio           iptables                      postfix           tar
crontab        java                          procps            tcpdump
cryptsetup     lsof                          python            util-linux
cups           lvm                           qdbus             wireless-tools
cvs            lzma                          quota-tools       xmllint
dd             make                          redefine_filedir  xmlwf
dhclient       man                           rfkill            xsltproc
e2fsprogs      mc                            rpcdebug          xz
findutils      mdadm                         rpm               yp-tools
gcc            minicom                       rsync             yum.bash
gdb            module-init-tools             samba             yum-utils.bash
http://geckich.blogspot.com/

Использование встроенной базы данных AstDB в Asterisk

AstDB является частью Asterisk  и устанавливается вместе с ним. Это простая БД (Barkley DB версии 1), без всяких заморочек. Если нужно подключить к Asterisk БД MySQL или PosrgreSQL – это тоже можно сделать, но для несложных задач вполне хватит и AstDB.

Предположим, у нас уже настроен GSM-модем в Asterisk – например, как я описывал здесь для модемов Huawei – и мы хотим звонить на мобильные номера наших абонентов (к примеру, в не рабочее время, когда они находятся вне доступа к SIP телефонам).

Хранится информация в БД с помощью трех понятий – семейство, ключ и значение. Семейство – это аналог таблицы, в которой хранятся пары ключ-значение.

Для начала, нам необходимо наполнить нашу БД номерами. Сделать это можно в процессе диалплана командой вроде:

exten => s,n,Set(DB(mobile/1112)=0991111111)

Здесь мы создаем (или модифицируем, если таковой ключ уже есть) ключ 1112 – SIP-номер для нашего абонента, в моем примере – в семейтве mobile. И присваиваем ему номер мобильного для этого абонента.

Но для большого количества абонентов делать такое не есть хорошо, тем более что БД хранит данные и после перезапуска Asterisk  и после перезагрузки сервера. Потому, целесообразнее – для моего примера – заранее заполнить БД данными из командной строки Asterisk.

Добавление/модификация значений:

database put <семейство> <ключ> <значение>
Пример: database put mobile 1112 0991111111

Для просмотра информации имеем команду:

database get <семейство> <ключ>

а также для просмотра всей БД:

database show

В плане набора (dialplan) пишем следующее:


; Вызываем макрос для дозвона по GSM, передавая ему SIP номер абонента как аргумент
exten => _1XXX,n,Macro(dial-mobile,${EXTEN})
….
[macro-dial-mobile]
; Вытаскиваем из БД значение номера для нужного абонента
; и помещаем в его переменную MobNumber
exten => 1,1(mobile),Set(MobNumber=${DB(mobile/${ARG1})})
; Звоним через GSM-модем
exten => 1,n,Dial(Dongle/dongle0/${MobNumber},100,dmghHtT)

Вот в общем-то и всё. 
http://geckich.blogspot.com/

Как перенаправить порт в Windows встроенными средствами

Перенаправление порта (port forwarding, port mapping) может понадобиться, когда у машины PC1 есть доступ в сеть 1 и сеть 2, а у машины PC1 – только в сеть 1, а ей нужно подключиться к какому-то сервису на машине PC3 в сети 2. В таком случае схема будет примерно такая:

В данном примере необходимо на PC2 открыть CMD с правами администратора и выполнить команду:

netsh interface portproxy add v4tov4 listenport=2222 listenaddress=192.168.1.3 connectport=22 connectaddress=192.168.2.5

Чтобы удалить форвардинг – команда:

netsh interface portproxy delete v4tov4 listenport=2222 listenaddress=192.168.1.3

Ссылки:

http://technet.microsoft.com/en-us/library/cc731068(v=ws.10).aspx#BKMK_1

http://geckich.blogspot.com/

Как получить размер свободного дискового пространства точки монтирования в Python (Linux)

Чтобы получить размер свободного пространства для точки монтирования (или размер свободное место на разделе, где находится указанная папка), необходимо выполнить следующее:

import os
st = os.statvfs("/home")
du = st.f_bsize * st.f_bavail
print(du)

Получим значение в байтах, чтобы получить значение, например, в Мб:

du = st.f_bsize * st.f_bavail / 1024 / 1024
http://geckich.blogspot.com/