Записи с меткой ‘debian’

Пробрасываем порты

Существует как минимум два самых известных способа пробросить порт через Linux машину.
1. iptables
2. ssh
Недавно начал использовать еще один очень просто вариант — xinetd.
Сначала поставим его: apt-get install xinetd
Теперь настраиваем произвольные порты, например:

service proxy7001
{
        disable = no
        type = UNLISTED
        socket_type = stream
        protocol = tcp
        wait = no
        bind = 127.0.0.1
        user = www-data
        redirect = 172.18.1.3 7001
        port = 7001
}

Что имеем? Локальный порт tcp 7001, который форвардится на сервер с IP 172.18.1.3 и порт 7001.

В некоторых случаях это проще и легче, чем iptables и ssh. Действуйте по ситуации. 😉

RTC на Raspberry Pi B

Были закуплены вот такие модули. На ds 1307. Годны для использования на Raspberry Pi B.
Подключаются довольно просто:
VCC — 5V, GND — 0, SCL — к GPIO 1, SDA — к GPIO 0.
Картинки для простоты понимания:

ds1307

PiGPIOs

Далее на Raspberry делаем следующие:

# apt-get install i2c-tools
# modprobe i2c-bcm2708
# modprobe rtc-ds1307
# modprobe -r i2c-bcm2708
# i2cdetect 1
# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
# hwclock -r

После чего должно появиться некое время и дата с подключенного модуля.
Если всё получилось, то оставляем это на постоянку:

# echo 'i2c-dev' >> /etc/modules
# echo 'rtc-ds1307' >> /etc/modules
# sed -i 's/blacklist i2c-bcm2708/#blacklist i2c-bcm2708/' /etc/modprobe.d/raspi-blacklist.conf

В /etc/rc.local добавляем перед exit следующее:

for bus in $(ls -d /sys/bus/i2c/devices/i2c-*);
do
  echo ds1307 0x68 >> $bus/new_device;
  if [ -e /dev/rtc0 ];
  then
    break; # RTC found, bail out of the loop
  else
    echo 0x68 >> $bus/delete_device
  fi
done
hwclock -s

iSCSI Quorum Disk

Вот здесь описано как сделать iSCSI Quorum Disk для двухголового Proxmox’а, но на RH-based Linux, что довольно странно, т.к. сам Proxmox построен на Debian, хотя и с RedHat ядром.
Но у меня реально есть только Дебианы и там не везде есть LVM.
Итак…

dd if=/dev/zero of=/var/proxmox2quorumdisk bs=1024 count=100

И никакого lvm не надо.
Ставим сервер aka target.


apt-get install iscsitarget iscsitarget-dkms
echo "ISCSITARGET_ENABLE=true" > /etc/default/iscsitarget

В /etc/iet/ietd.conf пишем:


Target iqn.2013-02.tld.domain.host:p1qdisk.lun1
IncomingUser rquser rqpass
OutgoingUser
Lun 0 Path=/var/proxmox2quorumdisk,Type=fileio
Alias LUN1
MaxConnections 4

echo "iqn.2013-02.tld.domain.host:p1qdisk.lun1 IP1,IP2,IP3" > /etc/iet/initiators.allow

И… запускаем:

/etc/init.d/iscsitarget start

Теперь может возникнуть желание расшарить этот диск только с определенного IP. Статная обёртка в Debian этого не позволяет. Пропатчить можно так:

echo "ISCSITARGET_OPTIONS='--address=IP'" >> /etc/default/iscsitarget

И правим в /etc/init.d/iscsitarget в функции ietd_start строку:

start-stop-daemon --start --quiet --oknodo --exec $DAEMON -- $ISCSITARGET_OPTIONS

Перезапускаем:

/etc/init.d/iscsitarget restart

Теперь настроим клиента aka initiator.

apt-get install open-iscsi

Правим /etc/iscsi/iscsid.conf:

node.startup = automatic

/etc/init.d/open-iscsi restart

Подключаем диск:


iscsiadm -m discovery -t st -p IP
iscsiadm -m node

