понедельник, 13 апреля 2026 г.

Debian + ODDOR H8 2th Shifter - добавляем в систему китайскую КПП )


Продолжаем добавлять игровые устройства в Debian. Была куплена коробка передач фирмы ODDOR - на 8 положений, с магнитными датчиками положения рычага коробки. Подключаем к компьютеру - и в системе нет нового игрового устройства(. Как обычно все сделано для... Widows ONLY.

Очередная задачка поиска решения проблемы - найдена. Вот её небольшое решение.
Создаем в каталоге /etc/udev/rules.d файл 99-oddor-shifter.rules со следующим содержимым:

# Bind to usbhid (if needed)
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="4785", ENV{ID_MODEL_ID}=="7353", RUN+="/bin/sh -c 'echo 4785 7353 > /sys/bus/usb/drivers/usbhid/new_id'"
# Tag as joystick
SUBSYSTEM=="input", ATTRS{idVendor}=="4785", ATTRS{idProduct}=="7353", ENV{ID_INPUT_JOYSTICK}="1"

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

udevadm control --reload

Готово. Подключаем КПП к компьютеру. Теперь можно проверять с помощью jstest её работоспособность.

суббота, 14 февраля 2026 г.

ETS2 - учим переключать передачи кнопками, но задействовав педаль сцепления (без физической ручной КПП)

Был куплен комплект руль и 2 педали (тормоз и газ), затем решил докупить еще одну педаль - сцепление. Но тут поджидала проблема - игра не хочет работать с педалью сцепления без коробки передач... секвентальная не поддерживает педаль сцепления, только ручная, только хардкор 😎.
Ну пришло сперва самое простое решение - берем и подключаем любой дополнительный геймпад/джойстик и назначаем на нем кнопки на номера передач (главное чтобы кнопок хватило 😊). Да, это работает. но с одним условием - пока сцепление не отпущено или газ на минимуме, необходимо удерживать нужную кнопку.
Немного времени использования такой версии КПП приступил к поиску решения проблемы... Решение было найдено и немного переделано под себя. Ниже предоставленные настройки проверены в ОС Linux Debian, Steam-версии игры 1.58, тягач Volvo, и 3 варианта коробки передач.

Настройка игры через меню.

Первым делом в разделе игры "Кнопки и клавиши", подраздел "Трансмиссия", настраиваем клавиши или кнопки для повышения и понижения КПП, соответственно "Передача вверх" и "Передача вниз".

В разделе "Настройка устройств", подраздел "Трансмиссия". Нас интересует пункт "Трансмиссия" - в нём выбираем "Ручная (с делителем)".
Далее переходим в подраздел "Рычаг КПП". В пункте "Вариант" ставим "С делителем", пункт "Режим ручного переключения передач" устанавливаем "Простой с сигналом".

Выходим из игры и приступаем к следующему этапу.

Корректировка файла настроек игры.

Внимание!!! Настройку выполняем в зависимости от купленной и установленной КПП в Вашем тягаче!

Необходимо найти конфигурационный файл controls.sii, он расположен в библиотеке steam в том месте где игра установлена, по умолчанию домашней папке ~/.steam/steam или если вы добавляли новую директорию то в ней. Переходим по следующему пути в директории библиотеки:

/steamapps/compatdata/227300/pfx/drive_c/users/steamuser/Documents/Euro Truck Simulator 2/steam_profiles/КОД_ПРОФИЛЯ

Где КОД_ПРОФИЛЯ - буквенно-цифровое наименование директории, возможно таких директорий будет несколько, если вы используете несколько аккаунтов steam на одном компьютере для игры.

В данной директории нас интересует файл  controls.sii. На всякий случай сделайте копию файла перед началом внесения правок, например сохраните с именем  controls.sii.bak.

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

Для хранения "номера" передачи я использовал параметры hmdx и hmdy. Возможно они используются для VR, но так как у меня его нет, поэтому ... мне не мешает.

Ищем строки mix с конкретным параметром, см. ниже, которые и будем менять.

Правка для КПП на 6 передач

Подготавливаем "счетчик":

config_lines[295]: "mix hmdx `max(min(memory((gearup | geardown) & gt(clutch, 0.75), hmdy + sel( gearup, 1.0, -1.0 )), 6.0 ), -1.0 )`"

config_lines[296]: "mix hmdy `memory(!gearup & !geardown, hmdx)`"

Нейтраль:

config_lines[481]: "mix gear0 `(gte(hmdx,0.0)&lte(hmdx,0.0)) | semantical.gear0?0`"

Конфигурация передач R + 1..6:

config_lines[534]: "mix gear1 `(gte(hmdx,-1.0)&lte(hmdx,-1.0)) | semantical.gear1?0`"

config_lines[535]: "mix gear2 `(gte(hmdx,1.0)&lte(hmdx,1.0)) | semantical.gear2?0`"

config_lines[536]: "mix gear3 `(gte(hmdx,2.0)&lte(hmdx,2.0)) | semantical.gear3?0`"

config_lines[537]: "mix gear4 `(gte(hmdx,3.0)&lte(hmdx,3.0)) | semantical.gear4?0`"

config_lines[538]: "mix gear5 `(gte(hmdx,4.0)&lte(hmdx,4.0)) | semantical.gear5?0`"

config_lines[539]: "mix gear6 `(gte(hmdx,5.0)&lte(hmdx,5.0)) | semantical.gear6?0`"

config_lines[540]: "mix gear7 `(gte(hmdx,6.0)&lte(hmdx,6.0)) | semantical.gear7?0`" 

Правка для КПП на 12 передач

Подготавливаем "счетчик":

config_lines[295]: "mix hmdx `max(min(memory((gearup | geardown) & gt(clutch, 0.75), hmdy + sel( gearup, 1.0, -1.0 )), 12.0 ), -2.0 )`"

config_lines[296]: "mix hmdy `memory(!gearup & !geardown, hmdx)`"

Нейтраль:

config_lines[481]: "mix gear0 `(gte(hmdx,0.0)&lte(hmdx,0.0)) | semantical.gear0?0`"

Включаем/выключаем первый переключатель режима КПП:

config_lines[528]: "mix gearsel1on `lte( hmdx,-2.0 ) | gte( hmdx, 7.0 ) | semantical.gearsel1on?0`"

config_lines[529]: "mix gearsel1off `!gearsel1on | semantical.gearsel1off?0`"

Конфигурация передач R1..2 + 1..12:

config_lines[534]: "mix gear1 `(gte(hmdx,-2.0)&lte(hmdx,-1.0)) | semantical.gear1?0`"

config_lines[535]: "mix gear2 `(gte(hmdx,1.0)&lte(hmdx,1.0)) | (gte(hmdx,7.0)&lte(hmdx,7.0)) | semantical.gear2?0`"

config_lines[536]: "mix gear3 `(gte(hmdx,2.0)&lte(hmdx,2.0)) | (gte(hmdx,8.0)&lte(hmdx,8.0)) | semantical.gear3?0`"

config_lines[537]: "mix gear4 `(gte(hmdx,3.0)&lte(hmdx,3.0)) | (gte(hmdx,9.0)&lte(hmdx,9.0)) | semantical.gear4?0`"

config_lines[538]: "mix gear5 `(gte(hmdx,4.0)&lte(hmdx,4.0)) | (gte(hmdx,10.0)&lte(hmdx,10.0)) | semantical.gear5?0`"

config_lines[539]: "mix gear6 `(gte(hmdx,5.0)&lte(hmdx,5.0)) | (gte(hmdx,11.0)&lte(hmdx,11.0)) | semantical.gear6?0`"

config_lines[540]: "mix gear7 `(gte(hmdx,6.0)&lte(hmdx,6.0)) | (gte(hmdx,12.0)&lte(hmdx,12.0)) | semantical.gear7?0`"

Правка для КПП на 12+2 передач

Подготавливаем "счетчик":

config_lines[295]: "mix hmdx `max(min(memory((gearup | geardown) & gt(clutch, 0.75), hmdy + sel( gearup, 1.0, -1.0 )), 14.0 ), -4.0 )`"

config_lines[296]: "mix hmdy `memory(!gearup & !geardown, hmdx)`"

Нейтраль:

config_lines[481]: "mix gear0 `(gte(hmdx,0.0)&lte(hmdx,0.0)) | semantical.gear0?0`"

Включаем/выключаем первый переключатель режима КПП:

config_lines[528]: "mix gearsel1on `lte( hmdx,-3.0 ) | gte( hmdx,13.0 ) | semantical.gearsel1on?0`"

config_lines[529]: "mix gearsel1off `!gearsel1on | semantical.gearsel1off?0`"

Включаем/выключаем второй переключатель режима КПП:

config_lines[531]: "mix gearsel2on `gte( hmdx,-4.0 ) & lte( hmdx,-4.0 ) | gte( hmdx,-2.0 ) & lte( hmdx,-2.0 ) | gte( hmdx,7.0 ) & lte( hmdx,14.0 ) | semantical.gearsel2on?0`"

config_lines[532]: "mix gearsel2off `!gearsel2on |semantical.gearsel2off?0`"

Конфигурация передач R1..4 + С1..2 + 1..12:

config_lines[534]: "mix gear1 `(gte(hmdx,-4.0)&lte(hmdx,-1.0)) | semantical.gear1?0`"

config_lines[535]: "mix gear2 `(gte(hmdx,1.0)&lte(hmdx,1.0)) | (gte(hmdx,7.0)&lte(hmdx,7.0)) | (gte(hmdx,13.0)&lte(hmdx,13.0)) | semantical.gear2?0`"

config_lines[536]: "mix gear3 `(gte(hmdx,2.0)&lte(hmdx,2.0)) | (gte(hmdx,8.0)&lte(hmdx,8.0)) | (gte(hmdx,14.0)&lte(hmdx,14.0)) | semantical.gear3?0`"

config_lines[537]: "mix gear4 `(gte(hmdx,3.0)&lte(hmdx,3.0)) | (gte(hmdx,9.0)&lte(hmdx,9.0)) | semantical.gear4?0`"

config_lines[538]: "mix gear5 `(gte(hmdx,4.0)&lte(hmdx,4.0)) | (gte(hmdx,10.0)&lte(hmdx,10.0)) | semantical.gear5?0`"

config_lines[539]: "mix gear6 `(gte(hmdx,5.0)&lte(hmdx,5.0)) | (gte(hmdx,11.0)&lte(hmdx,11.0)) | semantical.gear6?0`"

config_lines[540]: "mix gear7 `(gte(hmdx,6.0)&lte(hmdx,6.0)) | (gte(hmdx,12.0)&lte(hmdx,12.0))| semantical.gear7?0`"

Сохраняем файл настроек и запускаем игру.
Пользуемся назначенными кнопками ранее и выжимом педали сцепления как минимум на 75%.

четверг, 8 января 2026 г.

Добавляем передачу данных из Opentrack для linux в игру ETS2 (steam версия).

Если у вас уже настроен Opentrack в linux системе (я использую Debian), вы столкнетесь с тем что он работает как эмулятор мышки.
Что приносит неудобство его использования, т.к. необходимо возвращать камеру сместив голову в противоположном направлении... ну совсем не то что хотелось бы увидеть в игре.

Настройка Opentrack.

Основные источники.

Источником данных использовался "PointTracker". Для обработки данных о расположении головы я использовал 3 ИК-диода расположенных по модели "Кепка".

В операционной системе windows в opentrack есть опция вывода эмулирующая аппаратное устройство - "трекер", к сожалению в операционных системах семейства linux данный вариант отсутствует. Для игры ETS2/ATS подходящим будет эмуляция геймпада/джойстика, таким образом за выходной интерфейс будет выступать "libevdev joystic reciever". Ниже приведен скриншот главного экрана opentrack с запущенной работой:

Горячие клавиши.

Нажимаем кнопку Настройки и в первой же вкладке назначаем клавишу или комбинацию клавиш для центрирования модели. Я использовал комбинацию клавиш Win+F11:

Выходной интерфейс.

На следующей вкладке настройка выходных данных которые будут поступать от программы в игру. Тут уже зависит от вашего желания и восприятия организма на изменение изображения. Мне достаточно использования 2-х осей - поворота головы влево/вправо и вверх/вниз. Эти оси и будут далее использоваться в настройке конфигурационного файла самой игры. Забегая вперед, у меня одна ось в игре обрабатывалась противоположно повороту головы, поэтому было добавлена опция инвертирования данных:

Tracker.

Следующая вкладка для настройки будет Tracker. Тут выставляем желаемые параметры для вашей вебкамеры и используемой модели. Доработку самой вебкамеры и создание физической модели я тут не рассматриваю.

На вложенной вкладке Камера произведем подстройку работы камеры. Главным критерием для нас это работа камеры с максимально возможной для нее скоростью передачи данных. Поэтому использовалось низкое разрешение и выставлялось желаемое количество FPS. Но на практике у меня максимально полученное соответствовало 15.

Далее вам предстоит настроить блок Изменение точек. К сожалению порог и размеры точек индивидуальны. Это уже вы подстроите по своим ощущениям обработки данных программой. Для облегчения настройки могу порекомендовать расположить окно настроек в центре, а главное окно передвигая мышкой по экрану отслеживать его головой, где вы будете видеть как происходит обработка точек (ИК светодиодов).

На вложенной вкладке Модель. Выбираем вложенную вкладку вашей модели. У меня используется модель Кепка и соответствующая ей вкладка. Укажите соответствующие размеры и проведите калибровку модели используя только две плоскости поворота головы - вверх/вниз и влево/вправо.

Кривые.

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


Настройка игры.

Необходимо найти конфигурационный файл controls.sii, он расположен в библиотеке steam в том месте где игра установлена, по умолчанию домашней папке ~/.steam/steam или если вы добавляли новую директорию то в ней. Переходим по следующему пути в директории библиотеки:

/steamapps/compatdata/227300/pfx/drive_c/users/steamuser/Documents/Euro Truck Simulator 2/steam_profiles/КОД_ПРОФИЛЯ

Где КОД_ПРОФИЛЯ - буквенно-цифровое наименование директории, возможно таких директорий будет несколько, если вы используете несколько аккаунтов steam на одном компьютере для игры.

В данной директории нас интересует файл  controls.sii. На всякий случай сделайте копию файла перед началом внесения правок, например сохраните с именем  controls.sii.bak.

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

Если вы настраивали например оси головы влево/вправо и вверх/вниз, то в строчке параметра input j_look_ud будет наименование необходимого устройства:

config_lines[14]: "input j_look_ud `joy2.ry`"

config_lines[15]: "input j_look_lr `joy2.rx`"

У меня это joy2.
Теперь очистим привязку к нашему устройству данных настроек. Приводим строки к такому виду, удалив содержимое в одиночных кавычках - значения параметра. Наименования в указанных строчках что вы удалите нам пригодятся чуть ниже, поэтому перепишите их себе хотя бы на листик или запомните:

config_lines[14]: "input j_look_ud ``"

config_lines[15]: "input j_look_lr ``"

Далее ищем строку с параметром mix headtron. Например вы найдете вот такие строчки:

config_lines[307]: "mix headtron `c_ht_on & (trackiron | hmdon | eyeposon)`"

config_lines[308]: "mix headtryaw `sel(trackiron, trackiryaw, 0) + sel(hmdon, hmdyaw, 0) + sel(eyeposon, eyeposyaw, 0)`"

config_lines[309]: "mix headtrpitch `sel(trackiron, trackirpitch, 0) + sel(hmdon, hmdpitch, 0) + sel(eyeposon, eyepospitch, 0)`"

Приступаем к корректировке. В первой строчке mix headtron мы оставим только одно значение параметра. В следующих строчках содержащие mix headtryaw и mix headtrpitch допишите ранее найденные значения параметров самое начало после одиночной кавычки. Получаем похожее на это:

config_lines[307]: "mix headtron `c_ht_on`"

config_lines[308]: "mix headtryaw `joy2.rx + sel(trackiron, trackiryaw, 0) + sel(hmdon, hmdyaw, 0) + sel(eyeposon, eyeposyaw, 0)`"

config_lines[309]: "mix headtrpitch `joy2.ry + sel(trackiron, trackirpitch, 0) + sel(hmdon, hmdpitch, 0) + sel(eyeposon, eyepospitch, 0)`"

Сохраняем изменения. Загружаем игру. Назначаем клавишу на активацию режима отслеживания положения головы. Для этого настройках уже самой игры выбираем Клавиши и кнопки, затем находим там Включить отслеживание движений головы и привязываем клавишу.

Если все правильно выполнено - пользуемся.
Если после загрузки игры вы немного сместились и в игре расположение отрисовывает не по центру - используйте ранее назначенную в opentrack клавишу.

ПС. Если у вас перепутано влево/вправо с вверх/вниз - поменяйте в последних двух строчках дописанные значения параметров местами.

четверг, 18 декабря 2025 г.

Debian 12 + VirtualBox + QTech

Заметка на добавление репозитария в Debian 12 через новый формат deb822.

В каталоге /etc/apt/sources.list.d можно создавать отдельные файлы репозитория, воспользуемся этим.

Для VirtualBox cоздаём в каталоге файл с именем oracle-virtualbox.sources:

nano  /etc/apt/sources.list.d/oracle-virtualbox.sources

Содержимое файла:

# VirtualBox
#
Types:      deb
URIs:       https://download.virtualbox.org/virtualbox/debian/
Suites:     bookworm
Components: contrib
Enabled:    yes
Signed-By:  /etc/apt/keyrings/oracle_vbox_2016.asc
Architectures: amd64

Сохраняем. Теперь надо скачать файл верификации:

cd /etc/apt/keyrings/
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc

Выполняем аналогично для QElectroTech. Создаем файл qelectrotech.sources:

nano  /etc/apt/sources.list.d/qelectrotech.sources

Содержимое файла:

# draw electric diagrams with QElectroTech
#
Types:      deb
URIs:       https://debian.qelectrotech.org/qet/builds/debian/
Suites:     stable
Components: main
Enabled:    yes
Signed-By:  /etc/apt/keyrings/Qelectrotech_Repository.asc
Architectures: amd64

Сохраняем. Cкачиваем файл верификации:

cd /etc/apt/keyrings/
wget -q https://debian.qelectrotech.org/qet/builds/debian/Qelectrotech_Repository.asc

Можно приступить к установке: 

apt update
apt install virtualbox-7.1 qelectrotech

Пользуемся. 

пятница, 21 ноября 2025 г.

Debian + lightdm + xfce. Несколько мониторов в системе.

Имеется рабочее место с 3 мониторами + телевизор. Кода компьютер загружается и появляется окно ввода логина и пароля, оно расположено на не основном мониторе. Будем это исправлять.

Необходимо будет создать файл 99_user.conf в следующей директории:

/usr/share/lightdm/lightdm.conf.d

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

[Seat:*]
display-setup-script=xrandr --output DVI-D-0 --auto --primary --output HDMI-0 --same-as DVI-D-0 --output HDMI-1 --rotate right --left-of DVI-D-0 --output DP-2 --right-of DVI-D-0

Следующий файл 98_user.conf создаем директории:

/usr/share/lightdm/lightdm-gtk-greeter.conf.d

Этим укажем какой монитор сделать активным.Вот пример содержимого файла:

[greeter]
active-monitor=DVI-D-0

Перезагружаем компьютер и пользуемся с удовольствием)

