Обновление Debian Lenny до Squeeze

Решился я таки проапдейтить свою десктопную тачку (“тачка на прокачку” ? 🙂 ) с lenny на squeeze.

Первое что нужно сделать до апгрейда –  проверить что с системой и пакетами все впорядке и нет неразрешенных зависимостей.

aptitude update && aptitude -f install

Если все нормально получаем нечто такого:

# aptitude update
Hit http://ftp2.debian.org.ua lenny Release.gpg
Ign http://ftp2.debian.org.ua lenny/main Translation-en_US
Ign http://ftp2.debian.org.ua lenny/non-free Translation-en_US
Ign http://ftp2.debian.org.ua lenny/contrib Translation-en_US
Hit http://ftp2.debian.org.ua lenny/updates Release.gpg
Ign http://ftp2.debian.org.ua lenny/updates/main Translation-en_US
Ign http://ftp2.debian.org.ua lenny/updates/contrib Translation-en_US
Ign http://ftp2.debian.org.ua lenny/updates/non-free Translation-en_US
Hit http://ftp2.debian.org.ua lenny/volatile Release.gpg
Ign http://ftp2.debian.org.ua lenny/volatile/main Translation-en_US
Ign http://ftp2.debian.org.ua lenny/volatile/contrib Translation-en_US
Ign http://ftp2.debian.org.ua lenny/volatile/non-free Translation-en_US
Hit http://ftp2.debian.org.ua lenny Release
Hit http://ftp2.debian.org.ua lenny/updates Release
Hit http://ftp2.debian.org.ua lenny/volatile Release
Ign http://ftp2.debian.org.ua lenny/main Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/non-free Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/contrib Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/main Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/non-free Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/contrib Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/main Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/contrib Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/non-free Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/main Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/contrib Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/non-free Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/volatile/main Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/volatile/contrib Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/volatile/non-free Packages/DiffIndex
Hit http://ftp2.debian.org.ua lenny/main Packages
Hit http://ftp2.debian.org.ua lenny/non-free Packages
Hit http://ftp2.debian.org.ua lenny/contrib Packages
Hit http://ftp2.debian.org.ua lenny/main Sources
Hit http://ftp2.debian.org.ua lenny/non-free Sources
Hit http://ftp2.debian.org.ua lenny/contrib Sources
Hit http://ftp2.debian.org.ua lenny/updates/main Packages
Hit http://ftp2.debian.org.ua lenny/updates/contrib Packages
Hit http://ftp2.debian.org.ua lenny/updates/non-free Packages
Hit http://ftp2.debian.org.ua lenny/updates/main Sources
Hit http://ftp2.debian.org.ua lenny/updates/contrib Sources
Hit http://ftp2.debian.org.ua lenny/updates/non-free Sources
Hit http://ftp2.debian.org.ua lenny/volatile/main Packages
Hit http://ftp2.debian.org.ua lenny/volatile/contrib Packages
Hit http://ftp2.debian.org.ua lenny/volatile/non-free Packages
Reading package lists… Done

# aptitude -f install
Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Reading task descriptions… Done
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0B of archives. After unpacking 0B will be used.
Writing extended state information… Done
Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Reading task descriptions… Done

Убедились, что текущая версия обновлена и не имеет проблем с пакетами и их  зависимостями. Теперь в файле /etc/apt/sources.list  заменим где встречается lenny на squeeze.

# cat /etc/apt/sources.list
deb http://ftp2.debian.org.ua/debian/ squeeze main non-free contrib
deb-src http://ftp2.debian.org.ua/debian/ squeeze main non-free contrib

deb http://ftp2.debian.org.ua/debian-security/ squeeze/updates main contrib non-free
deb-src http://ftp2.debian.org.ua/debian-security/ squeeze/updates main contrib non-free

обновляем списки пакетов:

# aptitude update

Теперь нужно поставить новые версии apt, dpkg и aptitude

# aptitude install apt dpkg aptitude
Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Reading task descriptions… Done
The following packages are BROKEN:
apt-utils libapt-pkg-perl
The following packages will be upgraded:
apt aptitude dpkg libept0
The following packages are RECOMMENDED but will NOT be installed:
aptitude-doc-cs aptitude-doc-en aptitude-doc-fi aptitude-doc-fr aptitude-doc-ja libparse-debianchangelog-perl
4 packages upgraded, 0 newly installed, 0 to remove and 802 not upgraded.
Need to get 7048kB of archives. After unpacking 471kB will be freed.
The following packages have unmet dependencies:
libapt-pkg-perl: Depends: libapt-pkg-libc6.9-6-4.7 which is a virtual package.
apt-utils: Depends: libapt-pkg-libc6.9-6-4.7 which is a virtual package.
The following actions will resolve these dependencies:

Remove the following packages:
libperl-dev

Upgrade the following packages:
apt-utils [0.7.21 (now) -> 0.7.23.1 (testing)]
libapt-pkg-perl [0.1.23 (now) -> 0.1.24 (testing)]
libperl5.10 [5.10.0-22 (now) -> 5.10.0-25 (testing)]
perl [5.10.0-22 (now) -> 5.10.0-25 (testing)]
perl-base [5.10.0-22 (now) -> 5.10.0-25 (testing)]
perl-modules [5.10.0-22 (now) -> 5.10.0-25 (testing)]

Score is 419

Accept this solution? [Y/n/q/?] Y
The following packages will be REMOVED:
libperl-dev{a}
The following packages will be upgraded:
apt apt-utils aptitude dpkg libapt-pkg-perl libept0 libperl5.10 perl perl-base perl-modules
The following packages are RECOMMENDED but will NOT be installed:
aptitude-doc-cs aptitude-doc-en aptitude-doc-fi aptitude-doc-fr aptitude-doc-ja libparse-debianchangelog-perl
10 packages upgraded, 0 newly installed, 1 to remove and 795 not upgraded.
Need to get 16.6MB of archives. After unpacking 5968kB will be freed.
Do you want to continue? [Y/n/?] Y
Writing extended state information… Done
Get:1 http://ftp2.debian.org.ua squeeze/main dpkg 1.15.3.1 [2164kB]
Get:2 http://ftp2.debian.org.ua squeeze/main perl-modules 5.10.0-25 [3199kB]
Get:3 http://ftp2.debian.org.ua squeeze/main perl 5.10.0-25 [4512kB]
Get:4 http://ftp2.debian.org.ua squeeze/main libperl5.10 5.10.0-25 [620kB]
Get:5 http://ftp2.debian.org.ua squeeze/main perl-base 5.10.0-25 [968kB]
Get:6 http://ftp2.debian.org.ua squeeze/main apt-utils 0.7.23.1 [193kB]
Get:7 http://ftp2.debian.org.ua squeeze/main libept0 0.5.29 [208kB]
Get:8 http://ftp2.debian.org.ua squeeze/main aptitude 0.4.11.11-1+b2 [3034kB]
Get:9 http://ftp2.debian.org.ua squeeze/main libapt-pkg-perl 0.1.24 [87.6kB]
Get:10 http://ftp2.debian.org.ua squeeze/main apt 0.7.23.1 [1642kB]
Fetched 16.6MB in 3min 0s (92.3kB/s)
(Reading database … 148233 files and directories currently installed.)
Removing libperl-dev …
(Reading database … 148237 files and directories currently installed.)
Preparing to replace dpkg 1.14.26 (using …/dpkg_1.15.3.1_i386.deb) …
Unpacking replacement dpkg …
Processing triggers for man-db …
Setting up dpkg (1.15.3.1) …
Installing new version of config file /etc/logrotate.d/dpkg …
(Reading database … 148232 files and directories currently installed.)
Preparing to replace perl-modules 5.10.0-22 (using …/perl-modules_5.10.0-25_all.deb) …
Unpacking replacement perl-modules …
Preparing to replace perl 5.10.0-22 (using …/perl_5.10.0-25_i386.deb) …
Unpacking replacement perl …
Preparing to replace libperl5.10 5.10.0-22 (using …/libperl5.10_5.10.0-25_i386.deb) …
Unpacking replacement libperl5.10 …
Preparing to replace perl-base 5.10.0-22 (using …/perl-base_5.10.0-25_i386.deb) …
Unpacking replacement perl-base …
Processing triggers for man-db …
Setting up perl-base (5.10.0-25) …
(Reading database … 148235 files and directories currently installed.)
Preparing to replace apt-utils 0.7.21 (using …/apt-utils_0.7.23.1_i386.deb) …
Unpacking replacement apt-utils …
Preparing to replace libept0 0.5.26+b1 (using …/libept0_0.5.29_i386.deb) …
Unpacking replacement libept0 …
Preparing to replace aptitude 0.4.11.11-1+b1 (using …/aptitude_0.4.11.11-1+b2_i386.deb) …
Unpacking replacement aptitude …
Preparing to replace libapt-pkg-perl 0.1.23 (using …/libapt-pkg-perl_0.1.24_i386.deb) …
Unpacking replacement libapt-pkg-perl …
Preparing to replace apt 0.7.21 (using …/archives/apt_0.7.23.1_i386.deb) …
Unpacking replacement apt …
Processing triggers for man-db …
Processing triggers for menu …
Setting up apt (0.7.23.1) …
Installing new version of config file /etc/cron.daily/apt …
gpg: key 6070D3A1: “Debian Archive Automatic Signing Key (4.0/etch) <ftpmaster@debian.org>” not changed
gpg: key ADB11277: “Etch Stable Release Key <debian-release@lists.debian.org>” not changed
gpg: key BBE55AB3: “Debian-Volatile Archive Automatic Signing Key (4.0/etch)” not changed
gpg: key F42584E6: “Lenny Stable Release Key <debian-release@lists.debian.org>” not changed
gpg: key 55BE302B: “Debian Archive Automatic Signing Key (5.0/lenny) <ftpmaster@debian.org>” not changed
gpg: key 6D849617: “Debian-Volatile Archive Automatic Signing Key (5.0/lenny)” not changed
gpg: Total number processed: 6
gpg: unchanged: 6
Setting up libperl5.10 (5.10.0-25) …
Setting up apt-utils (0.7.23.1) …
Setting up libept0 (0.5.29) …
Setting up aptitude (0.4.11.11-1+b2) …
Setting up libapt-pkg-perl (0.1.24) …
Setting up perl-modules (5.10.0-25) …
Setting up perl (5.10.0-25) …
Processing triggers for menu …
localepurge: Disk space freed in /usr/share/locale: 12488K
localepurge: Disk space freed in /usr/share/man: 444K

