Highlighter

вторник, 31 января 2012 г.

XBMC и shutdown. Гнева пост.

Недавно возникла такая ситуация: в xbmc пропала возможность выключать компьютер (остался лишь suspend). Сие меня крайне опечалило и заставило искать решение проблемы. Наиболее распространённым было решение добавить политику для policykit.

/etc/polkit-1/localauthority/50-local.d/custom-actions.pkla
[Actions for me]
Identity=unix-user:1000                                                                               
Action=org.freedesktop.upower.*;org.freedesktop.consolekit.system.*;org.freedesktop.udisks.*
ResultAny=yes
ResultInactive=no
ResultActive=yes
Естественно, вместо 1000 нужен uid или логин пользователя, от чьего имени работает xbmc.
Однако это не помогло.

Каково было моё удивление, когда для решения этой проблемы потребовалось убрать ck-launch-session для запуска. То есть опять пришлось огребать проблемы из-за этого долбанного нестабильного consolekit. То бишь теперь всё запускается из слима командой:

/etc/slim.conf
login_cmd           exec dbus-launch /bin/bash -login ~/.xinitrc %session > ~/.xsession-errors 2>&1

Год назад при выходе 0.4.2 пришлось извращаться, так теперь опять ковыряться и искать причину.
 Господа разработчики основных линуховских подсистем, почему вы так регулярно всё ломаете?!

пятница, 27 января 2012 г.

Выводим список обновлений в gentoo при логине

Давным-давно я наваял скромненький скрипт, который дёргается по крону и проверяет, чего обновилось в системе.

Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите

/usr/local/sbin/update-system-check
#!/bin/bash

LOG_FILE=/var/log/updates
PID_FILE=/var/run/updates.pid

LANG=ru_RU.UTF-8

STRING_FILE_EXIST="Процесс уже запущен. Выход"
STRING_FILE_ALONE="Процесс был некорректно завершён. Перезапуск обновления"
STRING_GOOD="Обновление"

#для того, чтобы работал notify-send
USER="shtsh"

#Создаём лог-файл, если его нету
[ -e $LOG_FILE ] || touch $LOG_FILE && chmod 640 $LOG_FILE && chown root.log $LOG_FILE

#Пишем в PID-файл, качаем файлы и удаляем PID-файл
check_update(){
        ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | awk {'print $2'} > $PID_FILE
                eix-sync > /dev/null
                eix-remote fetch > /dev/null
                emerge -qupDN @world >> $LOG_FILE
                TMP=`grep ebuild $LOG_FILE`
                if [ "x$TMP" != x"" ]
                then
                        # Тут извращаемся и пользователю $USER выводим при помощи notify-send, что обновилось. Так как используется DBUS, то нужно поизвращаться.
                        # Так как я использую KDE, то грепаем процессы по kdeinit для получения параметров DBUS
                        PID=$(pgrep -u $USER kdeinit)
                        DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
                        sudo -u $USER DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS bash -c "notify-send $STRING_GOOD \"`/usr/local/bin/parse.pl html`\""

                fi
        rm -f $PID_FILE
}


if [ -e $PID_FILE ]
# PID-файл есть, проверяем на корректность завершения операции.
then
        process_count=`ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | wc -l`
        if (( $process_count > 2 ))
        then
                # Всё хорошо, другой процесс работает
                echo `date +"%D %A %H:%M"` $STRING_FILE_EXIST >> $LOG_FILE
                exit 1
        else
                # Это единственный процесс, обновляем
                echo `date +"%D %A %H:%M"` $STRING_FILE_ALONE > $LOG_FILE
                check_update
        fi

else
#Файла нету, просто обновляемся
        echo `date +"%D %A %H:%M"` $STRING_GOOD > $LOG_FILE
        check_update
fi

Этот скрипт умеет проверять обновления и посылать уведомления через notify-send, что можно что-то обновить. Для этого используется другой скрипт, написанный на perl (в будущем планирую переделать всё под perl).

/usr/local/bin/parse.pl
#!/usr/bin/perl -w

use strict;

# проверяем аргументы, которые должны быть равны plain или html
# По-умолчанию выводим как plain text
my $output_type="plain";

if (defined(@ARGV)) {
        if (("$ARGV[0]" ne "html") and ("$ARGV[0]" ne "plain")) {
                print "\nUSAGE:\n $0 plain \t for plain text output\n $0 html\t for HTML output\n\n";
                die;
        }
        $output_type=$ARGV[0];
}

open(LOG_FILE,'<','/var/log/updates');

# Выводим список обновлений
while(<LOG_FILE>) {
        /ebuild/;
        if ("$output_type" eq "html") {
                print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
        } else {
                print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
        }
}
Этот скрипт умеет парсить файл, где записано, что обновилось и выводить в HTML для libnotify или plain text.

