Категории

воскресенье, 25 декабря 2011 г.

Jupiter на Ubuntu 11.10 и исправление проблем с ним.

Jupiter — апплет, разработанный для нетбуков и ноутбуков. Он позволяет переключаться между максимальной/высокой производительностью и энергосберегающим режимом, менять разрешение экрана и ориентацию, включать/отключать bluetooth, тачпад, WiFi и т.д. Если вы владелец нетбука ASUS EeePC, вам будет полезен отдельный пакет, добавляющий поддержку SHE (ASUS Super Hybrid Engine) и ряда тонких настроек EeePC. Но в нем есть одна проблема, при включении/отключении WiFi отображается неверный статус - WIFI Radio Off. Проблема заключается в том, что разработчики программы Jupiter используют неверные пути /sbin/rfkill в скриптах /usr/lib/jupiter/scripts/bluetooth, /usr/lib/jupiter/scripts/wifi чтобы исправить ошибку в Jupiter при работе с Wi-Fi в Ubuntu 11.10 нужно исправить в скриптах пути к rfkill, а лучше заменить /sbin/rfkill на $(which rfkill) - это более универсальный способ и работа скриптов не будет зависеть от версии Linux, либо смириться с текущим положением дел и выполнить в терминале такую команду:
EeePC$ sudo ln -s /usr/sbin/rfkill /sbin/rfkill
Такой вариант пока предпочтительнее, потому как при обновлении скриптов, ваши изменения будут потеряны, и придется все повторить.
Теперь исправляем проблему с файлом /usr/lib/jupiter/scripts/notify. Проблема связана с командой who в Ubuntu 11.10, которая работает несколько иначе, чем в предыдущих выпусках.
Открываем файл /usr/lib/jupiter/scripts/notify и ищем строку:
USER=$(who -u | sed -n '/ (:0[\.0]*)$\| :0 /{s/ .*//p;q}')
Заменяем ее на:
USER=$(users /var/log/wtmp | sed 's| |\n|g' | uniq)
И еще одну строку:
USERCNT=$(who | wc -l)
заменяем на:
USERCNT=$(users /var/log/wtmp | sed 's| |\n|g' | uniq | wc -l)
Открываем еще один файл /etc/acpi/actions/eeepc-actions.sh и ищем строку:
EEE_USER=$(who | sed -n '/ (:0[\.0]*)$\| :0 /{s/ .*//p;q}')
Приводим к такому виду:
EEE_USER=$(users /var/log/wtmp | sed 's| |\n|g' | uniq)
Теперь при отключении Wi-Fi будет отображаться верные статусы:
Очень надеюсь, что разработчики этой программки, исправят ситуацию, и данный прием не нужно будет применять.
Если у вас нетбук Asus EeePC, также установите пакет jupiter-support-eee — необходимо для SHE (Super Hybrid Engine):
EeePC$ sudo apt-get install jupiter-support-eee
Если вы работаете в Unity, после первого запуска Jupiter вам необходимо перезайти, чтобы увидеть иконку апплета в области уведомлений. Конечно, в том случае, если в whitelist не занесен весь системный трей.

суббота, 24 декабря 2011 г.

Список контактов qutim 0.2 в Ubuntu 11.10

У qutim 0.2 в Ubuntu 11.10 Oneric Ocelot есть одна серьезная проблема, при закрытии окна со списком контактов его невозможно вызвать стандартными средствами. Контекстное меню трея панели индикаторов позволяет лишь открыть окно настроек или сменить статус. Опции "показать список контактов" или "Открыть" или чего-либо подобного нету. Контекстное меню открывается одинаковое и по правой, и по левой кнопке мыши.
Фишка в том что qt-приложения в юнити рисуют иконку в трее через dbus и являются уже не обычными иконками в трее, а "индикаторами" гнома, отсюда и проблемы с исчезновениями иконки. Помогает либо перезапуск qutIM, либо стараться не закрывать, а сворачивать список контактов, что весьма неудобно в работе.

