Удаление ненужных переводов (translations) при обновлении пакетов в Debian 7 Wheezy

Если вы обновляя список пакетов в Debian 7 Wheezy каждый раз видите скачивание переводов (Translation) для кучи языков – а это занимает лишнее время – то исправить это можно командой:

rm -r /var/lib/apt/lists/*Translation*
http://geckich.blogspot.com/

Linux подмена src для TCP/IP пакетов без использования iptables

Допустим, у нас есть два IP адреса на физической карточке (второй настроен как alias) – 192.168.1.2 и 192.168.1.3.

По умолчанию для подсети 192.168.2.0/24 пакеты идут через интерфейс 192.168.1.2, но мы хотим, чтобы поле src пакетов для определенного dst (в нашем примере – это хост 192.168.2.10) было 192.168.1.3.

Для этого не применяя iptables (который работает на сетевом уровне (Network Layer) модели OSI), можно применить команду ip route, которая всё сделает быстрее, на Link Layer’e:

ip route add 192.168.2.10/32 via 192.168.2.1 dev eth0 src 192.168.1.3

http://geckich.blogspot.com/

Решение проблем с зависимостями при локальной установке пакета в Debian

Допустим, есть у нас пакет .deb и мы хотим его установить.
Но dpkg не сможет удовлетворить зависимости. Чтобы сделать это, пробуем установку:

dpkg -i somepackage.deb

dpkg выругается наподобии такого:
dpkg: error processing somepackage (–install): 
 dependency problems – leaving unconfigured 
Errors were encountered while processing:
 somepackage

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

apt-get install -f
Теперь снова повторяем установку .deb-пакета:
dpkg -i somepackage.deb

Теперь пакет должен установиться, если зависимости были удовлетворены.
http://geckich.blogspot.com/

PostgreSQL как посмотреть, где хранятся файлы БД на Linux-машине

Тема на 5 минут. Если сервер настраивался не вами, то бывает сразу сложно разобраться, где лежат файлы БД PostgreSQL, т. к. их расположение может быть настроено отличным, от по-умолчанию, образом.

Поможет в этом следующая консольная команда:

ps auxw | grep postgres | grep — -D

в итоге, мы получим  нечто на подопбии такого:
postgres 12917  0.0  0.1 118783 60648 ?        S    Jul27   0:01 /usr/pgsql-9/bin/postgres -D /data/postgres-9
Вот после опции -D и указан каталог, в котором лежат файлы БД (обычно в подпапке base).
http://geckich.blogspot.com/

Решение проблемы с извлечением дисков в Linux

Если привод компакт-дисков не реагирует на нажатие кнопки извлечения, то следует открыть консоль и попробовать выполнить следующую команду от root или с sudo:

eject /dev/cdrom

Если, при этом выдаётся следующая ошибка:

eject: unable to eject, last error: Inappropriate ioctl for device

То нужно попробовать следующую последовательность команд:

file /dev/sr0

должна выдать такой результат:
/dev/sr0: sticky block special
Далее:
eject -i off

После этого диск должен извлечься при нажатии кнопки на дисководе.
Ссылки:
http://geckich.blogspot.com/

Vino – стандартный VNC-сервер многих Linux-дистрибутивов или как настроить удаленный доступ на свой Linux

Недавно столкнулся с проблемой неработоспособности удаленного рабочего стола в Linux Debian. По-умолчанию за подключение удаленно к рабочему столу по протоколу VNC отвечает демон vino.

Конфигурационных файлов в /etc он не имеет, в init.d его тоже нет. Чтобы его настроить делаем следующее:

1. Нужно дописать опцию Enable=true в секции “xdmcp” конфига /etc/gdm3/daemon.conf для Gnome 3.

2. Заходим в консоль под нашим десктопным пользователем и вызываем окно настроек Vino:

vino-preferences

Откроется окно вроде такого:

Где указываем отмечаем галочки и устанавливаем пароль.
Также в опции vino можно зайти через апплет Desktop Sharing или Remote Desktop (смотря какой дистрибутив).

Если отметить опцию Configure network automatically to accept connections, то vino будет открывать порт на роутере (если там разрешен UPnP) 5900 наружу, в Интернет, что обычно не желательно.

3. Запускаем собственно демона:

export DISPLAY=:0.0
xhost +/usr/lib/vino/vino-server &
netstat -nl | grep 5900
Последняя команда служит для проверки того, что vino запустился и слушает порт 5900.

4. Теперь с другой машины, которая имеет доступ к нашей пробуем подключиться (для Windows это можно сделать при помощи бесплатных программ TightVNC или UltraVNC).

Настройки по-умолчанию должны сработать.

5. Теперь проблема в том, что vino не стартует со стартом системы и не имеет скрипта запуска. И стартовать он должен с тем пользователем, на который планируется удалённый вход. Для этого нужно добавить в файл /home/username/.bashrc в конец следующие строчки:

export DISPLAY=:0.0
/usr/lib/vino/vino-server &

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

UPDATE:

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

export DISPLAY=:0.0
ps cax | grep vino-server > /dev/null
if [ $? -ne 0 ]; then
  /usr/lib/vino/vino-server &
fi

Ссылки:

  1. http://debian-handbook.info/browse/wheezy/sect.remote-login.html
  2. http://ubuntuforums.org/showthread.php?t=266981&s=bdce9ca764aeb4ff4abf932220541d93
  3. http://stackoverflow.com/questions/9117507/linux-unix-command-to-determine-if-process-is-running
http://geckich.blogspot.com/

Ошибка после установки Zabbix: Zabbix server is not running: the information displayed may not be current

Если вы установили серверную часть системы мониторинга Zabbix на системах RHEL (Oracle Linux, RedHat, CentOS) и вроде бы всё правильно, но в веб-интерфейсе вылазит ошибка
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

Должны периодически добавляться в лог строки вроде этой:

type=AVC msg=audit(1395664684.460:297): avc:  denied  { name_connect } for  pid=3078 comm=”httpd” dest=10051 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:zabbix_port_t:s0 tclass=tcp_socket
а команда:
getsebool -a | grep zabbix
должна в таком случае дать результат:
zabbix_can_network –> off
Изменим политику для httpd:
setsebool -P httpd_can_network_connect on
Проверяем:
getsebool httpd_can_network_connect
Результат должен быть следующий:
httpd_can_network_connect –> on
Теперь веб-интерфейс Zabbix должен нормально подключаться к серверу через порт 10051 (по-умолчанию) и ошибка исчезнет.
http://geckich.blogspot.com/

Установка и удаление 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/