Теперь осталось засунуть вызов parse.pl в .bashrc. Так же можно использовать cat /var/log/updates. Только смотрите - у меня логи пишутся для группы log (я об этом раньше писал), поэтому, возможно, придётся немножко подправить.

Ну, и для обновления системы я использую следующий скрипт:
#!/bin/bash

LOG_FILE=/var/log/updates

emerge -auDN @world &amp;&amp; [ -e $LOG_FILE ] &amp;&amp; echo "" &gt; $LOG_FILE
revdep-rebuild &gt; /dev/null

Ну, и нужно добавить в /etc/crontab что-то, похожее на это:
5 */3 * * *     root    /usr/local/sbin/update-system-check
Каждые 3 часа будут проверяться обновления.

P.S. Парсер лох. Сейчас буду пытаться исправить.

понедельник, 23 января 2012 г.

Загружаемся с флешки через grub

Пришлось как-то недавно повозиться с ноутбуком, у которого dvd-rom уже начал глючить, а поддержки загрузки с usb флешки или внешнего dvd-rom нету.

Заодно захотелось сделать заявление: "Дорогая Toshiba, я никогда не буду покупать твою продукцию из-за кривых bios и ужасной поддержки linux."

Так вот. На этот ноутбук нужно было поставить арч, а при чтении с диска возникали ошибки. Поэтому пришлось гуглить. И знаете, нагуглилась очень классная штука - plop boot manager.

Plop - менеджер загрузки, который способен грузится почти откуда угодно. Нас же интересует его возможности по загрузке из grub.

Сначала качаем его с официального сайта. Затем находим в архиве файл plpbt.bin и кидаем его в /boot.

После этого добавим запись в меню.

GRUB
title Plop Boot Manager
root (hd0,0)
kernel /boot/plpbt.bin
GRUB2
Создаём файл /etc/grub.d/20_plop
#!/bin/sh
set -e

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib

# older versions of grub2 do not have this yet (LP: #459080)
if [ ! -e ${libdir}/grub/grub-mkconfig_lib ]; then
    echo "no grub-mkconfig_lib, exiting"
    exit 0
fi

. ${libdir}/grub/grub-mkconfig_lib