Чтобы исправить ситуацию - нужно создать файл ~/.config/sni-qt.conf со следующим содержимым:
[need-activate-action]
qutim=1
После чего придется перезапустить qutim, в контекстном меню появится пункт "Активировать", который будет работать как клик левой кнопкой мыши в обычном трее.

пятница, 23 декабря 2011 г.

Ubuntu 11.10 на EeePC разрешение экрана 1024x600 в меню GRUB2

Как известно в нетбуках EeePC 1000 и им подобным используется чипсет i915, максимальное разрешение матрицы такого нетбука 1024x600. По умолчанию GRUB не умеет работать с таким разрешением, но ситуацию можно исправить, для этого существует специальный модуль GRUB'а 915resolution.mod, с ним и будем работать.
Чтобы установить разрешение экрана в меню GRUB'а 1024x600 на EeePC 1000 и им подобным, выполняем следующее:
Открываем в gedit файл /etc/grub.d/00_header
EeePC$ sudo gedit /etc/grub.d/00_header
Находим кусок кода:
    cat << EOF
if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT_PATH}"` ; then
  set gfxmode=${GRUB_GFXMODE}
  load_video
  insmod gfxterm
EOF
И приводим его к такому виду:
    cat << EOF
if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT_PATH}"` ; then
  # Fix resolution for EeePC: BEGIN
  insmod 915resolution
  915resolution 5c 1024 600
  # Fix resolution for EeePC: END
  set gfxmode=${GRUB_GFXMODE}
  load_video
  insmod gfxterm
EOF

Затем нужно обновить конфигурацию GRUB'a командой:
EeePC$ update-grub
После проделанных манипуляций меню GRUB'а будет иметь разрешение 1024x600.

Если просто загружать модуль 915resolution.mod, то разрешение не будет установлено, так как модуль будет просто загружен, а вот команда GRUB'а 915resolution 5c 1024 600 выполнена не будет, а значит и разрешение не будет установлено, хотя оно станет доступным для ручной установки из командной строки GRUB'а. Способ с загрузкой модуля через конфиг НЕ подходит:
GRUB_PRELOAD_MODULES="915resolution"

Теперь самое время установить фоновую картинку в меню.
Создаем картинку my_image.png размером 1024x600 и сохраняем ее в домашнем каталоге.
Затем в терминале выполняем команды:
EeePC$ sudo mkdir -p "/usr/share/images/desktop-base/"
EeePC$ sudo cp my_image.png "/usr/share/images/desktop-base/desktop-grub.png"
После этих команд картинку из домашнего каталога по желанию можно удалить, это никак не скажется на работе GRUB'a.

P.S. путь до картинки подсмотрел командой:
EeePC$ cat /etc/grub.d/05_debian_theme | grep '.png' | grep 'usr'
if set_background_image "/usr/share/images/desktop-base/desktop-grub.png"; then

Или можно воспользоваться более человечным способом: Добавляем в файл /etc/default/grub:
# Grub Background
GRUB_BACKGROUND=/путь/до/картинки
P.S. Данный способ подошел и для ноутбука HP Compaq 6710b с разрешением 1280x800 и графическим адаптером GM965/GL960
Про /etc/grub.d/40_custom знаю, но вот беда, как пишут тут https://help.ubuntu.com/community/AspireOne/AO751h у меня не заработало. Скорей всего потому, что все необходимые модули для работы видео в GRUB были загружены прежде (как раз то место, где я добавлял строки в /etc/grub.d/00_head), чем сработал скрипт /etc/grub.d/40_custom, т.к. строки из него добавляются в самом конце grub.cfg. Поэтому мой метод наиболее предпочтителен, но при обновлении скрипта /etc/grub.d/00_head потребуется вновь его отредактировать.

четверг, 22 декабря 2011 г.

FreeBSD, Linux узнать внешний ip адрес с консоли.