iscsiadm -m node --targetname "iqn.2013-02.tld.domain.host:p1qdisk.lun1" --portal "IP:3260" --op=update --name node.session.auth.authmethod --value=CHAP
iscsiadm -m node --targetname "iqn.2013-02.tld.domain.host:p1qdisk.lun1" --portal "IP:3260" --op=update --name node.session.auth.username --value=rquser
iscsiadm -m node --targetname "iqn.2013-02.tld.domain.host:p1qdisk.lun1" --portal "IP:3260" --op=update --name node.session.auth.password --value=rqpass
iscsiadm -m node --targetname "iqn.2013-02.tld.domain.host:p1qdisk.lun1" --portal "IP:3260" --login

По идее после этого должен появиться новый диск. У меня это /dev/sdc

Теперь на нём создадим Quorum Disk:

fdisk /dev/sdc

Далее создаём новый раздел: n, p, 1, w. Ну там для размера Enter понажимаем для подтверждения полного размера.

mkqdisk -c /dev/sdc1 -l p1qdisk

Перезагружаем клиентов на клиентах:

/etc/init.d/open-iscsi restart

А дальше по тексту оригинальной инструкции и всё сработает.

Собственный SMS шлюз

Сначала подготовим сервер. Я ставил это на Fedora 18 и Debian 7, на x86, amd64 и arm в исполнении Raspberry Pi. Разница только в способе установки пакетов.
Сначала инструменты для работы с sms через 3g/4g модемы Huawei, которые создают /dev/ttyUSB* устройства при подключении.

Huawei выбран потому что эти модемы работают очень стабильно в отличие от ZTE. Прочие производители не тестировались ввиду отсутствия в свободной продаже в Самаре.

При подключении 3G модема в USB должны появиться три устройства:


/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2

Обычно нулевое устройство — основное для передачи данных. Оно же занимается для подключения по GPRS и производным протоколам. Если модем не используется для этого, то 0 устройство можно использовать для SMS. А вот если используется, что для разных модемов для отправки SMS придётся подбирать экспериментальным путём либо 1 либо 2 устройство.

Приступим.

apt-get install gammu gammu-smsd

В связи с особенностью используемых мной шлюзов хранить всё это будем в /home/sms


mkdir -p /home/sms
cd /home/sms
rm -f /etc/gammu-smsdrc
ln -s /etc/gammu-smsdrc /home/sms/gammu-smsdrc

Конфиг /home/sms/gammu-smsdrc:


[smsd]
Service = files
PIN = 0000
LogFile = syslog
InboxPath = /home/sms/inbox/
OutboxPath = /home/sms/outbox/
SentSMSPath = /home/sms/sent/
ErrorSMSPath = /home/sms/error/

debuglevel = 1
logfile = /home/sms/smsd.log

[gammu]
port = /dev/ttyUSB0
model = at
connection = at19200
synchronizetime = yes
logfile = /home/sms/gammu.log
logformat = textalldate
use_locking = yes
;gammuloc =
;gammucoding = utf8

Файл запуска/перезапуска сервиса /home/sms/restart:


#!/bin/bash

killall -q gammu-smsd && sleep 10

cd /home/sms
>smsd.log
touch smrsh.log
chmod 1660 smsd.log smrsh.log
mkdir -p error inbox outbox sent
chmod 1770 error inbox outbox sent
chgrp mail smsd.log smrsh.log error inbox outbox sent

gammu-smsd -c /home/sms/gammu-smsdrc -d

С учётом того под каким юзером будем запускать этого домена нужно сделать:

chown -R user:group /home/sms

Нужно учесть, что юзер должен принадлежать группе, которая может писать в /dev/ttyUSB0.

Ну и запускаем:

/home/sms/start

Для автоматического запуска в /etc/rc.local вписываем эту же команду.

Проверить работу можно так, заменив телефон на свой:

gammu-smsd-inject -c gammu-smsdrc TEXT "+79020000000" -textutf8 "дата/date `date`" -unicode

Теперь создаём отдельный поддомен для отправки sms через e-mail. В sendmail добавляем его в /etc/mail/local-host-names и прописываем в virtusertable:

@subdomain.domain.tld smsg

а в aliases:

smsg: "|/etc/mail/smrsh/smsg"