# We can't cope with loop-mounted devices here.
case ${GRUB_DEVICE_BOOT} in
  /dev/loop/*|/dev/loop[0-9])
    exit 0
  ;;
esac

if test -e /boot/plpbt.bin ; then
  USBBOOTPATH=$( make_system_path_relative_to_its_root "/boot/plpbt.bin" )
  echo "Found plpbt.bin image: $USBBOOTPATH" >&2
  cat << EOF
menuentry "Plop Boot Manager" {
   linux16   $USBBOOTPATH
}

EOF
fi
Взято тут
Затем делаем update-grub и у нас появляется нужный пункт меню, через который можно зайти в Plop.

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

воскресенье, 22 января 2012 г.

Собираем xbmc под gentoo ~amd64

Есть такой очень удобный и красивый медиа-центр xbmc.

Из стандартного репозитория gentoo он уже собираться не хочет, поэтому я перешёл на версию 9999. Однако и он собираться не захотел! Пришлось гуглить. Решение нашлось на гентушном форуме.

Проблема оказалась, что xbmc пока не поддерживает libpng 1.5.

mkdir -p /etc/portage/patches/media-tv/xbmc/ 
cd /etc/portage/patches/media-tv/xbmc/ 
wget http://trac.xbmc.org/raw-attachment/ticket/12001/xbmc-9999-libpng-1.5-fix-plt-trn-get.patch
wget http://trac.xbmc.org/raw-attachment/ticket/12001/xbmc-9999-libpng-1.5.patch
mv xbmc-9999-libpng-1.5.patch xbmc-9999-a-libpng-1.5.patch
Стоит отметить папку /etc/portage/patches. Из неё патчи будут накладывать автоматически при сборке.

пятница, 20 января 2012 г.

Gentoo + KDE + appmenu - nepomuk

Чем хороша Gentoo - в ней можно собрать систему так, как пожелает душа. Вот не нравится мне непомук - его можно выкинуть нафиг. Конечно, Kontaсt, kmail, kopete придётся выкинуть тоже. Но не думаю, что это проблема.

Спасибо megabaks за вдохновение и оверлей.

Сначала выпилим kdepim. Это просто и быстро.

/etc/portage/package.use
net-p2p/ktorrent        -rss
kde-base/plasma-workspace -rss
kde-base/libplasmaclock -holidays
В make.conf в USE добавляем "-semantic-desktop"

Затем смотрим при помощи equery depends, что зависит жёстко от kdepimlibs и удаляем. Если что-то зависит не жёстко, то выставляем нужный USE для пакета. Затем пересобираем мир, делаем emerge --depclean и revdep-rebuild, внимательно читая вывод, чтобы он не поставил kdepim обратно.
UPD. Вообще, без выпиливания kdepim обойтись можно - достаточно убить kontact, и можно будет пользоваться kopete.

Далее ставим что-нибудь приличное для почты и IM (например, thunderbird и pidgin). Теперь заменим систему вывода для Qt на raster. Для этого используем, например, оверлей megabaks'а stuff
layman -a stuff

emerge x11-misc/kcm-qt-graphicssystem
Теперь выбираем в systemsettings в модуле "Qt Graphics System" режим raster.

Теперь вместо тормознутой темы приложений Oxygen поставим настраиваемую и быструю qtcurve.

emerge x11-themes/qtcurve-qt4 x11-themes/gtk-engines-qtcurve
Теперь прикрутим appmenu, но не как в ubuntu, а сделаем кнопочку на оформлении окна.

В USE вставляем флаг appmenu, затем ставим всё, что нужно
emerge x11-misc/appmenu x11-misc/appmenu-gtk x11-misc/appmenu-qt x11-misc/appmenu-firefox kde-misc/oxygen-appmenu x11-misc/lo-menubar

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

четверг, 19 января 2012 г.

Установка JBOSS AS 7 + ajp

Сначала тут должен был быть большой пост с пошаговыми инструкциями, но потом я понял, что если кто-то устанавливает jboss, то он всякие базовые вещи знает и понимает. Поэтому только то, что реально пришлось сделать.

Мне нужно было установить JBOSS в качестве бэкэнда к апачу через ajp, затем что-нибудь задеплоить.

Я поднял контейнер openvz, выделил ему 2 гига ОЗУ и запустил.

Вот, что я ставил:
Debian 6
Apache 2.2.16(from debian repositories)
mod_jk 1.2.30 (from debian repositories)
JDK 1.6.0_26 (from debian repositories)
JBoss AS 7.0.2.Final
OpenAM 9.54


Настройка:
Сразу отмечу, что JBoss я ставил впервые и с ajp пришлось неслабо повозиться. Особенно "приятно", что он отличается от предыдущих версий в качестве настройки и управления, поэтому его я сразу очень полюбил за бурный секс.


Сначала настроим apache.
/etc/apache2/sites-enabled/000-default
<VirtualHost *:80>
        JkMount /* myworker
        ServerAdmin liparinai@gmail.com
        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel debug
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost> 

 /etc/apache2/mods-available/jk.conf
<IfModule mod_jk.c>
# The Jk shared mem location
JkShmFile /var/log/apache2/mod_jk.shm

# Jk logs
JkLogFile /var/log/apache2/mod_jk.log

# Jk loglevel
JkLogLevel error

# Jk logformat
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

# Our workers config
JkWorkersFile /etc/apache2/workers.conf
</IfModule>
 /etc/apache2/workers.conf
worker.list=myworker
worker.myworker.port=8009
worker.myworker.host=127.0.0.1
worker.myworker.type=ajp13
worker.myworker.lbfactor=1
Теперь делаем.
a2enmod jk

и перезапускаем апач.

Теперь настраиваем JBoss.
Установка элементарна - тупо распаковываем, например, в /opt/java. Для удобства, я сделал ссылку на эту папку в /opt/java/jboss

Теперь настройка. Эти вещи слабо гуглятся, в официальных доках с этим проблема.

/opt/java/jboss/standalone/configuration/standalone.xml
(Modifications marked with bold font)

<server name="temporary.ru" xmlns="urn:jboss:domain:1.0">
    <extensions>
            ... skipped ...
    </extensions>

    <system-properties>
        <property name="jvmRoute" value="myworker"/>
    </system-properties>

    ... skipped ...

        <subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host">
            <connector name="http" protocol="HTTP/1.1" socket-binding="http" scheme="http"/>
            <connector name="ajp" protocol="AJP/1.3" socket-binding="ajp" scheme="http"/>
     ... skipped ...
         <socket-binding-group name="standard-sockets" default-interface="public">
                <socket-binding name="http" port="8080"/>
                <socket-binding name="ajp" port="8009"/>
                 <socket-binding name="https" port="8443"/>
... skipped ...

В частности, проблема с jvmRoute, который (по идее) должен был сам подхватиться. Спасибо Sirex'у за то, что дал хороший совет.

Затем можно запускать.
/opt/java/jboss/bin/standalone.sh &.

По-хорошему нужно создать пользователя, сделать его владельцем jboss и от его имени запускать.

Теперь можно задеплоить OpenAM. Читаем руководство, делаем что написано и кидаем в папку /opt/java/jboss/standalone/deployments.

Если нужно, можно настроит балансировку нагрузки и jboss не светит в интернет.

воскресенье, 15 января 2012 г.

Установка Quake2 с улучшенной графикой

Классика... Как много в этом :)
Вот и руки дошли помучать вторую кваку. Вот только это - классика, и вышла игра давно... А система сильно изменилась с того времени. И не факт, что запустится какой-нибудь из гуляющих по интернету движков. Оффициальный-то уже устарел, и графику нормальную выдавать не может :( Но существует в природе куча модифицированных движков, сделанных фанатами. Правда, делали их тоже давно, и придётся для запуска шаманить или компилировать из исходников. Чем мы сейчас и займёмся.

Одним из самых известных сайтов, посвященных разработке на движках quake является Quakedev. А лучшим на данный момент движком является QuDos. Вот его мы и будем собирать.

Сначала идём сюда и качаем исходник
После этого распаковываем и открываем в редакторе Makefile. Там нам нужны следующие строчки


# Client and Renderers
BUILD_QUAKE2?=YES   # Build client (OSS sound, cdrom ioctls for cd audio).
BUILD_DEDICATED?=NO # Build dedicated server.
BUILD_GLX?=YES      # Build OpenGL renderer.
BUILD_SDLGL?=YES    # Build SDL OpenGL renderer.
ifeq ($(OSTYPE),Linux)
BUILD_ALSA_SND?=YES     # Enable support for ALSA (default sound on 2.6 Linux).
endif
BUILD_ARTS_SND?=NO      # Enable support for libaRts (KDE sound system) sound.
BUILD_OSS_SND?=YES      # Enable support for OSS (default) sound.
BUILD_SDL_SND?=YES      # Enable support for SDL sound.

# Mods
BUILD_GAME?=YES     # Build original game modification (game$(ARCH).so).
BUILD_3ZB2?=NO      # Build 3zb2 (bots) modification.
BUILD_CTF?=NO       # Build CTF (Capture The Flag) modification.
BUILD_JABOT?=NO     # Build JABot (bots) modification.
BUILD_ROGUE?=YES        # Build Rogue modification.
BUILD_XATRIX?=YES   # Build Xatrix modification.
BUILD_ZAERO?=YES        # Build Zaero modification.

# Configurable options.
WITH_BOTS?=YES      # Enable Ace Bot support in modifications (Quake2, Rogue, Xatrix and Zaero).
WITH_DATADIR?=NO    # Read from $(DATADIR) and write to "~/.quake2".
WITH_DGA_MOUSE?=NO  # Enable DGA mouse extension.
WITH_GAME_MOD?=YES  # Enable custom addons in the main modification (Quake2, Rogue, Xatrix and Zaero).
WITH_IPV6?=NO       # Enable IPv6 support. Tested on FreeBSD.
WITH_JOYSTICK?=NO   # Enable joystick support.
WITH_LIBDIR?=NO     # Read data and renderers from $(LIBDIR).
WITH_QMAX?=YES      # Enable fancier OpenGL graphics.
WITH_REDBLUE?=NO    # Enable red-blue 3d glasses renderer.
WITH_RETEXTURE?=YES # Enable retextured graphics support.
WITH_X86_ASM?=YES   # Enable x86 assembly code (only for i386).
WITH_XMMS?=NO       # Enable XMMS support (thanks AprQ2).
В них включаем/выключаем те параметры, которые нам нужны/не нужны (а то нафига мне поддержка xmms, которого у меня нету и мне незачем ставить его хедеры и библиотеки). Далее пишем make и ждём, когда соберётся. Если ругается на отсутствие какого-нибудь файла, то ставим соответствующий dev-пакет и повторяем операцию.
Мне потребовалось установить следующие пакеты из того, что у меня не было.
sudo apt-get install xorg-dev libvorbis-dev libsdl-dev
В результате, в папке quake2 появился собранный под мою систему движок игры. Далее с купленного диска игры (если найдёте) в папку baseq2 копируете pak0.pak
Потом нужно туда же скопировать этот файл.
Теперь можно и запускать QuDos. Тут я это сделал и мой монитор ругнулся на некорректное разрешение и пришлось перезапускать иксы. После этого я запускал его так

./QuDos +set vid_fullscreen 0
Теперь у нас есть квака с симпатичными эффектами и кучей плюшек
например, красивые взрывы
aaa10w.th.jpg

или нормальная вода
aaa11.th.jpg

Эффект блюра под водой
aaa16.th.jpg

А теперь идём сюда и качаем пак с текстурами (~300 MiB). Кидаем, естественно, в baseq2. Кстати, там есть ещё дополнительные текстуры с большим разрешением - если готовы качать около 800 Мбайт, то смотрите в разделе Berserker@Quake2.
В результате у нас получается что-то типа этого
aaa12.th.jpgaaa13.th.jpgaaa14.th.jpg

В общем, осталось поискать нормальные высокополигональные модели - и будет всё просто замечательно.







Опубликовано на Welinux.ru