Бывает необходимость быстро узнать через какой ip выходит в интернет тот или иной сервер к которому вы подключены, ниже приведен простой способ решения данной задачи.
Так как во FreeBSD в стандартной комплектации нет wget, но зато есть fetch, команда будет такой:
server$ echo `fetch -qo - "http://www.whatismyip.org"`

А для Linux подойдет вариант с wget:
server$ echo `wget http://www.whatismyip.org -q -O -`

Еще один вариант с wget, но посложнее:
server$ wget http://checkip.dyndns.org/ -q -O - | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'

четверг, 15 декабря 2011 г.

Ubuntu 11.10 USB HDD NTFS только в режиме чтения

Если при подключении внешнего USB HDD с файловой системой ntfs диск доступен только в режиме чтения, вероятнее всего не установлен пакет ntfs-3g
server$ apt-get -y install ntfs-3g
После этого USB HDD с ntfs на борту будут монтироваться автоматически и в режиме записи.

воскресенье, 11 декабря 2011 г.

Ubuntu и русские man'ы

В Ubuntu есть некоторые маны на других языках.
Все английские маны лежат в каталоге /usr/share/man/man{1..8}. А маны на других языках располагаются в /usr/share/man/ЯЗЫК/man{1..8}. У утилиты man есть ключ -L, которому передается нужный язык.
Почитаем man mc на русском:
server$ man -L ru mc
В репозиториях есть даже специальный пакет manpages-ru, установим его:
server$ sudo apt-get install manpages-ru
Теперь у вас в системе русских man'ов стало больше. :)

Функция вывода цветных сообщений в sh/bash скрипте.

Бывает необходимость в sh скрипте вывести на экран сообщения выделенные цветом, я использую такую функцию:
#!/bin/sh

# Функция вывода цветных сообщений
COLOR_STR() {
 case $2 in
  red) printf %b "\033[1;31m$1\033[0m\n" ;;
  green) printf %b "\033[1;32m$1\033[0m\n" ;;
 esac
}

# Пример вызова функции
COLOR_STR "Красный Текст" red
COLOR_STR "Зеленый Текст" green
COLOR_STR "Зеленый Текст c несколькими     пробелами" green
Конечно же функцию можно дополнить набором своих цветов. Вот небольшой sh скрипт, который выводит всевозможные цвета:
#!/bin/sh

echo
echo 'Table for 16-color terminal escape sequences.'
echo 'Replace ESC with \\033 in sh.'
echo
echo 'Background | Foreground colors'
echo '------------------------------------------------------------------'
bg=40 && while [ $bg -le 47 ]; do
 bold=0 && while [ $bold -le 1 ]; do
  printf %b "\033[0m ESC[${bg}m   | "
  fg=30 && while [ $fg -le 37 ]; do
   if [ $bold = "0" ]; then
    printf %b "\033[${bg}m\033[${fg}m [${fg}m  "
   else
    printf %b "\033[${bg}m\033[1;${fg}m [1;${fg}m"
   fi
   fg=$(($fg+1))
  done
  printf %b "\033[0m\n"
  bold=$(($bold+1))
 done
 echo '------------------------------------------------------------------'
 bg=$(($bg+1))
done


Ссылки по теме: 1. The 256 color mode of xterm
Данный метод работает на Linux в оболочке bash, а также во FreeBSD в оболочке csh.

пятница, 9 декабря 2011 г.

Рекурсивная перекодировка имен файлов и каталогов

Бывает так, что на диске по каким-то причинам файлы и каталоги хранятся не в той кодировке, в которой хотелось бы, sh скрипт, приведенный ниже решает эту проблему.
Чтобы определить из какой кодировки и в какую кодировать можно воспользоваться онлайн сервисом http://www.online-decoder.com/ru или ему подобными.

#!/bin/sh

# Чтобы определить из какой кодировки в какую 
#  кодировать можно воспользоваться онлайн подобным
#  сервисом http://www.online-decoder.com/ru

