fsutil file createnew C:testfile.txt 2147483648
Category: System Administration
System administration matters in general
Ошибка после установки Zabbix: Zabbix server is not running: the information displayed may not be current
Zabbix server is not running: the information displayed may not be current
то, здесь обычно 2 варианта:
- самый простой – не запущен или не корректно сконфигурирован демон zabbix-server. Проверьте, совпадают ли номера портов в конфигах zabbix-server (/etc/zabbix/zabbix_server.conf) и zabbix-web (/etc/zabbix/web/zabbix.conf.php), а так же правильно ли настроено подключение к БД.
- если всё в конфигурационных файлах правильно и демон запущен, это скорее всего значит, что вам надо или отключить систему защиты SeLinux совсем или – что будет корректнее – изменить политику доступа к портам системы для демона httpd.
1. Проверим, что проблема действительно в настройках SeLinux:
tail -f /var/log/audit/audit.log |grep -i avc
Должны периодически добавляться в лог строки вроде этой:
Установка и удаление X-сервера для RHEL Linux
В общем, от философии к делу.
Для установки 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”
Использование библиотеки Mechanize в Python для авторизации, отправки веб-форм и скачивания файлов
В данной статье я рассмотрю работу с библиотекой 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))
Ссылки:
- 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/
Регулирование частоты CPU (энергосбережение) в Linux Debian
aptitude install cpufrequtils
Он запустится и по-умолчанию в нем настроен т. н. governor (регулятор) управления частотой ondemand. Регуляторы бывают:
- performance, производительность (по умолчанию). Этот регулятор встроен в ядро и заставляет работать CPU с максимальной скоростью;
- ondemand. Динамически изменяет частоту процессора в зависимости от нагрузки на систему (повышает частоту при достижении 95% нагрузки на текущей частоте);
- conservative. Похоже на регулятор ondemand, разница лишь в том, что повышает частоту при достижении 75% нагрузки на текущей частоте;
- powersave. Выставляет минимальную частоту для процессора;
- userspace. Пользователь выставляет частоту вручную.
Задать регулятор можно в файле /etc/default/cpufrequtils (если его нет, нужно создать), например:
# valid values: userspace conservative powersave ondemand performance
GOVERNOR=”conservative”
Также не забываем включить демона в автозагрузку:
update-rc.d cpufrequtils defaults
Для Gnome 3 shell можно установить дополнение, которое будет показывать в верхней строке состояния текущую частоту и даст возможность менять регулятор “на лету” мышкой.
Заходим сюда – https://extensions.gnome.org/extension/47/cpu-frequency/ и включаем регулятор вверху справа в On.
Этим мы установим дополнение, но активировать его нужно в апплете Advanced Settings (пакет gnome-tweak-tool):
Результат:
Ссылки:
Определение и вызов fabric task в одном Python скрипте
Подробнее о библиотеке можно прочитать на официальном сайте или здесь.
Бывают ситуации, когда необходимо в одном скрипте и объявить таск из библиотеки 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)
Автоматизация скриптов с помощью 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
Строки после комментария:
- Создаем переменную today, присваивая ей первый аргумент, переданный скрипту при запуске.
- Выполняем команду для подключения к sftp, где вместо ${today} интерпретатор вставляет значение даты (переданное скрипту)
- Далее скрипт ждет указанного запроса (prompt) – здесь возможно много вариантов, в т. ч. и таймауты и различные prompt-ы, об этом можно прочитать в мане или в более расширенных статьях.
- Получив указанный выше промпт, посылаем в ответ наш пароль и знак окончания строки (аналог нажатия пользователем [Enter])
- Далее скрипт полностью передает управление пользователю.
Запускать скрипт, понятное дело после chmod o+x, например так:
./get_file.sh 20142902
Минусом изложенного подхода, конечно же, является хранение пароля для sftp в открытом, не зашифрованном виде.
Ссылки:
Установка системы мониторинга Nagios Core 4 на Linux Debian 6
Подробнее про Nagios, различие его редакций и т. д. можно прочитать на официальном сайте проекта.
Планируется установить следующие компоненты:
- Nagios Core,
- Nagios Plugins,
- NRPE,
- Nagios V-Shell (симпатичный фронт-энд для Nagios Core).
Установить можно как из пакетов, так и путём компиляции из исходников. В данной статье использован второй метод, т. к. он обеспечивает инсталляцию наиболее последней версии Nagios, а так же лучшую интеграцию компонентов между собой.
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
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
- Nagios Monitoring Software Editions
- Nagios Core Documentation
- Nagios Frontends
- Nagios V-shell intro pdf
- Nagios Plugins
- NRPE – Nagios Remote Plugin Executor
- Скрипт для установки Nagios Core
- Тема с фиксом для стартовых скриптов Debian
chown-R nagios:nagios /home/nagios
Автодополнение в командной строке Linux
rpm -q ph [TAB][TAB]
php php-gd php-pdo
php-cli php-mbstring php-xml
php-common php-mcrypt
yum install bash-completion
aptitude install bash-completion
Для каких именно команд работает автодополнение – зависит от конкретной системы и установленного на ней софта. Поэтому, чтобы посмотреть список команд:
ls /etc/bash_completion.d
Использование встроенной базы данных AstDB в Asterisk
Предположим, у нас уже настроен 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)
…