smsg может выглядеть так:

#!/bin/bash

LOG=/tmp/smsg
BF=''
SMS=''
MOB=''

date >> $LOG
set >> $LOG
env >> $LOG

while read L; do
    echo $L >> $LOG
    if [ -z "$L" ]; then
        BF=1
        continue
    fi
    if [ -z "$BF" ]; then
        if [ "${L:0:4}" == "To: " ]; then
            TO=${L:4}
            TO=${TO# *}
            TO=${TO%@*}
            if [ ${#TO} != 10 ] || [ "${TO:0:1}" != "9" ]; then
                echo "BAD TO" >> $LOG
                exit 403
            fi
            MOB="+7"$TO
        fi
    else
        if [ -z "$SMS" ]; then
            SMS=$L
        else
            SMS=$SMS$'\n'$L
        fi
    fi
done

if [ -n "$MOB" ] && [ -n "$SMS" ]; then
    echo "--- SMS ---" >> $LOG
    echo "$MOB" >> $LOG
    echo "$SMS" >> $LOG
    echo "=== === ===" >> $LOG
    gammu-smsd-inject -c /home/sms/gammu-smsdrc TEXT "$MOB" -textutf8 "$SMS" -unicode -len 319  1>>$LOG 2>&1
fi

Подлость от Ростелекома

Минувшие выходные прошли под флагом борьбы за свой оплаченный интернет.
Сначала (в пятницу) соединения начали рваться, а потом вообще пропал всходящий трафик. В общем, под выходные спецы на той стороне что-то намутили.

Проблема номер раз.
Выдают белый внешний IP в стандартной PPPoE сессии. При этом все соединения наружу идут с другого IP. Первым сломался DynDNS. Сначала подумал, что проксируют. Перенастроил соединение добавив в /etc/ppp/peer/rt.fttb строку:
unit 35
Это дало постоянное имя интерфейса ppp35 для этого соединения (у меня несколько внешних pppoe). Затем исправил /etc/ddclient.conf:
use=if, if=ppp35
Технически всё заработало, но по ssh внутрь всё равно снаружи попасть было нельзя — трафик не шел. Справедливости ради стоит заметить, что внутри Ростелекома соединения на этот белый IP шли на ура.
Поскольку аналогичная конфигурация в другой точке города работала по иному, то тщательно сравнил и нашел разницу. Оказалось дело в диапазонах белых IP адресов, которые выдавались.
Оказалось, что на каждой точке есть две железки, которые дают инет:

# pppoe-discovery -I eth1
Access-Concentrator: MX960-1
Got a cookie: 85 3d c1 4b 07 46 95 f6 3c 64 72 08 ab cd 4b f2
--------------------------------------------------
AC-Ethernet-Address: 00:25:9e:80:b5:07
Access-Concentrator: MX960-2
Got a cookie: 85 3d c1 4b 07 46 95 f6 3c 64 72 08 ab cd 4b f2
--------------------------------------------------
AC-Ethernet-Address: 00:25:9e:80:b6:08

Опытным путём выяснилось, что MX960-1 выдаёт нормальные белые адреса, а MX960-2 — недоступные.
Пишем в /etc/ppp/peers/rt.fttb:
plugin rp-pppoe.so rp_pppoe_ac 'MX960-1' eth1
и получаем всегда то что нам надо. Разумеется пока эта самая железка будет доступна. Если она пропадёт, то инета не будет вообще никакого.

Проблема номер два.
Часть сайтов стала недоступна. Закономерностей нет. Протокол значения не имеет. Даже ssh сессии начали рваться. Первая же мысль, которую я почему-то быстро отогнал, была верной — MTU.
Странно, что не провелась параллель между первой проблемой и этой.
Но в результате она решилась очень даже тривиально (хоть и с подсказки):
iptables -t mangle -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Не ожидал такого через два-то с половиной года довольно стабильной работы…

OpenVZ Debian 7 Wheezy Template

Недавно вышел Debian 7 Wheezy. Среди прочего произошел переход на ядро 3.2 и из-за этого произошел отказ от поддержки OpenVZ. Печально, но Wheezy прекрасно работает на ядре 2.6.32 от Squeeze, а еще лучше работает Proxmox 3. Разумеется под него хочется иметь свою сборку Debian7. Сделать это можно так.

Во-первых, vzctl в Proxmox не содержит в себе конфиги для шаблонов, которые упрощают жизнь. Те, что обычно лежат в /etc/vz/conf и именуются типа ve-basic.conf-sample ve-light.conf-sample ve-unlimited.conf-sample и т.п. Поэтому качаем их из основного дистрибутива:

cd /tmp
wget http://mirror.yandex.ru/debian/pool/main/v/vzctl/vzctl_3.0.30.2-4_amd64.deb
dpkg -x vzctl_3.0.30.2-4_amd64.deb .
cp etc/vz/conf/*sample /etc/vz/conf/

Теперь приступим к сборке почти по стандартной процедуре.
Она содержит три этапа. Первый и третий на хосте, а второй — внутри контейнера.

Первый этап:

Создадим файловую структуру контейнера:

aptitude install debootstrap
debootstrap --arch amd64 wheezy /var/lib/vz/private/777 http://mirror.yandex.ru/debian/

Произведём базовые настройки контейнера:

vzctl set 777 --applyconfig basic --save
echo 'OSTEMPLATE="debian-7.0"' >> /etc/vz/conf/777.conf
vzctl set 777 --ipadd 192.168.35.110 --save
vzctl set 777 --nameserver 8.8.8.8 --nameserver 8.8.4.4 --save
mknod --mode 666 /var/lib/vz/private/777/dev/ptmx c 5 2
mkdir -p /var/lib/vz/root/777

Контейнер подготовлен. Запустим его и залезем внутрь:

vzctl start 777
vzctl enter 777

Теперь мы внутри контейнера.

Второй этап:

Будем патриотически использовать локальное зеркало Debian:

echo "deb http://mirror.yandex.ru/debian wheezy main non-free contrib" > /etc/apt/sources.list
echo "deb http://mirror.yandex.ru/debian/ wheezy-updates main contrib non-free" >> /etc/apt/sources.list
echo "deb http://security.debian.org wheezy/updates main non-free contrib" >> /etc/apt/sources.list

aptitude update
aptitude upgrade

chmod 700 /root

sed -i -e '/getty/d' /etc/inittab
sed -i -e '/^#/d' /etc/inittab
sed -i -e '/^\s*$/d' /etc/inittab
echo "1:2345:respawn:/sbin/getty 38400 tty1" >> /etc/inittab

sed -i -e 's@\([[:space:]]\)\(/var/log/\)@\1-\2@' /etc/*syslog.conf

rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab

rm -f /etc/ssh/ssh_host_*

echo '
#!/bin/sh
### BEGIN INIT INFO
# Provides:          Generates new ssh host keys on first boot
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Generates new ssh host keys on first boot
# Description:       Generates new ssh host keys on first boot
### END INIT INFO
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N ""
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N ""
insserv -r /etc/init.d/ssh_gen_host_keys
rm -f \$0
' > /etc/init.d/ssh_gen_host_keys

chmod a+x /etc/init.d/ssh_gen_host_keys
insserv /etc/init.d/ssh_gen_host_keys

dpkg-reconfigure tzdata


Удалим лишние пакеты, если знаем какие. 😉 Например:

dpkg --purge modutils ppp pppoeconf pppoe pppconfig module-init-tools

Далее доставляем всё что нужно в этом шаблоне. Например:

aptitude install ssh quota less mc mtr

Очищаем кэш и вылезаем из контейнера.

aptitude --purge clean
exit

Третий этап:

Теперь контейнер надо собрать в шаблон (template):

vzctl set 777 --ipdel all --save
>/var/lib/vz/private/777/etc/resolv.conf
rm -f /var/lib/vz/private/777/etc/hostname
vzctl stop 777
cd /var/lib/vz/private/777
tar --numeric-owner -zcf /var/lib/vz/template/cache/debian-7.0-amd64-custom.tar.gz .

Вот и всё. Теперь у нас есть template для установки Debian 7 Wheezy в контейнер OpenVZ, например, в Proxmox.

Проверим — работает ли:

# vzctl create 888 --ostemplate debian-7.0-amd64-custom --config basic
Creating container private area (debian-7.0-amd64-custom)
Performing postcreate actions
CT configuration saved to /etc/pve/openvz/888.conf
Container private area was created

Теперь можно наши эксперименты удалить (или оставить — по желанию):

# vzctl destroy 777
# vzctl destroy 888

Сканер на тележке

С первого и по тринадцатое с песнями, шутками, танцами…
Чем же еще заниматься-то с первого и по тринадцатое?

—Несчастный случай

 

Отгремели корпоративы и неумолимо приближался Новый Год. Для нас не сделали исключения и устроили корпоратив с традиционным возлиянием в Максимилианс.
После него технари компании решили, что в праздновании не хватает IT и был проведён второй — IT — корпоратив с применением X-Box 360, Kinect и метрового телевизора. В процессе оного в голову пришло множество весёлых и главное реализуемых мыслей. Те кто никогда не использовал Kinect врядли поймут…

Одной из мыслей было соорудить некий необычный и полезный агрегат с возможностью ежедневного использования. Вспомнились недавние приключения со сканированием чего-то с бегатнёй по кабинетам.

А почему бы не сделать наш сканер более мобильным?

Под это дело была произведена ревизия заскладированных по всему офису «железок».

Нашлось:

Intel DN2800MT

2 x SO-DIMM DDR3 4Gb Patriot

OCZ mSATA SSD 60Gb

блок питания от ноута ASUS 19V (сейчас заменён на менее мощный FPS)

D-Link DWA-125

Сканер HP ScanJet G2410

Офисный стул на колёсиках с отломленной саппортерами спинкой.

Из подручных необходимых средств были использованы Zalman VE200, Debian 6.0.5 amd64 netinst вариант в виде iso, usb клавиатура, ethernet патч корды, Olympus FE-115.

Десятого вроде заняться нечем…
Отлично! Десятого лечим печень

—Несчастный случай 

Собираем всё это в кучку и получаем нечто такое:

Конструкция абсолютно бесшумная после установки Debian на SSD и отключения VE200.

Debian ставим в минимальном варианте + ssh (он понадобится для второго/запасного/прямого варианта доступа к сканеру).

Теперь подготовим Debian для работы с ssd в режиме read-only. Поскольку «тележка» — агрегат мобильный, то восстанавливать fs будет совершенно неинтересно.

Для работы os потребуется запись в /tmp, /var/tmp, /run и всякие /var/* (типа lock и log). Перенесём их в память.


cd /var
rm -rf tmp run lock log
ln -s /dev/shm
ln -s /dev/shm lock
ln -s /dev/shm run
ln -s /dev/shm log


cd /etc/network
rm -rf run
ln -s /dev/shm run


cd /var/lib
rm -rf urandom
ln -s /dev/shm urandom

Отключаем ненужные нам, но включенные по умолчанию сервисы:

update-rc.d cron remove
update-rc.d exim4 remove
update-rc.d nfs-common remove
update-rc.d portmap remove

Для того чтобы можно было использовать перенесённые в память каталоги нужно при каждой загрузке создавать там структуры каталогов. Сделаем это через initd скрипт /etc/init.d/tmpfs в т.ч. и для не особо нужных каталогов.

#!/bin/bash

### BEGIN INIT INFO
# Provides:          tmpfs
# Required-Start:
# Required-Stop:
# X-Stop-After:      sendsigs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

mount tmpfs -t tmpfs /tmp
cd /tmp
mkdir exim4 sshd log
chmod 750 exim4
chown Debian-exim:Debian-exim exim4
touch utmp
chmod 660 utmp
chgrp utmp utmp

cd log
mkdir apt exim4 fsck installer news
chmod 2750 exim4
chown Debian-exim:adm exim4
touch dmesg wtmp lastlog
chmod 660 wtmp lastlog
chgrp utmp wtmp lastlog

exit 0

И подключим его к загрузке:

chmod 755 /etc/init.d/tmpfs
update-rc.d tmpfs defaults

Теперь надо добавить /tmp в /etc/fstab.

echo "tmpfs /tmp tmpfs defaults 0 0" >> /etc/fstab

Поскольку логов в случае чего не будет, то можно на всякий случай настроить удалённое логирование:


echo "*.*;auth,authpriv.none @10.0.0.21" >> /etc/rsyslog.conf
/etc/init.d/rsyslog restart

Здесь 10.0.0.21 — IP адрес сервера, который принимает нашил логи.

Перезагружаемся…
Редактируем параметры монтирования / на noatime,ro.


sed -ir 's/\/\s+ext4\s+defaults/\/ ext4 noatime,ro/' /etc/fstab

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

Теперь займёмся собственно сканером. Установим нужный пакет, включим автозапуск и добавим сеть для которой он будет работать:


aptitude install -y sane
sed -i 's/RUN=no/RUN=yes/' /etc/default/saned
echo "10.0.0.0/24" >> /etc/sane.d/saned.conf

HP 2400 не поддерживается в sane и в Debian нет ничего для него. Но зато есть такой репозитарий для Ubuntu. Подключим его к нашей тележке:


echo "deb http://ppa.launchpad.net/lion-simba/hp2400/ubuntu karmic main" >> /etc/apt/sources.list
aptitude update

Установим найденные hp2400 пакеты:

aptitude install -y libsane-hp2400x64 xsane

Сканер готов. Проверим:

# scanimage -L
device `net:10.0.0.3:genesys:libusb:004:002' is a Hewlett Packard ScanJet 2400c flatbed scanner

Здесь 10.0.0.3 — это IP тележки по проводной сети.

Теперь сделаем тележку чуть более мобильной. Для этого подключимся к сети по wifi, тем более, что у нас есть DWA-125.


aptitude install -y wireless-tools firmware-ralink wpasupplicant

В /etc/network/interfaces вписываем следующее для назначения статичного IP адреса.

auto wlan0
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
address 10.0.0.241
netmask 255.255.255.0
gateway 10.0.0.1
dns-nameservers 10.0.0.1 10.0.0.2

Шлюз и DNS, конечно, можно не указывать, но вдруг что-то понадобится обновить или доставить?

При этом не забываем удалить allow-hotplug eth0 или auto eth0 из того же конфига:


sed -ir 's/allow-hotplug eth0//' /etc/network/interfaces
sed -ir 's/auto eth0//' /etc/network/interfaces

Поскольку wifi сеть с WPA, то нам понадобится еще и конфиг для wpasupplicant на который мы уже сослались /etc/wpa_supplicant/wpa_supplicant.conf:


ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=root
network={
ssid="наша точка"
key_mgmt=WPA-PSK
psk="наш ключ"
}

Одиннадцатого решаем задачу
Как не поехать к друзьям на дачу.
Но все же едем. Итог известен:
Включая двенадцатое куролесим.

—Несчастный случай

Теперь приступим к физической мобильности нашей тележки.
Для начала возьмём стул, открутим от него ручки и крепёжные винты, вскроем и оценим внутреннее пространство:

Места более чем достаточно для размещения mATX платы, блока питания, пары шнуров и wifi usb карты. Но контакты с платы не должны касаться металлических частей стула. Для этого после рытья в шкафах находим нечто, что можно использовать для крепежа к стулу и в качестве стоек для платы.

И неплохо получилось:

В сборе стул выглядит вполне естественно:

Но если заглянуть снизу, то становятся заметны высокие технологии. 😉

Сканер потом поставим сверху, но сначала надо решить вопрос с питанием. Лишнего UPS’а под рукой не оказалось, поэтому решили задействовать обычный электрический удлинитель на 3 посадочных места. Длина шнура более 10 метров, что опять же даёт ощутимую мобильность. К стула удлинитель прикреплён пластиковыми стяжками.

Вот так выглядит законченный вариант «сканирующей тележки».

В качестве окончательного хулиганства водрузили на эту же конструкцию еще и шредер. Отсканировал документ и тут же уничтожил не отходя. 😀

 

Как же хочется на работу!
К станку, к прилавку, куда угодно!

—Несчастный случай

С Новым Годом! Надеюсь, Вы улыбнулись читая это. 😉