DIR_PATH='/mnt/volume1/'  # Каталог для обработки
F_CODE='cp1251'    # В какой кодировке хранятся имена файлов
T_CODE='koi8-r'    # В какую кодировку перекодировать имена файлов

# ищем сперва самые "глубокие Директории"
find -d $DIR_PATH -type d | while read dir; do
  if [ -e "$dir" ]; then    # Если такая директория существует, то...
    D_OUT="$(echo "$dir" | iconv -f $F_CODE -t $T_CODE)"
# ВАЖНО Сперва получаем список файлов в самой глубокой директории
#  (ВАЖНО, чтобы она была самой "глубокой")
    ls "$dir" | while read file; do
      F_OUT="$(echo "$file" | iconv -f $F_CODE -t $T_CODE)"
      # Если имена файлов не равны, то переименовываем их
      if [ "$dir" != "$D_OUT" ]; then
        echo "$dir/$file" '->' "$dir/$F_OUT";
        mv "$dir/$file" "$dir/$F_OUT";
      fi
    done
# Если имена каталогов НЕ равны, то можем со
#  спокойной совестью перекодировать каталоги
    if [ "$dir" != "$D_OUT" ]; then
      echo "$dir" '->' "$D_OUT";
      mv "$dir" "$D_OUT";
      echo '------------------------'
    fi
  fi
done

среда, 7 декабря 2011 г.

Экранировка % (процент) и @ (собака) в /etc/crontab

Если задумали использовать в файле /etc/crontab символы "%" и "@", то придется их экранировать символом "\".
Например, если вам нужно, чтобы создавался файл с датой в названии, то строка crontab будет выглядеть следующим образом:
...
* * * * * root touch "/tmp/$(date "+\%Y.\%m.\%d_\%H-\%M-\%S").time"
Спустя минуту получаем:
server# ls /tmp | grep 'time'
2011.12.07_23-47-00.time
А в логах видим, что наша команда корректно выполнялась:
server# tail /var/log/cron | grep /tmp
Dec  7 22:47:00 mail_send /usr/sbin/cron[47606]: (root) CMD (touch "/mnt/e-mail/$(date "+%Y.%m.%d_%H-%M-%S").time")

вторник, 6 декабря 2011 г.

Исправляем проблемы с зимним/летним временем во FreeBSD

Для начала проверяем расписание перевода часов на 2011 год:
server# zdump -v /etc/localtime | grep 2011
/etc/localtime  Sat Mar 26 18:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 KRAT isdst=0 gmtoff=25200
/etc/localtime  Sat Mar 26 19:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 KRAST isdst=1 gmtoff=28800
/etc/localtime  Sat Oct 29 18:59:59 2011 UTC = Sun Oct 30 02:59:59 2011 KRAST isdst=1 gmtoff=28800
/etc/localtime  Sat Oct 29 19:00:00 2011 UTC = Sun Oct 30 02:00:00 2011 KRAT isdst=0 gmtoff=25200
Если видим только первые две строки, команды переводить часы 30 октября отсутствуют, значит, база часовых поясов актуальна.
Но если все-таки у вас 4 строчки, то читаем дальше как обновить базу часовых поясов:
Обновляем порты и устанавливаем порт zoneinfo:
server# portsnap fetch update
server# cd /usr/ports/misc/zoneinfo && make deinstall
server# make install clean
В случае успешной установки, двигаемся дальше.
Можно выбрать часовой пояс с помощью установочного меню (sysinstall -> configure -> Time Zone):
tzsetup
А можно скопировать файл нужного пояса вручную, предварительно зарезервировав старый:
server# mv /etc/localtime /etc/localtime.old
server# cp /usr/share/zoneinfo/Asia/Krasnoyarsk /etc/localtime
Проверяем:
server# zdump -v /etc/localtime | grep 2011
/etc/localtime  Sat Mar 26 18:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 KRAT isdst=0 gmtoff=25200
/etc/localtime  Sat Mar 26 19:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 KRAT isdst=0 gmtoff=28800
Если видим две строки, инструкции переводить часы 30 октября отсутствуют, база обновлена успешно.
Чтобы изменения вступили в силу для всех программ, их нужно будет перезапустить.
Обязательно обновите /etc/localtime в chroot-окружениях и крайне важно не забыть перезапустить демона cron:
server# /etc/rc.d/cron restart
Stopping cron.
Starting cron.
Ссылки:
1. OpenNet: Ручная настройка отмены перехода на зимнее время в Unix-подобных ОС
2. OpenNet: Отмена перехода на зимнее время в PostgreSQL