ПС. Посмотреть на какие выходы видеокарты подключены мониторы поможет команда xrandr.

Debian multiseat. Компьютер на нескольких пользователей.

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

Приведу пример как я создал конфигурацию на 2 пользователя, но возможно и более, главное чтобы были необходимые компоненты и достаточно мощности компьютера. Для этого понадобиться 2 видеокарты, встроенная в процессор/материнскую плату и установленная в слот PCI Express (PCI-E), соответственно несколько мониторов и два комплекта периферии (мышь+клавиатура).

Для просмотра конфигурации текущего рабочего места нужно ввести команду, она выведет "дерево" устройств :

loginctl seat-status

Добавление устройств в новое рабочее место производим командой:

loginctl attach имя рабочего места полный путь к устройству

Вот пример добавления в рабочее место с именем seat1 видеокарты:

loginctl attach seat1 /sys/devices/pci0000:00/0000:00:02.0/0000:02:00.0/drm/card1
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:02.0/0000:02:00.0/drm/renderD129
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:02.0/0000:02:00.1/sound/card2

Следующим пунктом я добавил вторую звуковую карту, подключенную в слот PCI, таким образом звуки разных рабочих столов будут разделены:

loginctl attach seat1 /sys/devices/pci0000:00/0000:00:14.4/0000:06:06.0/sound/card3