Total disk space freed by localepurge: 12932K

Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Writing extended state information… Done
Reading task descriptions… Done

Current status: 795 updates [-11].

Все что нужно было, aptitude сделал сам. Теперь, собственно, делаем апгрейд всей системы

# aptitude full-upgrade

В процессе обновления возникнут проблемы с зависимостями, которые решаются подтверждением обновления версии. Так же будут установлены новые пакеты.

Как восстановить сохраненный пароль в kopete

Для восстановления сохраненного пароля в kopete для jabber-аккаунта  можно воспользоваться следующим кодом на питоне:

from ConfigParser import ConfigParser
import sys
from kdecore import KStringHandler
config = ConfigParser()
config.read(".kde/share/config/kopeterc")
cryptedpass = config.get("Account_JabberProtocol_" + sys.argv[1], 'Password')
print KStringHandler().obscure(cryptedpass.decode('utf-8'))

Сохраняем код в файле ~/getpass.py и затем выполняем его:

# python ./getpass.py userid@jabber.org

В итоге получаем расшифрованный пароль для аккаунта 🙂

Если в скрипте заменить Account_JabberProtocol_ на Account_ICQProtocol_ то можно вытянуть из конфига kopete пароль от icq

Код нашел на этом блоге.

Для KDE4 код такой:

from ConfigParser import ConfigParser
import sys
from PyKDE4.kdecore import *
config = ConfigParser()
config.read('./kopeterc')
cryptedpass = config.get('Account_JabberProtocol_' + sys.argv[1], 'Password')
print KStringHandler.obscure(cryptedpass.decode('utf-8'))

Этот код для KDE4 любезно предоставил Lex

Создание полной копии hdd средствами nc и dd

Попросили рассказать как сохранить копию hdd в линуксе по сети.
Вот, рассказываю 🙂

Создание полной копии винта (именно винта, а не раздела).

Что нужно: два компа, сеть, LiveCD или LiveFlash
Допустим, нужна полная копия винта с компа “comp1” этот комп имеет ip 192.168.0.1
Комп, куда мы сохраняем копию имеет адрес 192.168.0.3 и назовем его “backup”.

Итак, на “backup”-e набираем в консоли:
# nc -l -p 5000 | gzip -5 -c > ./my_good_hdd_copy.img.gz