P.S. Из-за этого "отставания" системных часов, может перестать работать ntp сервер времени. Для исправления этой проблемы, придется проделать следующее:
1. Остановить сервер NTP:
/etc/rc.d/ntpd stop
2. Выполнить обновление базы часовых поясов 3. На всякий случай вручную синхронизировать время командой:
ntpdate 0.ru.pool.ntp.org
4. Теперь можно запустить сервер NTP:
/etc/rc.d/ntpd start

Следует иметь ввиду, что до тех пор, пока в /usr/src содержатся устаревшие данные, то при пересборке мира следует указывать MK_ZONEINFO="no" в файле /etc/make.conf, в противном случае файлы содержащиеся в /usr/share/zoneinfo, установленные из порта /usr/ports/misc/zoneinfo будут заменены содержащимися в дереве исходных кодов, т.е. устревшими.

пятница, 2 декабря 2011 г.

watch в FreeBSD и watch в Linux разные вещи

watch во FreeBSD позволяет наблюдать за происходящим в консоли у других пользователей. Например, в системе есть 2 пользователя user и admin. Admin подключается по ssh, и смотрит кто авторизован с системе:
FreeBSD@admin# w
21:16  up  1:39, 2 users, load averages: 0,00 0,00 0,00
USER             TTY      FROM          LOGIN@   IDLE WHAT
user            pts/0    192.168.4.1    20:22       4 more
admin           pts/2    192.168.4.2    21:08       - w
Видно, что в системе авторизованы 2 пользователя, у user выполняется команда more, а у admin выполняется команда w (who). Если теперь пользователь admin введет команду:
FreeBSD@admin# watch pts/0
Где pts/0 имя терминала, за которым хотим наблюдать. В результате пользователь admin будет видеть все происходящее в консоли пользователя user в режиме реального времени (некое подобие R-admin или TeamViewer, только для консоли), будет видно даже то, как набираются команды пользователем user.
Чтобы выйти из наблюдения нужно нажать комбинацию клавиш Ctrl+G.

watch в Linux - Периодическое выполнение команды.
Пример:
user@user-Ubuntu-11:~$ watch -n 5 df -h
'-n 5' - выполнять команду раз в 5 секунд.
'df -h' - команда, которая будет выполняться.

Если хотите такую же функциональность watch из Linux во FreeBSD, то потребуется установить из портов cmdwatch
FreeBSD@admin# cd /usr/ports/sysutils/cmdwatch
FreeBSD@admin# make install clean && rehash
После чего можно использовать cmdwatch
FreeBSD@admin# cmdwatch -n 5 df -h
Более подробно man watchman cmdwatch

Для работы данной утилиты потребуется модуль ядра snp.ko, и если этот модуль ядра не будет загружен, то при попытке использования команды w (who) в jail, получите сообщение об ошибке, для решения данной проблемы потребуется прописать автоматическую загрузку данного модуля
FreeBSD# echo 'snp_load="YES"' >> /boot/loader.conf

понедельник, 28 ноября 2011 г.

Удалить SUBSCRIBE TO: POSTS (ATOM)

Открываем в панели управления блогом вкладку Дизайн -> Изменить HTML
ВАЖНО! Поставьте галочку [v] "Расширить шаблоны виджета"
Найдите в коде блок:
<b:if cond='data:blog.pageType != "item"'> <!-- Blog feed links -->
<b:if cond='data:feedLinks'>
<div class='blog-feeds'>
<b:include data='feedLinks' name='feedLinksBody'/>
</div>
</b:if>