Далее добавляю USB устройства, точнее USB порты куда подключены клавиатура, мышь и некоторые другие устройства, это не привязывает рабочее место к конкретной модели текущего USB устройства, и при замене например мышки, просто вставьте новую в тот же USB разъем где была старая:

loginctl attach seat1 /sys/devices/pci0000:00/0000:00:12.0/usb6/6-1
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:12.0/usb6/6-2
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:13.0/usb7/7-3
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:16.0/usb9

Чтобы было легче искать необходимое устройство можно воспользоваться следующей командой:

udevadm monitor --environment --udev

Для этого достаем мышь, которой будет пользоваться второй пользователь, из порта USB, вводим вышеуказанную команду и затем вставляем мышь в порт. Остановить вывод команды просто нажав комбинацию клавиш "CTRL" + "C".
Интересующая строка будет содержать add, на пример:

UDEV  [8581.895083] add     /devices/pci0000:00/0000:00:12.0/usb6/6-1
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:12.0/usb6/6-1
SUBSYSTEM=usb
DEVNAME=/dev/bus/usb/006/004
DEVTYPE=usb_device
.....

Для вывода списка созданных рабочих мест вводим:

loginctl list-seats

Для просмотра конфигурации рабочего места seat1 вводим:

loginctl seat-status seat1

Тут должны отобразиться все устройства которые добавляли.

Теперь можно перезагрузить компьютер и войти в систему двумя разными учетными записями.

ПС. Если необходимо удалить все настройки рабочих мест, таким образом можно вернуть всё в начальное состояние, где все устройства "подключены" к рабочему месту по умолчанию seat0, вводим:

loginctl flush-devices

суббота, 16 августа 2025 г.

Conky + mdadm

 Решил выложить свой конфигурационный файл conky и вспомогательный файл для контроля состояния RAID массивов созданных через mdadm.
В данном варианте автоматизирован вывод дополнительной информации:

  • наименовании процессора AMD и его показателях;
  • наименовании видеокарты nVidia и её показателях;
  • о сетевых подключениях LAN (enp5s0) и Wi-Fi (wlp4s0) в зависимости от способа подключения к сети.

Содержимое conky.conf, расположенного по  следующему пути /home/$USER/.config/conky/:

--[[
Conky, a system monitor, based on torsmo
]]

conky.config = {
    alignment = 'top_right',
    background = true,
    border_width = 0,
    cpu_avg_samples = 2,
    default_color = 'white',
    default_outline_color = 'white',
    default_shade_color = 'black',
    double_buffer = true,
    draw_borders = false,
    draw_graph_borders = true,
    draw_outline = false,
    draw_shades = true,
    extra_newline = false,
    font = 'DejaVu Sans Mono:size=10',
    gap_x = 50,
    gap_y = 50,
    minimum_height = 50,
    minimum_width = 350,
    net_avg_samples = 2,
    no_buffers = true,
    out_to_console = false,
    out_to_ncurses = false,
    out_to_stderr = false,
    out_to_x = true,
    own_window = true,
    own_window_argb_value = 180,
    own_window_argb_visual = true,
    own_window_class = 'Conky',
    own_window_hints = 'sticky',
    own_window_type = 'normal',
    own_window_transparent = false,
    use_spacer = 'left',
    show_graph_range = false,
    show_graph_scale = false,
    stippled_borders = 0,
    update_interval = 1.0,
    uppercase = false,
    use_spacer = 'none',
    use_xft = true,
    xinerama_head = 1,
}