На comp1:
Грузимся с livecd, открываем консоль и набираем:
# dd if=/dev/sda | nc -w 10 192.168.0.3 5000

Ждем некоторое время. После завершения на бакаповом компе будет полная упакованная копия указанного винта.

/dev/sda – винт, копию которого хочется сохранить (/dev/hda /dev/sdb и т.д.)
5000 – порт на которым будем принимать данные с comp1 (можно любой указать)

Восстановление полной копии.
На компе, где хотим восстановить копию винта:
Опять же грузимся с liveCD и набираем:
# nc -l -p 8000 | dd of=/dev/sda

на “backup”-e :
zcat ./my_good_hdd_copy.img.gz | nc 192.168.0.1 8000

Ждем… по завершению копия будет восстановлена.

Поскольку операция необратима, нужно быть внимательным при восстановлении копии – вся информация будет *удалена* с того винта куда делаем dd

hint: чтобы наблюдать что происходит при копировании, открываем вторую консоль и там набираем:
# watch -n 30 killall -SIGUSR1 dd

на первую консоль будет выводиться раз в 30 сек информация сколько данных уже скопировано.

Несколько сумбурно, но надеюсь принцип понятен 🙂

Nginx как проксирующий фронт-енд к Apache #2

В продолжение темы о связке nginx + apache + directadmin решил все же написать хоть что то 🙂

Данная фича писалась “на коленке” и никоим образом не претендует на полноценное и законченное решение, однако на протяжении года проработало на shared-хостинге, обслуживая более 1000 доменов.

Суть заключается в том, что nginx полностью отвечает за отдачу всей статики (картинки, архивы, файлы стилей и т.д.), а апач занимается обработкой скриптов. Для снижения нагрузки апач не ведет access_log (только error_log),  логи так же ведет nginx. За SSL тоже отвечает nginx.

nginx выступает в роли фронт-енда, в то время как апач – в роли бек-енда. nginx слушает внешние IP адреса, апач – только один, например, 127.0.0.1:80

Read more Nginx как проксирующий фронт-енд к Apache #2

Как разрешить обновить страницу только один раз

Here is a small piece of code that allows to reload a page only once. This is necessary to prevent some data being cached and this is the only solution I found good for my needs. Meta tag nocache did not save me, and meta tag refresh does not allow to refresh the page only once. So here is the code:

<script>
var reloaded = false;
var loc=””+document.location;
loc = loc.indexOf(”?reloaded=”)!=-1?loc.substring(loc.indexOf(”?reloaded=”)+10,loc.length):””;
loc = loc.indexOf(”&”)!=-1?loc.substring(0,loc.indexOf(”&”)):loc;
reloaded = loc!=””?(loc==”true”):reloaded;

function reloadOnceOnly() {
if (!reloaded)
window.location.replace(window.location+”?reloaded=true”);
}
reloadOnceOnly();
</script>

I found this in Google, but I had to spend some hours before I did it. So I think this article will be helpful for you.

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

Бывают случаи, когда нужно перенаправить весь трафик с одного сайта на другой. Однако структура сайтов различна и необходимо перенаправить посетителей с www.site-1.com на главную страницу www.site-2.com, но при этом не передавать параметры запроса в адресной строке.
Например, посетитель пришел по ссылке www.site-1.com/index.php?f=12&as=23 при этом редирект установлен на www.site-2.com. При обычном перенаправлении, параметр f=12&as=23 так же будет передан.
Чтобы этого избежать, необходимо создать два файла в корне site-1.com.
файл .htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ http://www.site-1.com/redirect.php


Данные директивы указывают перенаправлять весь трафик на php-скрипт redirect.php
Создадим файл redirect.php и напишем внутри:
<?php
header ("Location: http://www.site-2.com");
?>

В результате мы получаем “чистый” редирект с site-1.com на site-2.com без параметров в запросе

Exim + greylist

I want to share how i reduce spam in my box.

Maybe not perfect solution but  works 🙂
Always make backup and use it at your own risk !

Tested on CentOS 5

Install Greylist:

# rpm -Uvh http://dl.atrpms.net/el5-i386/atrpms/stable/greylistd-0.8.3.2-8.0.el5.noarch.rpm

Now you need to change permissions:

# chown -R mail.mail /etc/greylistd/
# chown -R mail.mail /var/run/greylistd/
# chown -R mail.mail /var/lib/greylistd/
# chown -R mail.mail /usr/sbin/greylist*

start greylistd:

# /usr/bin/su mail -c /usr/sbin/greylistd &

I use original SpamBlocker2 (thanks to Jeff )

######################################################################
# SpamBlocker.exim.conf.2.1.1-release                                #
# 05-Jun-2007                                                        #
# Runtime configuration file for DirectAdmin/Exim 4.24 and above     #
# Requires exim.pl dated 20-Apr-2007 17:09 or later                  #

You will need to edit /etc/exim.conf
Add

acl_smtp_connect = acl_connect
acl_smtp_helo = check_helo

just before:

acl_smtp_rcpt = check_recipient
acl_smtp_data = check_message

Find

######################################################################
# ACLs #
######################################################################
begin acl

add after:

###############################
# ACL connect
###############################
acl_connect:
accept hosts = +whitelist_hosts_ip : +relay_hostsdrop message = Your IP Blacklisted - see http://www.domain.com/
hosts = +bad_sender_hosts_ip

# We do not receive mails from orange, hinet... etc
drop message = Sender Blacklisted - http://www.yourdomain.tld/blocked.html?$sender_host_name
condition = ${if match{$sender_host_name} \
{hinet-ip|hinet|orange|asianet.co.th} \
{yes}{no}}

# Delay. (Spammers doesn&#039;t like to wait while connecting
# Better do not use on high load servers because it will hold too many open connection
# to 587 port accept connection without delay
accept condition = ${if eq {$interface_port}{587}{yes}{no}}

accept
logwrite = Delay 10s for $sender_host_address ($sender_host_name)
delay = 10s

###############################
# ACL HELO/EHLO
###############################
check_helo:

accept condition = ${if eq {$interface_port}{587}{yes}{no}}
accept hosts = +whitelist_hosts: +whitelist_hosts_ip : +relay_hosts

# for some cases this rule may need to comment
deny message = rejected due to forged HELO name - $sender_helo_name
condition = ${if match {$sender_helo_name} \
{\N^[^.].*\.[^.]+$\N} \
{no}{yes}}
!hosts = +whitelist_hosts: +whitelist_hosts_ip : +relay_hosts

drop message = HELO/EHLO cannot be numbers only
condition = ${if match{$sender_helo_name}{\N^\d+$\N}{yes}{no}}

# If remote host greets with an IP address, reject connection:
drop message = IP address not allowed in HELO/EHLO
condition = ${if isip {$sender_helo_name}{true}{false}}

drop message = This is my IP. Go away
condition = ${if eq{$sender_helo_name}{$interface_address} {yes}{no}}

deny message = HELO/EHLO required by SMTP RFC.
condition = ${if eq{$sender_helo_name}{}{yes}{no}}

accept

Find:

#require verify = sender

Add after:

drop message = Use your provider SMTP. Email blocked
condition = ${if match{$sender_host_name} \
{adsl|dialup|pool|peer|dhcp|dsl|broadband|ppp|dynamic|cable} \
{yes}{no}}
hosts = !+relay_hosts
domains = +use_rbl_domains
!authenticated = *

find:

# accept if address is in a local domain as long as recipient can be verified
accept domains = +local_domains
endpass
message = "Unknown User"

Add before:

# Perform greylisting.
defer message = $sender_host_address is greylisted. Please try again later.
log_message = greylisted.
domains = +relay_domains : +local_domains
!senders = : postmaster@*
!hosts = : +relay_hosts : \
${if exists {/etc/greylistd/whitelist-hosts}\
{/etc/greylistd/whitelist-hosts}{}} : \
${if exists {/etc/virtual/whitelist-hosts}\
{/etc/virtual/whitelist-hosts}{}}verify = recipient/callout=5s,use_sender,defer_ok
condition = ${readsocket{/var/run/greylistd/socket}\
{--grey $sender_host_address $sender_address $local_part@$domain}{5s}{}{false}}

Save exim.conf and restart exim:
# service exim restart

That’s All.
Now you can check maillog and see something like below :