Удалите линию:
<b:include data='feedLinks' name='feedLinksBody'/>
Это удалит "Posts (Atom)".

Сменить "имя" и MAC (HWaddress) на FreeBSD

Чтобы сменить системное имя интерфейса и MAC адрес на FreeBSD нужно в блоке с описанием сетевых интерфейсов в файле /etc/rc.conf добавить строки:

....
# External interface
ifconfig_re0_name="ext0" # Меняем имя интерфейса
ifconfig_ext0="ether 00:11:22:33:44:55" # Меняем MAC адрес
ifconfig_ext0_alias0="inet 1.2.3.4/24" # Присваиваем Ip адрес и маску
...
Чуть позже выложу шаблон /etc/rc.conf

Asterisk + pf + NAT

Настройка пакетного фильтра PF для проброса SIP-телефонов или работа Asterisk через NAT.
Чтобы Asterisk за NAT работал корректно, нужно отдельное правило трансляции адресов с опцией static-port и проброс (rdr) 5060 порта, чтобы pf NAT не подменял UDP порт (получится так называемый SIP ALG).
Так как сессии у Asterisk похоже проходят по IP+UDP port, а обычный pf NAT, изменяет порт, отсюда и все проблемы.
Для машин с SIP устройствами за NAT используем следующие настройки пакетного фильтра /etc/pf.conf:
#!/bin/sh

# переменные
ext_if = "em0"
int_if = "re0"
int_net = "192.168.1.0/24"
ipphone1 = "192.168.1.200"
sip_server = "192.168.1.4"


##### 1. Настройки
# Вернет ошибку, порт заблокирован
set block-policy return

# тайм-аут UDP сессии должен быть равен или больше, чем время регистрации SIP 
# Таймер тайм-аута. Обычно достаточно 300 секунд.
set timeout { udp.first 300, udp.single 150, udp.multiple 900 }

# Игнорируем петлевой интерфейс
set skip on lo

# Собираем все части фрагментированного пакета перед отправкой (Нормализуем входящий трафик)
scrub in all

# Для каждого SIP устройства свое правило трансляции nat.
# Параметр static-port нужен для сохранения временного порта UDP.
# Это нужно чтобы удаленный SIP сервер знал к какой сессии привязан наше SIP устройство или Asterisk.
nat on $ext_if inet proto udp from $ipphone1 to any -> ($ext_if) static-port

# Так называемый SIP-ALG
nat on $ext_if inet proto udp from $sip_server to any -> ($ext_if) static-port
rdr on $ext_if inet proto udp from any to ($ext_if) port 5060 -> $sip_server

# Правило NAT для остальных устройств локальной сети
nat on $ext_if from $int_net to any -> ($ext_if)

#### 2. Правила фильтрации
# Разрешим все отовсюду
pass all
Теперь Asterisk будет "видеть" удаленный сервер, будет проходить на нем регистрацию, а главное абоненты будут друг-друга слышать.
В данном кофиге не рассматривались правила фильтрации, очереди и прочее, тут важно было показать как настроить pf NAT и rdr, так, чтобы Asterisk заработал за NAT'ом и показать реализацию SIP ALG средствами pf. Конфигурация была протестирована на Asterisk 1.8, думаю SIP телефоны будут работать так же без особых проблем.

P.S. На всякий случай небольшая справка по pfctl:
Очистить таблицы состояний:
pfctl -F state
Проверка правил:
pfctl -s rules -v


Ссылки по теме:
1. Блог пользователя argo - SIP через NAT
2. Opennet - Настройка пакетного фильтра PF для проброса SIP-телефонов через NAT
3. OpenBSD Pf Firewall "how to" (pf.conf)
4. OpenBSD pf and Voice over IP
5. doc.pfsense.org - Static-Port