conky.text = [[
$nodename | $time
${scroll 40 $sysname $kernel on $machine}
${color green}Uptime:${alignr 1}$uptime
${color lightblue}${voffset -6}$hr$color
${color grey}CPU: ${color #FCAF3E}${execi 3600 cat /proc/cpuinfo | grep 'model name' | sed -e 's/model name.*: //' | uniq | awk '{print $0}'}
${color grey}CPU Temperature ${alignr 1}${color}${execi 10 sensors | grep 'k10|CPU' -E -A2 | grep '°C' | awk '{print $2}'}
${color grey}CPU Utilization ${alignr 1}${color}$cpu %
${color grey}CPU Frequency ${alignr 1}${color}$freq MHz
${color grey}GPU: ${color #FCAF3E}${execi 3600 nvidia-smi --query-gpu=gpu_name --format=csv,noheader,nounits} $color
${color grey}GPU Temperature ${alignr 1}${color}${execi 10 nvidia-settings -query [gpu:0]/GPUCoreTemp -t} °C
${color grey}GPU Utilization ${alignr 1}${color}${exec nvidia-smi | grep % | cut -c 71-73} %
${color grey}VRAM Utilization ${alignr 1}${color}${exec nvidia-smi | grep % | cut -c 47-64}
${color grey}GPU Power Draw ${alignr 1}${color}${exec nvidia-smi | grep % | cut -c 29-41}
${color grey}RAM Usage: ${alignr 1}${color}$mem / $memmax
$memperc% ${alignr 350}${color gold}${membar 10}
${color grey}Swap Usage: ${alignr 1}${color}$swap/$swapmax
$swapperc% ${alignr 350}${color gold}${swapbar 10}
${color lightblue}${voffset -6}$hr
${color grey}File systems:
${color lightblue}/ $color${fs_used /}/${fs_size /}
${color gold}${fs_bar 8 /}
${color lightblue}/home $color${fs_used /home}/${fs_size /home}
${color gold}${fs_bar 8 /home}
${color lightblue}/mnt/images[md121] $color${fs_used /mnt/images}/${fs_size /mnt/images}
${color gold}${fs_bar 8 /mnt/images}
${color lightblue}/mnt/multimedia[md122] $color${fs_used /mnt/multimedia}/${fs_size /mnt/multimedia}
${color gold}${fs_bar 8 /mnt/multimedia}
${color lightblue}${voffset -6}$hr
${color grey}   Name             __PID__ ${color 33E0FF}_CPU%_ ${color FF33E0}_MEM%_
${color 33E0FF}CPU% ${stippled_hr 1}
${color red}   ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
${color purple}   ${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
${color orange}   ${top name 3} ${top pid 3} ${top cpu 3} ${top mem 3}
${color FF33E0}MEM% ${stippled_hr 1}
${color red}   ${top_mem name 1} ${top_mem pid 1} ${top_mem cpu 1} ${top_mem mem 1}
${color purple}   ${top_mem name 2} ${top_mem pid 2} ${top_mem cpu 2} ${top_mem mem 2}
${color orange}   ${top_mem name 3} ${top_mem pid 3} ${top_mem cpu 3} ${top_mem mem 3}
${color grey}${voffset -6}$hr
${color 33E0FF}${cpugraph cpu0 50,50 33E0FF FF0000 -tl} ${cpugraph cpu1 50,50 33E0FF FF0000 -tl} ${cpugraph cpu2 50,50 33E0FF FF0000 -tl} ${cpugraph cpu3 50,50 33E0FF FF0000 -tl} ${color FF33E0}${memgraph 50,120 FF33E0 FF0000 -tl}
${color grey}Processes:$color $processes  ${color grey}Running:$color $running_processes
${if_up enp5s0}${color lightblue}${voffset -6}$hr
${color grey}LAN up/down:${alignr 1}$color${upspeed enp5s0} / ${downspeed enp5s0}
$endif${if_up wlp4s0}${color lightblue}${voffset -6}$hr
${color grey}Wi-Fi up/down:${alignr 1}$color${upspeed wlp4s0} / ${downspeed wlp4s0}
$endif${color lightblue}${voffset -6}$hr
${color grey}md121 $color ${eval $${if_match "0" == "${execi 60 cat /proc/mdstat | grep md121 -A 1 | gawk -f ~/bin/conky4mdadm.sh --}"}$${color red}Warning!$${else}$${color green}[UU]$${endif}} ${color grey} ${diskio_read /dev/md121} ${color grey} ${diskio_write /dev/md121}
${color grey}md122 $color ${eval $${if_match "0" == "${execi 60 cat /proc/mdstat | grep md122 -A 1 | gawk -f ~/bin/conky4mdadm.sh --}"}$${color red}Warning!$${else}$${color green}[UU]$${endif}} ${color grey} ${diskio_read /dev/md122} ${color grey} ${diskio_write /dev/md122}
${color lightblue}${voffset -6}$hr
${color grey}ssd1 ${color grey} ${diskio_read /dev/sdd1} ${color grey} ${diskio_write /dev/sdd1}
${color grey}ssd2 ${color grey} ${diskio_read /dev/sdd2} ${color grey} ${diskio_write /dev/sdd2}
]]

Содержимое conky4mdadm.sh, расположенного по  следующему пути /home/$USER/bin/:

#!/bin/gawk -f
# This script checks the status of RAID arrays from /proc/mdstat
/_/ { state = 0; exit }
/blocks/ { state = 1 }
END { print state }

Файлу устанавливаем разрешение на исполнение.

ПС. Расположение окна программы привязано к правому верхнему углу первого монитора, т.к. я использую несколько мониторов и по умолчанию оно расположено не на том который мне нужен был.

вторник, 19 ноября 2024 г.

Debian + Arduino +ESP32 - фиксируем порты)

Столкнулся с необходимостью "закрепить" порт за микроконтроллером типа Arduino Nano/Uno и ESP32, особенно если кроме этих плат у вас есть другие usb устройства с виртуальным COM-портом, например такими как usb-ttl платы и др.

Создаем в каталоге /etc/udev/rules.d файл 99-usb-mk.rules со следующим содержимым:

# Fix Arduino (CH340) and ESP (CH9102)
ACTION!="add", SUBSYSTEMS!="usb", GOTO="END"
KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", SYMLINK+="ttyESP", MODE:="0660", GROUP="dialout"
KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyARD", MODE:="0660", GROUP="dialout"
LABEL="END"

 

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

udevadm control --reload

Готово. Теперь к Arduino и ESP можем обращаться через /dev/ttyARD и /dev/ttyESP соответственно.

Ну и проверьте входит ли ваш пользователь в группу dialout.

ПС. К сожалению те же платы usb-ttl могут встречаться на аналогичных микросхемах что приведет к ложной фиксации порта. 

ПСС. Добавление группы пользователю:

sudo usermod -a -G dialout $USER

среда, 20 апреля 2022 г.

x11vnc как демон

Создаем "Удаленный рабочий стол" как сервис в linux.


Создал файл следующего содержимого:

 cat > /etc/systemd/system/x11vnc.service <<\eof
[Unit]
Description=VNC Server for X11
Requires=display-manager.service
After=network-online.target ##optional for better performance
Wants=network-online.target ##optional for better performance
[Service]
ExecStart=/usr/bin/x11vnc -auth guess -display :0 -rfbauth /etc/x11vnc.pwd -shared -forever -rfbport 5909 -o /var/log/x11vnc.log
ExecStop=/usr/bin/x11vnc -R stop
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
eof
echo Zadajte parol dlja dostupa:
x11vnc -storepasswd /etc/x11vnc.pwd
echo Zapusk:
echo systemctl start x11vnc
systemctl daemon-reload

Опишу что делаем с помощью него:
- создаем файл /etc/systemd/system/x11vnc.service, который будет являться демоном системы;
- создаем пароль для доступа;
- обновляем в системе список демонов.

Основой сервера удаленных рабочих столов служит x11vnc.
Сам демон не включен в автоматический старт после загрузки системы, мне не нужен был постоянный доступ к рабочему столу. Для запуска используем:

systemctl start x11vnc

Можно включить демон на постоянно:

systemctl enable x11vnc

Пробуем подключиться. Для Windows использовал UltraVNC Viewer,  а в Debian - Remmina.

среда, 25 сентября 2019 г.

FreePBX (памятка 2)

Копируем библиотеку для 3G модема chan_dongle.so.

Создаем файл 92-ttyUSB.rules со следующим содержимым:

# ustanowka praw ttyUSB* dlja asterisk
KERNEL=="ttyUSB*", MODE="0660", OWNER="asterisk", GROUP="dialout"

Создаем файл dongle.conf со следующим содержимым:

[general]

interval=15   ; Number of seconds between trying to connect to devices

;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
;jbenable = yes   ; Enables the use of a jitterbuffer on the receiving side of a
    ; Dongle channel. Defaults to "no". An enabled jitterbuffer will
    ; be used only if the sending side can create and the receiving
    ; side can not accept jitter. The Dongle channel can't accept jitter,
    ; thus an enabled jitterbuffer on the receive Dongle side will always
    ; be used if the sending side can create jitter.

;jbforce = no   ; Forces the use of a jitterbuffer on the receive side of a Dongle
    ; channel. Defaults to "no".

;jbmaxsize = 200  ; Max length of the jitterbuffer in milliseconds.

;jbresyncthreshold = 1000 ; Jump in the frame timestamps over which the jitterbuffer is
    ; resynchronized. Useful to improve the quality of the voice, with
    ; big jumps in/broken timestamps, usually sent from exotic devices
    ; and programs. Defaults to 1000.

;jbimpl = fixed   ; Jitterbuffer implementation, used on the receiving side of a Dongle
    ; channel. Two implementations are currently available - "fixed"
    ; (with size always equals to jbmaxsize) and "adaptive" (with
    ; variable size, actually the new jb of IAX2). Defaults to fixed.

;jbtargetextra = 40  ; This option only affects the jb when 'jbimpl = adaptive' is set.
    ; The option represents the number of milliseconds by which the new jitter buffer
    ; will pad its size. the default is 40, so without modification, the new
    ; jitter buffer will set its size to the jitter value plus 40 milliseconds.
    ; increasing this value may help if your network normally has low jitter,
    ; but occasionally has spikes.

;jblog = no   ; Enables jitterbuffer frame logging. Defaults to "no".
;-----------------------------------------------------------------------------------

[defaults]
; now you can set here any not required device settings as template
;   sure you can overwrite in any [device] section this default values

;context=default   ; context for incoming calls
;context=from-trunk1-cust
context=from-trunk
group=0    ; calling group
rxgain=0   ; increase the incoming volume; may be negative
txgain=0   ; increase the outgoint volume; may be negative
autodeletesms=yes  ; auto delete incoming sms
resetdongle=yes   ; reset dongle during initialization with ATZ command
u2diag=-1   ; set ^U2DIAG parameter on device (0 = disable everything except modem function) ; -1 not use ^U2DIAG command
usecallingpres=yes  ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation  by default use default network settings
disablesms=no   ; disable of SMS reading from device when received
    ;  chan_dongle has currently a bug with SMS reception. When a SMS gets in during a
    ;  call chan_dongle might crash. Enable this option to disable sms reception.
    ;  default = no

;language=en   ; set channel default language
language=ru
smsaspdu=yes   ; if 'yes' send SMS in PDU mode, feature implementation incomplete and we strongly recommend say 'yes'
mindtmfgap=45   ; minimal interval from end of previews DTMF from begining of next in ms
mindtmfduration=80  ; minimal DTMF tone duration in ms
mindtmfinterval=200  ; minimal interval between ends of DTMF of same digits in ms

callwaiting=auto  ; if 'yes' allow incoming calls waiting; by default use network settings
    ; if 'no' waiting calls just ignored
disable=no   ; OBSOLETED by initstate: if 'yes' no load this device and just ignore this section

initstate=start   ; specified initial state of device, must be one of 'stop' 'start' 'remote'
    ;   'remove' same as 'disable=yes'

exten=+123456789012  ; exten for start incoming calls, only in case of Subscriber Number not available!, also set to CALLERID(ndid)

dtmf=relax   ; control of incoming DTMF detection, possible values:
    ;   off    - off DTMF tones detection, voice data passed to asterisk unaltered
    ;              use this value for gateways or if not use DTMF for AVR or inside dialplan
    ;   inband - do DTMF tones detection
    ;   relax  - like inband but with relaxdtmf option
    ;  default is 'relax' by compatibility reason

; dongle required settings
[dongle0]
context=from-trunk-Mobile-v180e
audio=/dev/ttyUSB1  ; tty port for audio connection;  no default value
data=/dev/ttyUSB2  ; tty port for AT commands;   no default value

; or you can omit both audio and data together and use imei=123456789012345 and/or imsi=123456789012345
;  imei and imsi must contain exactly 15 digits !
;  imei/imsi discovery is available on Linux only
imei=123456789012345
imsi=123456789012345

; if audio and data set together with imei and/or imsi audio and data has precedence
;   you can use both imei and imsi together in this case exact match by imei and imsi required



редактируем файл extensions_custom.conf:

[from-trunk-Mobile]
exten => _X!,1,Noop(from-pstn-custom,${CALLERID(num)},${CHANNEL(linkedid)})
exten => _X!,n,System(echo ${CHANNEL(linkedid)}_${UNIQUEID}_${EXTEN} > /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,Set(__IN_CALLERID=${CALLERID(num)})
exten => _X!,n,Set(__IN_CALLERID=${IF($[${LEN(${IN_CALLERID})}=6]?375162${IN_CALLERID}:${IF($["${IN_CALLERID:0:2}"="80"]?375${IN_CALLERID:2}:${IF($["${IN_CALLERID:0:1}"="8"]?375${IN_CALLERID:1}:${IF($["${IN_CALLERID:0:4}"="+375"]?${IN_CALLERID:1}:${IN_CALLERID})})})})})
exten => _X!,n,Set(CALLERID(num)=${IN_CALLERID})
exten => _X!,n,Set(CALLERID(name)=${CALLERID(num)})
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,Goto(from-trunk,${EXTEN},1)

FreePBX (памятка 1)


extensions_override_freepbx.conf - правки через подключение по ssh или напрямую на сервере FreePBX. Скопировав готовые правила, добавим запуск своих скриптов:
 
[macro-dial-one]
include => macro-dial-one-custom
exten => s,1,Set(DEXTEN=${ARG3})
exten => s,n,Set(__CRM_SOURCE=${CALLERID(num)})
exten => s,n(setexttocall),ExecIf($[${LEN(${EXTTOCALL})}=0 & ${LEN(${DEXTEN})}>0]?Set(__EXTTOCALL=${DEXTEN}))
exten => s,n,Set(DIALSTATUS_CW=)
exten => s,n,GosubIf($["${FROM_DID}"!="" & "${SCREEN}"="" & "${SIGNORE}"="" & "${DB(AMPUSER/${DEXTEN}/screen)}"!=""]?screen,1())
exten => s,n,GosubIf($["${DB(CF/${DEXTEN})}"!=""]?cf,1())
exten => s,n,GotoIf($["${DEXTEN:-1}"="#" | "${DB(DND/${DEXTEN})}"=""]?skip1)
exten => s,n,Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=BUSY)
exten => s,n(skip1),GotoIf($["${DEXTEN}"=""]?nodial)
exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?continue)
exten => s,n,Set(EXTHASCW=${IF($["${CWIGNORE}"!=""]? :${DB(CW/${DEXTEN})})})
exten => s,n,GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!="" | "${DB(CFU/${DEXTEN})}"!=""]?next1:cwinusebusy)
exten => s,n(next1),GotoIf($["${DB(CFU/${DEXTEN})}"!="" & ("${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN")]?docfu:skip3)
exten => s,n(docfu),Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=NOANSWER)
exten => s,n,Goto(nodial)
exten => s,n(skip3),GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!=""]?next2:continue)
exten => s,n(next2),GotoIf($["${EXTENSION_STATE(${DEXTEN})}"="NOT_INUSE" | "${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN"]?continue)
exten => s,n,ExecIf($["${DB(CFB/${DEXTEN})}"!="" & "${CFIGNORE}"=""]?Set(DIALSTATUS=BUSY))
exten => s,n,GotoIf($["${EXTHASCW}"!="" | "${DEXTEN:-1}"="#"]?cwinusebusy)
exten => s,n,Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=BUSY)
exten => s,n,Goto(nodial)
exten => s,n(cwinusebusy),GotoIf($["${EXTHASCW}"!="" & "${CWINUSEBUSY}"="true"]?next3:continue)
exten => s,n(next3),ExecIf($["${EXTENSION_STATE(${DEXTEN})}"!="UNAVAILABLE" & "${EXTENSION_STATE(${DEXTEN})}"!="NOT_INUSE" & "${EXTENSION_STATE(${DEXTEN})}"!="UNKNOWN"]?Set(DIALSTATUS_CW=BUSY))
exten => s,n(continue),GotoIf($["${DEXTEN}"=""]?nodial)
exten => s,n,GosubIf($["${DEXTEN:-1}"!="#"]?dstring,1():dlocal,1())
exten => s,n,GotoIf($[${LEN(${DSTRING})}=0]?nodial)
exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?skiptrace)
exten => s,n,GosubIf($[${REGEX("^[\+]?[0-9]+$" ${CALLERID(number)})} = 1]?ctset,1():ctclear,1())
exten => s,n(skiptrace),Set(D_OPTIONS=${IF($["${NODEST}"!="" & ${REGEX("(M[(]auto-blkvm[)])" ${ARG2})} != 1]?${ARG2}M(auto-blkvm):${ARG2}M(my-1^${ARG1}^${CDR(cnam)}^${ARG3}))})
exten => s,n,GosubIf($["${ALERT_INFO}"!="" & "${HASH(SIPHEADERS,Alert-Info)}"=""]?func-set-sipheader,s,1(Alert-Info,${ALERT_INFO}))
exten => s,n,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER}, User: ${AMPUSER}, Alert Info: ${ALERT_INFO})
exten => s,n,ExecIf($["${ALERT_INFO}"="" & ${LEN(${AMPUSER})}!=0 & ${LEN(${BLINDTRANSFER})}=0 & ${LEN(${ATTENDEDTRANSFER})}=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})}!=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($[${LEN(${ATTENDEDTRANSFER})}!=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($["${RVOL}"!=""]?Set(ALERT_INFO=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${RVOL}))
exten => s,n,ExecIf($["${RVOL}"="" & "${DB(AMPUSER/${EXTTOCALL}/rvolume)}" != ""]?Set(ALERT_INFO=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${DB(AMPUSER/${EXTTOCALL}/rvolume)}))
exten => s,n,GosubIf($["${ALERT_INFO}"!="" & "${ALERT_INFO}"!=" "]?func-set-sipheader,s,1(Alert-Info,${ALERT_INFO}))
exten => s,n,ExecIf($[("${MOHCLASS}"!="default") & ("${MOHCLASS}"!="")]?Set(CHANNEL(musicclass)=${MOHCLASS}))
exten => s,n,GosubIf($["${QUEUEWAIT}"!=""]?qwait,1())
exten => s,n,Set(__CWIGNORE=${CWIGNORE})
exten => s,n,Set(__KEEPCID=TRUE)
exten => s,n,GotoIf($["${USEGOTO}"="1"]?usegoto,1)
exten => s,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cidname)}" = "" || "${DB(AMPUSER/${AMPUSER}/cidname)}" = ""]?godial)
exten => s,n,Gosub(sub-presencestate-display,s,1(${EXTTOCALL}))
exten => s,n,Set(CONNECTEDLINE(name,i)=${DB(AMPUSER/${EXTTOCALL}/cidname)}${PRESENCESTATE_DISPLAY})
exten => s,n,Set(CONNECTEDLINE(num)=${EXTTOCALL})
exten => s,n,Set(D_OPTIONS=${D_OPTIONS}I)
exten => s,n(godial),Macro(dialout-one-predial-hook,)
exten => s,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(D_OPTIONS=${STRREPLACE(D_OPTIONS,T)}I))
exten => s,n(dialapp),Noop()
exten => s,n,ExecIf($["${ivrreturn}" = "1"]?Set(D_OPTIONS=${D_OPTIONS}g))
exten => s,n(dial),Dial(${DSTRING},${ARG1},${D_OPTIONS}b(func-apply-sipheaders^s^1))
exten => s,n,ExecIf($["${DIALSTATUS}"="ANSWER" & "${CALLER_DEST}"!=""]?MacroExit())
exten => s,n,ExecIf($["${DIALSTATUS_CW}"!=""]?Set(DIALSTATUS=${DIALSTATUS_CW}))
exten => s,n,GosubIf($[("${SCREEN}"!=""&("${DIALSTATUS}"="TORTURE"|"${DIALSTATUS}"="DONTCALL"))|"${DIALSTATUS}"="ANSWER"]?s-${DIALSTATUS},1())
exten => s,n,MacroExit()
exten => s,n(nodial),Noop()
exten => s,n,ExecIf($["${DIALSTATUS}" = ""]?Set(DIALSTATUS=NOANSWER))
exten => s,n,Noop(Returned from dial-one with nothing to call and DIALSTATUS: ${DIALSTATUS})
exten => s,n,MacroExit()
exten => s,n,GotoIf($["${ZULU_RAW_TYPE}"!="Sangomacrm-url"]?crm-save)
exten => s,n,AGI(sangomacrm.agi,true)
exten => s,n,Goto(zulu-event)
exten => s,n(crm-save),AGI(sangomacrm.agi)
 