2008-03-17 09:20:03 H=(pentium) [84.21.226.22] rejected EHLO or HELO pentium: rejected due to forged HELO name - pentium
2008-03-17 12:22:28 Delay 10s for 59.93.211.220 ()
2008-03-17 12:22:35 H=(59.94.122.15) [59.94.122.15] rejected EHLO or HELO 59.94.122.15: IP address not allowed in HELO/EHLO
2008-03-17 12:22:52 H=cpc1-neww3-0-0-cust845.cdif.cable.ntl.com (home-ad73427dc5) [82.11.227.78] F= rejected RCPT : Use your provider SMTP. Email blocked
2008-03-17 12:28:23 H=n4a.bullet.mail.ac4.yahoo.com [76.13.13.67] rejected connection in "connect" ACL: Sender Blacklisted
2008-03-17 13:05:17 H=hore.iptelecom.net.ua [212.xx.224.8] F=<ins> temporarily rejected RCPT : greylisted.<code>2008-03-17 13:09:48 H=ppp85-140-xx-38.pppoe.mtu-net.ru (mtu-net.ru) [85.140.xx.38] F= rejected RCPT : Use your provider SMTP. Email blocked

Also you can check greylisting stats:

# greylist stats
Statistics since Sun Mar 16 23:18:21 2008 (14 hours and 53 minutes ago)
-----------------------------------------------------------------------
146 items, matching 171 requests, are currently whitelisted
0 items, matching 0 requests, are currently blacklisted
155 items, matching 156 requests, are currently greylistedOf 146 items that were initially greylisted:
- 146 (100.0%) became whitelisted
- 0 ( 0.0%) expired from the greylist
-----------------------------------------------------------------------

I hope this small How-To will help you to reduce incoming spam.

Способы переключения раскладки в KDE 3.x

1. Правка конфига /etc/X11/xorg.conf
Универсальный способ, работает в Kde / Gnome / Xfce / и т.д. Но есть недостаток – переключение языка действует глобально для всех окон/приложений, кроме того, нет индикатора раскладки. Однако ничто не мешает использовать какой-нибудь led 🙂

Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us,ru"
Option "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"
Option "XkbVariant" ",winkeys"
EndSection

При использовании “grp_led:scroll” будет включаться/выключаться индикатор ScrollLock при переключении языков.
“grp:ctrl_shift_toggle” – переключения языка по Control+Shift

2. Поставить kkbswitch (aptitude install kkbswitch). Пакет берёт инфо о языках и клавишах переключения из xorg.conf. Пример для 2х языков:
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us,ru"
Option "XkbOptions" "grp:ctrl_shift_toggle"
Option "XkbVariant" ",winkeys"
EndSection

Языки переключаются по Ctrl+Shift (“grp:ctrl_shift_toggle”). Кроме того, в самом kkbswitch можно настроить “влияние” раскладки глобально или отдельно для каждого окна/приложения.

Короткие “напоминалки”

* практическия вся информация собрана из рассылки nginx. Чтобы не рыться, решил собрать некоторые моменты тут, в одной куче 🙂

HTTP redirect с requested домена на какой угодно адрес (target_domain.tld)
редирект без использования location:

server {
listen IP:80;
server_name requested_domain.tld;
rewrite ^ http://target_domain.tld$request_uri;
}

редирект с использованием location:

server {
listen IP:80;
server_name requested_domain.tld;
location = / { rewrite ^ http://redirect.to/; }
}

как максимально просто запретить запросы с определенными user-agent ?
можно сделать примерно так:

if ($http_user_agent ~ AESOP_com_SpiderMan|Alexibot|Anonymouse\.org|asterias|attach|BackDoorBot|BackWeb|Bandit|Baiduspider|BatchFTP|Bigfoot)
return 503;
}

как сделать так, чтобы пользователь набрав some.site.ru и если этот some не прописан в конфиге редиректился на основной сайт, т.е. www.site.ru ?
Определить server с listen default и уже в нем делать:
rewrite (.*) http://www.site.ru/$1 permanent;

Можно ли для определённого локейшна каким-либо образом реализовать такой алгоритм: смотрим на файл, если находим его-отдаём. Если такого файла нет-запрашиваем у бэкэнда.
это одно из самых распространенных применений nginx:
http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html#error_page


location / {
root /home/site1/public_html;
error_page 404 = @backend;
# если нужно поменять код ответа, укажите его после =
# error_page 404 =200 @backend;
}location @backend {
proxy_set_header
...
proxy_pass http://127.0.0.1:123;
}