exten => h,1,Macro(hangupcall,)
 
exten => usegoto,1,Set(USEGOTO=)
exten => usegoto,n,Goto(from-internal,${DSTRING},1)
 
exten => screen,1,GotoIf($["${DB(AMPUSER/${DEXTEN}/screen)}"!="nomemory" | "${CALLERID(number)}"=""]?memory)
exten => screen,n,ExecIf($[${REGEX("^[0-9a-zA-Z ]+$" ${CALLERID(number)})} = 1]?System(rm -f ${ASTVARLIBDIR}/sounds/priv-callerintros/${CALLERID(number)}.*))
exten => screen,n(memory),Set(__SCREEN=${DB(AMPUSER/${DEXTEN}/screen)})
exten => screen,n,Set(__SCREEN_EXTEN=${DEXTEN})
exten => screen,n,Set(ARG2=${ARG2}p)
exten => screen,n,Return()
 
exten => cf,1,Set(CFAMPUSER=${IF($["${AMPUSER}"=""]?${CALLERID(number)}:${AMPUSER})})
exten => cf,n,ExecIf($["${DB(CF/${DEXTEN})}"="${CFAMPUSER}" | "${DB(CF/${DEXTEN})}"="${REALCALLERIDNUM}" | "${CUT(CUT(BLINDTRANSFER,-,1),/,1)}" = "${DB(CF/${DEXTEN})}" | "${DEXTEN}"="${DB(CF/${DEXTEN})}"]?Return())
exten => cf,n,ExecIf($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != "0" & "${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != ""]?Set(ARG1=${IF($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}"="-1"]? : ${DB(AMPUSER/${DEXTEN}/cfringtimer)})}))
exten => cf,n,ExecIf($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}" == "0"]?Set(ARG1=${IF($["${DB(FREEPBXCONF/CFRINGTIMERDEFAULT)}"="-1"]? : ${DB(FREEPBXCONF/CFRINGTIMERDEFAULT)})}))
exten => cf,n,Set(DEXTEN=${IF($["${CFIGNORE}"=""]?"${DB(CF/${DEXTEN})}#": )})
exten => cf,n,ExecIf($["${DEXTEN}"!=""]?Return())
exten => cf,n,Set(DIALSTATUS=NOANSWER)
exten => cf,n,Return()
 
exten => qwait,1,ExecIf($["${SAVEDCIDNAME}" = ""]?Set(__SAVEDCIDNAME=${CALLERID(name)}))
exten => qwait,n,Set(ELAPSED=${MATH($[${EPOCH}+30-${QUEUEWAIT}]/60,int)})
exten => qwait,n,Set(CALLERID(name)=M${ELAPSED}:${SAVEDCIDNAME})
exten => qwait,n,Return()
 
exten => ctset,1,Set(DB(CALLTRACE/${DEXTEN})=${CALLERID(number)})
exten => ctset,n,Return()
 
exten => ctclear,1,Noop(Deleting: CALLTRACE/${DEXTEN} ${DB_DELETE(CALLTRACE/${DEXTEN})})
exten => ctclear,n,Return()
 
exten => dstring,1,Set(DSTRING=)
exten => dstring,n,Set(DEVICES=${DB(AMPUSER/${DEXTEN}/device)})
exten => dstring,n,ExecIf($["${DEVICES}"=""]?Return())
exten => dstring,n,ExecIf($["${DEVICES:0:1}"="&"]?Set(DEVICES=${DEVICES:1}))
exten => dstring,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => dstring,n,Set(ITER=1)
exten => dstring,n(begin),Set(THISDIAL=${DB(DEVICE/${CUT(DEVICES,&,${ITER})}/dial)})
exten => dstring,n,GosubIf($["${ASTCHANDAHDI}" = "1"]?zap2dahdi,1())
exten => dstring,n,GotoIf($["${THISDIAL:0:5}"!="PJSIP"]?docheck)
exten => dstring,n,Noop(Debug: Found PJSIP Destination ${THISDIAL})
exten => dstring,n,GotoIf($[ ${REGEX("(/.+/|@)" ${THISDIAL})} = 1 ]?doset)
exten => dstring,n,Noop(Debug: Updating PJSIP Destination with PJSIP_DIAL_CONTACTS)
exten => dstring,n,Set(THISDIAL=${PJSIP_DIAL_CONTACTS(${THISDIAL:6})})
exten => dstring,n,ExecIf($["${THISDIAL}"=""]?Set(DIALSTATUS=CHANUNAVAIL))
exten => dstring,n(docheck),GotoIf($["${THISDIAL}"=""]?skipset)
exten => dstring,n(doset),Set(DSTRING=${DSTRING}${THISDIAL}&)
exten => dstring,n(skipset),Set(ITER=$[${ITER}+1])
exten => dstring,n,GotoIf($[${ITER}<=${LOOPCNT}]?begin)
exten => dstring,n,ExecIf($["${DSTRING:-1}"!="&"]?Return())
exten => dstring,n,Set(DSTRING=${DSTRING:0:$[${LEN(${DSTRING})}-1]})
exten => dstring,n,Return()
 
exten => dlocal,1,Set(DSTRING=${IF($["${ARG1}"=""]?${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}:Local/${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}@from-internal/n)})
exten => dlocal,n,Set(USEGOTO=${IF($["${ARG1}"=""]?1:0)})
exten => dlocal,n,Return()
 
exten => zap2dahdi,1,ExecIf($["${THISDIAL}" = ""]?Return())
exten => zap2dahdi,n,Set(NEWDIAL=)
exten => zap2dahdi,n,Set(LOOPCNT2=${FIELDQTY(THISDIAL,&)})
exten => zap2dahdi,n,Set(ITER2=1)
exten => zap2dahdi,n(begin2),Set(THISPART2=${CUT(THISDIAL,&,${ITER2})})
exten => zap2dahdi,n,ExecIf($["${THISPART2:0:3}" = "ZAP"]?Set(THISPART2=DAHDI${THISPART2:3}))
exten => zap2dahdi,n,Set(NEWDIAL=${NEWDIAL}${THISPART2}&)
exten => zap2dahdi,n,Set(ITER2=$[${ITER2} + 1])
exten => zap2dahdi,n,GotoIf($[${ITER2} <= ${LOOPCNT2}]?begin2)
exten => zap2dahdi,n,Set(THISDIAL=${NEWDIAL:0:$[${LEN(${NEWDIAL})}-1]})
exten => zap2dahdi,n,Return()
 
exten => s-ANSWER,1,Noop(Call successfully answered - Hanging up now)
exten => s-ANSWER,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-ANSWER,n(bye),Macro(hangupcall,)
 
exten => s-TORTURE,1,Goto(app-blackhole,musiconhold,1)
exten => s-TORTURE,n,Macro(hangupcall,)
 
exten => s-DONTCALL,1,Answer
exten => s-DONTCALL,n,Wait(1)
exten => s-DONTCALL,n,Zapateller()
exten => s-DONTCALL,n,Playback(ss-noservice)
exten => s-DONTCALL,n,Macro(hangupcall,)
 
exten => s-CHANUNAVAIL,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-CHANUNAVAIL,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-CHANUNAVAIL,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-CHANUNAVAIL,n,Return()
 
exten => s-NOANSWER,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-NOANSWER,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-NOANSWER,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-NOANSWER,n,Return()
 
exten => s-BUSY,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-BUSY,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-BUSY,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-BUSY,n,Return()
 
;--== end of [macro-dial-one] ==--;
 
 
[macro-auto-blkvm]
include => macro-auto-blkvm-custom
exten => s,1,ExecIf($["${FROMQ}" = "true" & "${CALLFILENAME}" != "" & "${CDR(recordingfile)}" = ""]?Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT}))
exten => s,n,Set(__MACRO_RESULT=)
exten => s,n,Set(CFIGNORE=)
exten => s,n,Set(MASTER_CHANNEL(CFIGNORE)=)
exten => s,n,Set(FORWARD_CONTEXT=from-internal)
exten => s,n,Set(MASTER_CHANNEL(FORWARD_CONTEXT)=from-internal)
exten => s,n,Macro(blkvm-clr,)
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(num))=${DIALEDPEERNUMBER}))
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(name))=${DB(AMPUSER/${DIALEDPEERNUMBER}/cidname)}))
exten => s,n,Macro(my-2,${DIALEDPEERNUMBER},${CALLINGPRES},${SIPCALLID})
 
;--== end of [macro-auto-blkvm] ==--;
 




extensions_custom.conf - правки через web-интерфейс FreePBX:


[from-trunk-my-custom]
exten => _X!,1,System(echo ${UNIQUEID}_${EXTEN} > /tmp/tr_${UNIQUEID}_${CALLERID(num)}.txt)
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${UNIQUEID}_${CALLERID(num)}.txt)
exten => _X!,n,Set(_IN_CALLERID=${CALLERID(num)})
exten => _X!,n,Goto(from-trunk,${EXTEN},1)
 
[macro-my-1]
exten => s,1,Noop(macro-my-1,${CALLERID(num)},${FROMEXTEN},${TIMESTR},${UNIQUEID})
exten => s,n,Set(StrURL=http://zzz.ttttt.yyy/cgi-bin/test_01?s_=0&n_=1&e_=0&add_=)
exten => s,n,Set(ParamURL=external,${CALLERID(num)},${FROMEXTEN},${STRREPLACE(TIMESTR,"-",",")},${UNIQUEID},macro_my-1)
exten => s,n,System(echo '${StrURL}${ParamURL}' > /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,Set(SSS=${StrURL}${ParamURL})
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,Set(CURLOPT(httptimeout)=3)
exten => s,n,Set(SSS=$[CURL(${SSS})])
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,MacroExit()
 
[macro-my-2]
exten => s,1,Noop(macro-my-2,${CALLERID(num)},${FROMEXTEN},${TIMESTR},${UNIQUEID})
exten => s,n,Set(StrURL=http://zzz.ttttt.yyy/cgi-bin/test_02?s_=0&n_=1&e_=0&add_=)
exten => s,n,Set(ParamURL=external,${CALLERID(num)},${FROMEXTEN},${STRREPLACE(TIMESTR,"-",",")},${UNIQUEID},macro_my-2)
exten => s,n,System(echo '${StrURL}${ParamURL}' > /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,Set(SSS=${StrURL}${ParamURL})
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,Set(CURLOPT(httptimeout)=3)
exten => s,n,Set(SSS=$[CURL(${SSS})])
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,MacroExit()

суббота, 15 июля 2017 г.

Debian 9 + Xfce + TouchPad


apt-get install xserver-xorg-input-synaptics

/usr/share/X11/xorg.conf.d/70-synaptics.conf

/etc/X11/xorg.conf.d/70-synaptics.conf
Section "InputClass"
    Identifier "touchpad catchall"
    Driver "synaptics"
    MatchIsTouchpad "on"
        Option "TapButton1" "1"
        Option "TapButton2" "3"
        Option "TapButton3" "2"
EndSection

пятница, 7 июля 2017 г.

Debian 9 (Stretch) + Realtek usb wi-fi (RTL8187B)

Столкнулся с проблемой на Debian 9 (Stretch) со встроенной в ноутбук беспроводной сетевой картой на чипсете Realtek RTL8187B.
Установка пакета firmware-realtek (дополнительные не свободные прошивки к сетевым картам Realtek) не помогла. Сеть видна, а соединения ни с одной доступной сетью не происходило.

Решение оказалось довольно простым.
Дописать в конфигурационный файл /etc/NetworkManager/NetworkManager.conf строки:

[device]
wifi.scan-rand-mac-address=no

В итоге содержимое файла такое:
[main]
plugins=ifupdown,keyfile
[ifupdown]
managed=false
[device]
wifi.scan-rand-mac-address=no
После перезагрузки системы, связь с сетью устанавливается.

среда, 1 февраля 2017 г.

SIS 771/671 + Debian 8, установка правильного разрешения экрана.

Устанавливал на ноутбук с видеокартой SIS 771/671 ОС Debian8 Jessie (актуально и для Debian 9 Stretch) и столкнулся с проблемой - разрешение экрана не возможно выставить в оригинальном формате, максимум 1024*768.
Решение проблемы было найдено на просторах интернета и оказалось довольно простым.

Запускаем терминал. Повышаем свои права до root-а с помощью su  (или воспользовавшись sudo) запускаем ниже приведенную команду:

nano /etc/X11/xorg.conf

Этим мы создаем конфигурационный файл для X-ов. Заполняем его следующими строчками:

Section "Device"
  Identifier "Generic Video Card"
    VendorName  "Silicon Integrated Systems [SiS]"
        BoardName   "771/671 PCIE VGA Display Adapter"
    Busid "PCI:1:0:0"
    Driver "vesa"
    Screen 0
        Option "UseFBDev" "true"
        Option "DPMS"
        Option "ShadowFB"
        Option "MaxXFBMem"
        VideoRam 262016
        Option "RenderAccel" "true"
        Option "AllowGLXWithComposite" "true"
        Option "backingstore" "true"
        Option "AddARGBGLXVisuals" "True"
EndSection
Section "Monitor"
    Identifier    "Configured Monitor"
    Vendorname    "Generic LCD Display"
    Modelname    "LCD Panel 1280x800"
    HorizSync 20-107
        VertRefresh 50-185
  modeline  "800x600@56" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync
  modeline  "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
  modeline  "1280x768@60" 80.14 1280 1344 1480 1680 768 769 772 795 -hsync +vsync
  modeline  "1280x720@60" 74.48 1280 1336 1472 1664 720 721 724 746 -hsync +vsync
  modeline  "1280x800@60" 83.46 1280 1344 1480 1680 800 801 804 828 -hsync +vsync
    Gamma    1.0
EndSection
Section "Screen"
    Identifier    "Default Screen"
    Monitor        "Configured Monitor"
    Device        "Configured Video Device"
    Defaultdepth    24
    SubSection "Display"
        Depth    24
        Virtual    1280    768
        Modes        "1280x768@60"    "1280x720@60"    "800x600@60"    "1280x800@60"    "800x600@56"
    EndSubSection
EndSection
Section "Module"
    Load "dri"
    Load "dbe" # Double-Buffering Extension
    Load "v4l" # Video for Linux
    Load "extmod"
    Load "type1"
    Load "freetype"
    Load "glx" # 3D layer
    Load "GLcore"
    Load "i2c"
    Load "bitmap"
    Load "ddc"
    Load "int10"
    Load "vbe"
    Load "speedo"
    Load "record"
EndSection
Section "DRI"
        Mode 0666
EndSection

Сохраняем и перезагружаем систему.
Пользуемся.


четверг, 14 июня 2012 г.

Установка Debian 6 на старый ноутбук. Третий этап.

Третий этап. Берем напильник....

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

Yamaha YMF-744 и Debian Squeeze.

По адресу http://wiki.debian.org/snd-ymfpci написано решение проблемы, правда на английском языке. Поэтому я решил написать мини-инструкцию на русском. В некотором смысле грубый перевод, со своими дополнениями и разъяснениями.
Нам необходимо установить звуковую систему "alsa", вместе с ее утилитами и пакет с набором программ для возможности дальнейших действий - создания необходимых файлов:
sudo aptitude install alsa-base alsa-utils build-essential
С помощью следующей команды скачаем необходимый файл, точнее архив с исходными кодами, из интернета:
wget ftp://ftp.alsa-project.org/pub/firmware/alsa-firmware-1.0.25.tar.bz2
Тут у меня появилась проблема - данный адрес, точнее сервер, на момент написания, не был доступен, пришлось искать зеркало. Вот по этому адресу http://mirrors.zerg.biz/alsa/firmware/alsa-firmware-1.0.25.tar.bz2 у меня получилось скачать необходимый файл. В этом случае измените в выше написанной команде адрес.

Небольшое отступление от основной темы. В нашей системе уже есть не только программа для закачки - "wget", но даже интернет браузер - "w3m", программа для работы с архивами - "tar" и много других, которые работают в консоли. Попробуйте ввести вот эту команду:
w3m debian.org
или
w3m alsa-project.org
У вас начнется загружаться страничка по введенному адресу. Как видите, консолью можно пользоваться и не только для ввода одних сплошных команд, а даже просмотреть в интернете нужную информацию. Для выхода  из браузера нажмите клавишу "q" и соответственно подтвердите действие нажав - "y".

Сейчас необходимо извлечь из скачанного архива файлы, для чего вводим:
tar xvf alsa-firmware-1.0.25.tar.bz2
Осталось "исходники" превратить в рабочие данные - модули:
cd alsa-firmware-1.0.25
./configure
cd ymfpci && make
Устанавливаем модули, просто скопировав их в систему:
sudo mkdir -p /usr/local/lib/firmware/yamaha
sudo cp *fw /usr/local/lib/firmware/yamaha
Загружаем их в систему:
sudo modprobe -r snd-ymfpci
sudo modprobe snd-ymfpci
Добавляем свою учетную запись в группу "audio", вместо "user" введите имя своей учетной записи:
sudo adduser user audio
Теперь нам нужно отрегулировать уровни звука, для этого вводим:
alsamixer
Появится псевдографический интерфейс со столбиками. Нас интересуют каналы "Master", "Master M", "Headphone", "PCM". Передвигаемся по ним стрелками влево-вправо, для изменения уровня — стрелки вверх-вниз, еще есть внизу столбика "MM" — означает "mute", т.е. звук выключен, чтобы включить звук — нажмите клавишу "m". Сначала можете отключить "mute" и отрегулировать уровень, например до значения "81", на всех вышеперечисленных каналах. После регулировки, для выхода, жмем клавишу "Esc".
Осталось проверить работоспособность колонок:
aplay /usr/share/sounds/alsa/Noise.wav
speaker-test -tsine -f440 -c2
speaker-test -twav -c2
Для прерывания теста нажмите "Ctrl"+"c".

"Иксы", продолжаем добавлять функционал.

Со звуком разобрались, продолжим добавлять новые "окошки", точнее программы работающие в среде "FluxBox". Чтобы не прыгать из "иксов" в консоль, запустим последнюю, в виде дополнительного приложения, с помощью быстрых клавиш - нажмите сочетание клавиш "Alt"+"F1".
Раз есть простая возможность использовать консоль в "FluxBox", будем загружать "иксы" минуя вход через консоль, с последующим ручным запуском через "startx". Для этого нам нужно установить вспомогательную программу - графический дисплейный менеджер (Display Manager) - вот неоторые из них: GDM (GNOME Display Manger), KDM (KDE Display Manger), XDM (X Display Manger), SLiM (Simple Login Manager). Установим "slim":
sudo apt-get install slim
Чтобы увидеть новый способ входа в систему перезагружаем компьютер.
Если в консоли мы использовали "mc" для обзора дисковой системы (директорий и файлов), то для более привычной работы в "FluxBox" нам нужно будет установить файл-менеджер для "иксов". Конечно, если вам еще интересен "mc" - никто не запрещает им пользоваться. Устанавливаем "PCManFM":
sudo apt-get install pcmanfm
После установки можно запустить его через меню "Приложения"->"Управление файлами"->"PCManFM". Тут нас ожидает мелкая неприятность - отсутствуют иконки файлов и директорий.
И опять в консоль:
nano ~/.gtkrc-2.0
Дописываем строчку:
gtk-icon-theme-name = "nuoveXT2"
Выходим из редактора с сохранением изменений. Запускаем еще раз "PCManFM". Вам, наверно, этот способ запуска программы со временем будет утомителен, поэтому чтобы каждый раз не искать в меню "PCManFM", назначим его вызов через комбинацию клавиш "Win"+"F", где "Win" клавиша с изображением флага "Windows". Откроем файл настроек клавиш в редакторе:
nano ~/.fluxbox/keys
И допишем в конце строчку:
Mod4 F : Exec pcmanfm
Закрываем с сохранением и выбираем в меню "FluxBox" "Reconfigure", а затем - "Restart", чтобы применить изменения. Попробуйте нажать "Win"+"F" - у вас должен запуститься "PCManFM".
К файлам простейший способ доступа у нас появился. Теперь будем добавлять программы для работы с файлами, кстати, во втором этапе мы уже установили "AbiWord" - с помощью которой можно создавать и редактировать текстовые документы. Попробуйте открыть текстовый файл с расширением ".txt" или ".doc" в файловом менеджере. Появится окно с предложением выбрать приложение. Во вкладке "Установленное приложение" выбираем "Офис"->"AbiWord", также можно поставить соответствующую "птичку" для назначения программы по умолчанию для данного типа файла.
Займемся следующими файлами - картинками и фотографиями, т.е. графическими. Сначала установим программу просмотра "GPicView":
sudo apt-get install gpicview
Попробуйте назначить эту программу для файла с картинкой, вышеописанным способом, выбрав во вкладке "Установленное приложение" - "Стандартные"->"Image Viewer". Можно аналогично назначить и остальные графические типы файлов, но у "GPicView" есть свой механизм - нажимаем предпоследний значок ("Настройки") в программе и нажимаем на кнопку "Сделать GPicView просмотрщиком изображений по-умолчанию". Попробуйте теперь открыть графический файл с другим расширением.
Теперь решим вопрос чем открывать файлы архивов:
sudo apt-get install xarchiver
Файлы с текстовой и графической информацией, а также архивы, вы уже можете просматривать. Сейчас поставим программы для работы с интернетом: веб-браузер и почтовый клиент - "Iceape", для работы с ftp-серверами - "FileZilla", для отправки текстовых сообщений - "Pidgin". Запустим установку этих трех программ одной командой:
sudo apt-get install iceape filezilla pidgin


Допишем параметры раскладки клавиатуры в файл ".xsessionrc", для пользователя:
nano ~/.xsessionrc
Следующую строку:
setxkbmap -layout "us,ru" -option "grp:ctrl_shift_toogle, grp_led:scroll"
Этой строчкой устанавливаем два языка (английский и русский), комбинацию клавиш для переключения раскладки — "Ctrl"+"Shift" и индикацию раскладки светодиодом "SсrollLock" на клавиатуре. 
Устанавливаем индикатор переключателя раскладок клавиатуры:
sudo apt-get install fbxkb

Для устранения проблем отображения картинки флага с английской раскладкой делаем следующее (по умолчанию вместо флага картинка с вопросами):
sudo cp /usr/share/fbxkb/images/zz.png /usr/share/fbxkb/images/zz_old.png
sudo cp /usr/share/fbxkb/images/us.png /usr/share/fbxkb/images/zz.png
Еще один штрих, добавляем в автозагрузку. Открываем файл в редакторе:
nano ~/.fluxbox/startup

Перед строчкой содержащей "exec fluxbox", добавляем следующую:
fbxkb &

Выходим из редактора с сохранением.
После перезагрузки "иксов" изменения вступят в силу. Кстати, чтобы завершить работу с "Fluxbox", не обязательно выбирать в меню "Exit", можно нажать следующее сочетание клавиш - "Ctrl"+"Alt"+"Del", что аналогично, т.к. назначено по умолчанию на завершение работы.
Теперь вам будет видно какая раскладка включена, а если используется отдельная клавиатура, то еще будет индикация светодиодом "ScrollLock" на ней.
Так, программ наставили, индикацию раскладок установили, можно пользоваться... Неудобно и долго заходить в меню и запускать программу? Вспомним про файл "keys":
nano ~/.fluxbox/keys
Добавим быстрые клавиши:
Mod4 W : Exec x-www-browser
Mod4 I : Exec pidgin
Mod4 Escape : Exec conky

вторник, 12 июня 2012 г.

Установка Debian 6 на старый ноутбук. Второй этап.

Второй этап. Подготовка к "окошкам".

На прошлом этапе вы установили на ноутбук минимальную систему ОС Debian 6. После загрузки системы пока доступна только консоль, но это уже рабочая система, которую продолжим настраивать для своих нужд. На данном этапе нам потребуется интернет, в отличие от первого, где хватает первого диска системы Debian. Так как производительность ноутбука не высокая будем пытаться использовать менее ресурсоемкие приложения. Приступим.
Вводим имя учетной записи, а в следующем запросе пароль (при вводе пароля на экране не будет отображения каких либо символов).


После успешного входа, система будет ожидать от вас ввода команд. Вы вошли под своей учетной записью в систему. Права вашей учетной записи будут ограничены системой, это как зайти в Windows с учетной записью с правами "Опытный пользователь", многие команды требующие изменений системы вам недоступны. Для этого есть учетная запись root, но так как мы не задавали, при установке системы, пароль для нее — нам стала доступна команда sudo, для временного повышения прав над системой.

Первая программа.

Ну что же, попробуем установить программу "mc" — программа похожа на "Norton Commander" в DOS-е или "FAR" для Windows (ну можно было бы сказать, что она похожя и на "Total Commander", но это консольная утилита). Вводим следующую команду:
sudo apt-get install mc
Для продолжения требуется ввести ваш пароль:

А также подтвердить наши действия введя "y":

Программа установлена, можно ее запустить введя "mc":

Для выхода из "mc" нажмите клавишу "F10".
Итак, с помощью команды "apt-get install mc" мы установили программу, но данные действия требуют привилегий "root", поэтому использовалась команда совместно с "sudo".
Да, если вы при установке системы задали пароль для учетной записи "root" - вам потребуется сначала войти в систему под ней используя команду "su", и ввести пароль. Теперь можете вводить команду "apt-get install mc", заметьте, команду "sudo" уже вводить не надо. Кстати, если вы заметили, у вас поменяется последний символ в приглашении консоли с "$" - означавшего работу под записью пользователя, на значок "#" - который означает работу под записью "root"-а. Чтобы вернутся к своей учетной записи введите "exit". В дальнейшем я буду описывать действия как в первом примере с использованием "sudo".

Сеть и список "источников".

Сейчас мы будем настраивать источники для программ, точнее пакетов с программами. В системе уже установлен простейший текстовый редактор - "nano". Откроем в нем конфигурационный файл sources.list:
sudo nano /etc/apt/sources.list
После строчки начинающейся с "deb cdrom:", добавим следующие:
deb http://ftp.by.debian.org/debian squeeze main contrib non-free
deb-src http://ftp.by.debian.org/debian squeeze main contrib non-free
В примере указан сервер зеркала в Беларусии, для России используйте "ftp.ru.debian.org". Для выхода и сохранения изменений нажимаем сочетание клавиш "Ctrl"+"X", подтверждаем запрос сохранения введя "y", следующее поле, содержит путь и имя файла, не изменяем — просто нажимаем "Ввод":


В этом же файле можно закомментировать строчку начинающейся с "deb cdrom:" - это заставит "забыть" систему о dvd-диске с которого она устанавливалась, просто добавив вначале строки символ "#" ("#" - символ коментария). Сейчас вы немножко освоили редактор nano. Мы еще им будем пользоваться, так что знания пригодятся.
Теперь заставим систему обновить сведения о доступных пакетах, введя следующую команду:
sudo apt-get update
Если у вас появились предупреждения о невозможности скачать пакеты во время выполнения предыдущей команды — у вас, возможно, был неправильно настроен сетевой интерфейс (сетевая карта) во время первого этапа. Проверим настройки, заодно изучив параметры:
sudo nano /etc/network/interfaces
Ищем блок содержащий строчку с "eth0", ниже показан файл с настройками выполненными вручную:

Объясню что означают строки:
allow-hotplug eth0 — включает режим "горячего" подключения, т.е. сетевая карта eth0 автоматически проверяет наличие подключенного сетевого кабеля;
iface eth0 inet static — указывает что сеть настраивается вручную, ее настройки описываются ниже:
address – тут указываем ip адрес;
netmask – указываем сетевую маску;
network – указываем подсеть, этот параметр можно не указывать, он основан на первых двух параметрах, для простого представления как его высчитать: адрес ip 10.2.3.4 и маска 255.0.0.0 – будет 10.0.0.0, грубо говоря, из маски берем нули и заменяем ими соответствующие числа в ip адресе;
broadcast – широковещательный адрес, этот параметр можно не указывать, аналогично предыдущему, с отличием что последнее число должно быть 255, т.о. для вышеописанного примера будет – 10.0.0.255;
gateway – шлюз по умолчанию, адрес на который будут отправляться все "неизвестные" запросы;
dns-nameservers – указываем dns-сервер, может быть как внутренний в вашей сети или внешний из интернета, например вашего провайдера (8.8.8.8 – dns-сервер google).
Вроде более-менее расписал параметры, сейчас проверьте их и подправьте если заметили неточность.

Если у вас в сети есть dhcp сервер раздающий настойки автоматически, то блок должен выглядеть так:
allow-hotplug eth0
iface eth0 inet dhcp
Сохранили изменения? Чтобы изменения произошли в системе, нужно перезагрузить компьютер командой:
sudo reboot
или ввести следующие команды:
sudo /etc/init.d/networking restart
sudo ifup eth0
Попробуйте еще раз обновить список пакетов.

Чтобы посмотреть с каким ip адресом работает ваш компьютер можно ввести команду:
sudo ifconfig
Напротив надписи eth0 будут расписаны все текущие параметры работы сетевого адаптера, кстати, с помощью этой команды вы увидите ip адрес полученыый от dhcp сервера.
Еще есть один момент, возможно у вас в сети настроен и работает прокси-сервер, его тоже можно использовать. Для этого нужно создать файл "apt.conf" и отредактировать его:
sudo nano /etc/apt/apt.conf
И добавить строчки:
Acquire::http::Proxy "http://proxy:port/";
Acquire::ftp::Proxy "ftp://proxy:port/";
Acquire::::Proxy "true";
Вместо "proxy:port" укажите ip адрес прокси сервера и, через двоеточие, его, соответствующий для протокола, порт.
После успешного выполнения обновления списка, система будет иметь доступ к данным находящимся в интернете и соответственно использовать его при установке программ, точнее, их загрузке.

Кстати, для более приятной работы в консоли можете перейти на страничку http://w1tal1j.blogspot.com/2012/06/debian-ttyx.html, где я описал изменение разрешения экрана на 1024*768 пикселей.

Оновляемся...

Теперь произведем обновление нашей системы до актуальной версии, для исправления найденных ошибок в пакетах. Как вы видите, не только система Windows требует обновления, но и в linux ситемах постоянно находят ошибки и их устраняют. Для обновления введите команду:
sudo apt-get upgrade
Система проверит наличие новых версий пакетов и сачает их, после чего сама установит их и попытается настроить в то же состояние, в котором сейчас настроена ваша система.
После обновления системы, перезагружаем компьютер. Напомню команду:
sudo reboot
Теперь вы будете работать в обновленной системе. За ходом появления обновлений, можно следить на основном сайте www.debian.org.
С консолью поигрались... но я думаю вы хотите увидеть на своем компьютере более привычные "окошки", тогда будем настраивать систему дальше.

"Иксы", FluxBox.

Устанавливаем X Window System (в народе просто "иксы"), система которая отвечает за работу тех самых "окошек":
sudo apt-get install xorg
Ну и соответственно как в предыдущей установке - пароль и подтверждение о согласии изменений.
Затем нам потребуется пакет с самими "окошками". Для этого в линукс есть две системы - менеджеры окон (WM, X Window Manager) и окружения рабочего стола (DM, Desktop Environment). К DM относят такие популярные системы как Gnome, KDE, LXDE, но они все для нашего компьютера являются "тяжелыми". Более "легкими" считаются WM, это - OpenBox, FluxBox, IceWM.
Моим выбором стал FluxBox. Приступим к его установке:
sudo apt-get install fluxbox
Можно проверить на работоспособность свежеустановленных пакетов, выполнив команду:
startx
У вас загрузится система xorg с запущенным fluxbox:

Для вызова меню - нажмите правую кнопку мыши. Чтобы выйти - выберите "Exit". На данный момент, при выходе, мы вернемся опять в коносль. Кстати, если нажать в "FluxBox"-е сочетание клавиш "Alt"+"F1" - запустится консоль, только в "окошке".

Aptitude...

В установленной системе кроме команды "apt-get" доступен консольный менеджер пакетов, который можно вызвать командой:
sudo aptitude
Это что-то похожее по функционалу "Установка и удаление программ" в Windows, только с готовым списком доступных к установке программ. Т.е. не обязательно искать программу в интернете на родном сайте, возможно она уже есть в этом списке и от вас потребуется только ее выбрать для установки.
Ниже скриншот с запущенной программой, но в системе еще не было произведено обновление:

Вот небольшое описание работы с программой. А если вы, для начала изучения, решили прочитать статью до конца, то теперь у вас будет выбор способа обновления системы, описаный в следующем абзаце. Кто делал все поэтапно - не растраивайтесь, краткое работы  описание пригодится и в будующем.
Чтобы попасть в меню нажмите "F10". Дальше управляем курсором срелочками. Обратите внимние что в меню большинство команд имеют назначенные "быстрые" клавиши, справа от названия меню. Это для облегчения работы с программой. Чтобы найти, например, установленный ранее нами "mc" выберите в меню "Поиск" или нажмите "/". В появившемся поле введите "mc" и нажмите "Ввод". Нам предложат первое совпадение введенных символов, для продолжения поиска, нажмите "n". Когда найдете "mc", обратите внимание на букву "i" в начале строки (визуально, первый столбец) - это сообщение, что этот пакет уже установлен. А сейчас произведем обновление системы из "aptitude" - нажмите "u", будет попытка соединения с интернетом для обновления списка доступных пакетов (помните, мы использовали для этого команду "apt-get update"). Следующий шаг - "U" (т.е. нажать "Shift"+"u") - это заставит выбрать обновляемые пакеты. Чтобы увидеть выбранные пакеты - нажимаем "g". Еще раз нажав "g" - мы запустим обновление системы (мы использовали для этого команду "apt-get upgrade"). Все действия можно произвести и из меню, выбирая соответствующие меню, но, заметьте, "бысрыми" клавишами удобнее. После обновления вас попросят нажать "Ввод". Затем чтобы выйти из программы, нажмите "q" и, соответственно, на запрос выберите "Yes". Ну и перезагрузите компьютер.

Ставим первую программу для "иксов".

Сейчас, с помощью "aptitude", установим программу для "окошек" - "AbiWord" - графический текстовый редактор, если сравнивать с Windows программой -  похожа на "WordPad". Запускаем "aptitude". Запускаем поиск, в поле вводим "abiword" и жмем "Ввод". На экране будет несколько строчек содержащих искомое слово. Выбираем первое - "abiword", затем нажимаем клавишу "+" ("Shift"+"=" или "+" на цифровой клавиатуре), будут подсвечены несколько строчек. Теперь жмем "g" - система покажет все необходимые для установки пакеты, и следующее нажатие на "g" приведет к запуску установки пакетов и последующей автоматической настройке системы. После установки можете выйти из "aptitude". Теперь в меню "FluxBox"-а можете поискать свежеустановленную программу ("Приложения"->"Офисные"->"AbiWord Word Processor").
Кстати, для просмотра деталей о пакете, в "aptitude", на котором стоит курсор - нажмите "Ввод", вернуться назад, из деталей, нам поможет - "q".

Продолжение следует...

PS. В системе можно установить прокси для консольных утилит с помощью переменных окружения "http_proxy" и "ftp_proxy", для этого изменим файл настроек пользователя ".bashrc":
nano ~/.bashrc
Допишите в конец файла следующие строчки, где "proxy:port" замените на необходимые ip адрес и порт вашего прокси (например 10.0.0.1:8080):
export http_port="http://proxy:port/"
export ftp_proxy="http://proxy:port/"
После чего вам нужно будет выйти и зайти в систему.