Более сложный способ мониторинга состояния сервера на Linux в реальном времени.

Продолжаю тему, начатую в предыдущей заметке [КОПИЯ]. В ней описывал получение данных от определенных скриптов и процессов запущенных на сервере под управлением Linux с помощью SSH, псевдотерминала и отдельного пользователя, создаваемого специально для целей мониторинга.

Будем посмотреть другой способ, с одной стороны, более сложный и требующий владения каким-нибудь языком программирования, кроме Bash-скриптов. Хотя, можно обойтись и исключительно одним Bash’ем, если клиент и сервер под Linux, или Bash прикрутили к Windows (cygwin(?), не пробовал, не знаю). А с другой стороны, наоборот, способ простой безопасный, требующий минимум вмешательства в настройки сервера.

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

Примечание: Термины «клиент» и «сервер» могут по ходу статьи быть неоднозначно истолкованными.
Серверное приложение будет наоборот, работать на «клиентском», «операторском» рабочем месте, а «сервер», в смысле компьютер с Linux, на котором я запускаю свои скрипты, и который управляет нужной мне железякой, станет вполне себе клиентом.
В общем, чтобы не вносить путаницы я условлюсь называть рабочее место оператора «локальным компьютером», а тот, который «сервер в привычном понимании» — «удаленным».

Задача

Такая же, как и в предыдущей заметке. Имеется удаленный компьютер под управлением Linux, рулящий системой контроля температуры и давления.
На самом деле, рулить он может чем угодно: от домашнего FTP с котиками или соединения с Интернетом, до управления СКД, открытием ворот, дверей, врат в Ад, личным концлагерем и т.д.
Суть в том, что нужно, чтобы удаленная система сигнализировала оператору об изменении своего состояния (изменении температуры, разрыва соединения с Интернетом, пришествии Сатаны). Оператор, как обычно, сидит под Windows (как в большинстве организаций в СНГ).

Некоторые соглашения

Для простоты условимся, что локальный и удаленный компьютер находятся в одной локальной сети (и одной подсети) 10.10.0.0/24, IP-адрес локального компьютера 10.10.0.30, прием данных производится через сетевой порт 11000 локального компьютера. Локальный и удаленный компьютеры обмениваются данными по протоколу TCP, данные представляют собой Unicode-строки.

Как это организовано на локальном и удаленном компьютере

Код

Сервера приема сообщений:
Смотреть на PasteBin
Скачать с Mega.nz

Скрипта отправки сообщений:
Смотреть на PasteBin
Скачать с Mega.nz

Источники

1. Клиент-серверное приложение на потоковом сокете TCP [Копия]
2. Как открыть TCP-/UDP-сокет средствами командной оболочки bash [Копия]

Видеоиллюстрация

Прямая ссылка

Универсальный конвертер символов перевода строки (Windows\Mac\Linux)

Ух и задолбался же я с этими самыми переводами строк! Возникла тут задачка конвертировать кучу огромную текстовых файлов из DOS/Windows (перенос строки CR+LF, h0D, h0A), старого Mac-формата (CR, h0D), который, вопреки утверждениям Википедии и других авторитетных источников использует не только вышедшие из употребления Маки, в формат Linux (LF, h0A). Желательно иметь возможность еще и обратной/произвольной конвертации между всем этим зоопарком. Сначала я, конечно, попробовал написать универсальный скрипт с помощью sed, но никакой универсальности не получилось. На C++, ой, после C# это все равно, что пересесть с мерседеса на велосипед. На C# задача в строчки 4 кода решается, но тащить ради маленькой утилиты Mono, это уж слишком

В общем нашел готовую крохотную утилиту flip.
Плюсы:
+ Есть готовые версии почти под все платформы, кроме DOS, даже статически откомпилированный бинарник для Linux, так что можно задуть в роутер/initrd, если оно кому-то там надо.
+ Бесплатно
+ Есть исходники
+ Работает моментально
+ Поддерживает файлы с перепутанными концами строк (где есть и Windows, и UNIX и Mac варианты)

Минусов пока не нашел.
Использование простое: первый параметр, что конкретно делаем, остальные — имена файлов через пробел.
Делать можно следующее:
-t — отобразить используемый тип переноса строки
-d — конвертировать в DOS/Windows формат (CR+LF)
-m — конвертировать в Mac-формат (CR)
-u — конвертировать в UNIX/Linux формат (LF)

Скачать можно со странички автора или отсюда:
1. Исходник
2. Slackware-пакет
3. Версия для Windows (консольная)
4. Все остальное

Венденачало

Как выглядели первые версии Windows
Windows 1.03


Внезапно, так и не удалось заставить работать в ей мышь.
Windows 2.01

В этой мышь уже работала, но на эмуляторе оно криво, как-нибудь сделаю видео запуска сего раритета на «железе» или же на более лучшем эмуляторе/виртуалке, а пока поверьте на слово, что можно порисовать в Paint, поиграть в Reversi, или же набрать текст в Блокноте или Write.

Впрочем, можете сами скачать и поиграться:
Windows 1.03 (осторожно, венда хранится в рашке)
Windows 2.01 (осторожно, венда хранится в рашке)

Настройка X11-forwarding через ssh, с помощью PuTTY и Xming

Вообще в Linux, а особенно на сервере под Linux вполне можно обходиться голой консолью, ибо все инструменты обычно в консольном варианте есть. Но иногда хочется запустить и графическое приложение, например программу разметки диска, а иногда без графики вообще не обойтись, если обрабатываешь видео или работаешь с виртуальными машинами. На наше счастье возможность удаленно работать с графическими программами есть. Называется это дело X11-Forwarding и существует оно аж в двух вариациях:
XDMCP, нечто вроде RDP в винде — когда мы подключаемся к оконному менеджеру Linux, вводим свой логин/пароль и работаем с удаленным рабочим столом.
— И просто возможность запуска отдельных приложений (GIMP, GParted и т.д.)

К первому я еще может, когда-нибудь вернусь, а пока будем настраивать второе.

Настройка X11-forwarding в ssh на стороне Linux

Будем считать, что ssh у нас уже настроен. Правим конфиг демона ssh /etc/ssh/sshd_config
Раскомментируем или дописываем следующие строки:
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

Перезапускаем демон или рестартируем сервер.
Если надо, открываем порты на файерволе:
Для переопределения дисплея:
iptables -A INPUT -s x.x.x.x/xx -p tcp --dport 6000 -j ACCEPT
iptables -A OUTPUT -s x.x.x.x/xx -p tcp --sport 6000 -j ACCEPT

Вместо x.x.x.x/xx подставить нужную подсеть

Настройка PuTTY

Щелкаем по значку в лотке, открываем Конфигурация и в появившемся окне выбираем в дереве слева Соединение -> SSH -> X11
Выставляем все значения как на картинке и запоминаем число после localhost: (оно понадобится виндовому X-серверу).

Настройка виндового X-сервера

Их, наверное с десяток всякоразных наберется, но я особо не экспериментировал, все побежали и я побежал, взял самый популярный Xming
1. Качаем с официального сайта или напрямую с SourceForge
2. Устанавливаем
3. Настраиваем, запускаем Пуск -> Все программы -> Xming ->XLaunch

Выбираем Multiple windows и устанавливаем Display number таким же, как было настроено в PuTTY:

Нажимаем Далее и выбираем Start no client, тогда Xming «поселится» в трее и будет ждать, пока мы с консоли PuTTY запустим какое-нибудь графическое приложение.


В следующем окне я оставил все также, поскольку Font Server не настраивал.

Хотя глюк со шрифтами у меня был, но как оказалось, его исправление особого шаманства не требует.

Если нажать Готово в следующем окне, Xming сядет в лоток и будет ждать, пока мы запустим что-нибудь графическое из консоли. Например
gparted &

символ & — чтоб программа запустилась в фоновом режиме и не занимала консоль.

Чтобы каждый раз не лезть в XLaunch, можно в свойства ярлыка Xming дописать нужные параметры "C:\Program Files\Xming\Xming.exe" :0 -clipboard -multiwindow

Глюк с размером шрифтов и борьба с ним.

По умолчанию Xming почему-то выставляет ОЧЕНЬ маленький размер шрифта меню и диалоговых окон


Борьба проста. Дописываем в окне Additional Parameters XLaunch’а в строку Additional parameters for Xming параметр -dpi 96 или его же в свойства ярлыка. Число в параметре выбираем под свои глаза и монитор

Вот что получилось:

Другие опции можно узнать из официального мануала

Источники не помню, но УМВР. И у друга тоже.

Скачать заметку в формате PDF

Отключение/включение сетевой карты с помощью DEVCON.EXE

Я тут Devcon упоминал, и вот для чего. Задача такая, склепать батник для включения/выключения сетевой карты. Решаем:

Что потребуется:

Рабочий Devcon.exe
Поиск ID сетевой карты
Для начала надо найти ID сетевой карты, для чего выводим список PnP-устройств в текстовый файл:
devcon.exe rescan
devcon find PCI* > PNP.log
Сетевая карта (даже встроенная) обычно висит на шине PCI.
В файле PNP.log будет что-то типа этого:

А вот и наша сетевая карта (подчеркнута красным)

Выдираем ее ID, с помощью которого и будем ей рулить.
Открываем файл на редактирование, ищем название и то, что начинается от первого слэша с конца, до первого с конца двоеточия и будет искомым идентификатором:
PCIVEN_10EC&DEV_8168&SUBSYS_83A31043&REV_03
Этот ID для команды включения/отключения можно и сократить, например до ID производителя+ID оборудования, поставив в нужном месте звездочку (*), например так:
PCIVEN_10EC&DEV_8168*
Но если вдруг у вас 2 одинаковые сетевые карты (на серверах бывает) — вырубятся обе.
Отключение устройства

Выполняется одной простой командой:
devcon disable <device_id>
где вместо <device_id> подставляем ранее найденный ID устройства. Т.е. в случае моей тестовой машины, команда выглядит как:
devcon disable "PCIVEN_10EC&DEV_8168&SUBSYS_83A31043&REV_03"
Включение устройства
Не менее простая команда:
devcon enable <device_id>
т.е. в моем случае:
devcon enable "PCIVEN_10EC&DEV_8168&SUBSYS_83A31043&REV_03"
ВАЖНО!
device_id необходимо взять в кавычки!!! Иначе командный интерпретатор примет (из-за наличия в ID амперсанда — т.е. символа &) одну команду за последовательность команд, и тогда выполнится первая disable PCIVEN_10EC, т.е. отключатся все PCI-устройства данного производителя, а остальные завершатся с ошибкой типа такой: "DEV_8168" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Готовые батники на pastebin

Включить сетевую карту
Отключить сетевую карту

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/332413.html
Прокомментировать заметку можно по ссылке выше.

DEVCON.EXE Консольный аналог Диспетчера устройств (для XP)

К XP, во всяком случае к XP Professional SP3 подходит Devcon от Windows Server 2003
Взять можно здесь:
Прямая ссылка
Ссылка на страничку на сайте Microsoft
Скачиваем cab-архив, оттуда извлекаем devcon.exe
На всякий случай переложил себе (мало ли MS с сайта уберут)
support.cab
devcon (zip)

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/331569.html
Прокомментировать заметку можно по ссылке выше.

Несколько конфигураций сетевого адаптера Windows.

Быстрый способ переключения настроек.

Бывает так, что нужно сохранить и переключать время от времени несколько конфигураций сетевого адаптера в Windows, например, вы ходите по разным организациям с ноутбуком, подключаетесь по кабелю (да-да, не везде есть Wi-Fi, от жадности или в целях безопасности). В одной организации выделение IP происходит автоматически, через DHCP, в другой — надо все вводить вручную, в третьей, тоже вручную, но IP другие. 8 и 10 вроде могут сохранять конфигурации для нескольких сетей, а вот 7 и XP такого не умеют. Вот способ сделать все штатно, через командную строку Windows, с помощью утилиты netsh
Пусть, для примера у нас будут 3 сети с разными настройками:
Для них мы создадим три командных (batch) файла. При соединении с конкретной сетью запускается соответствующий batch-файл.
Да, поскольку у меня на ноутбуке XP, то и команды будут именно для XP. В 7 и выше синтаксис команд netsh вроде немного отличается.
Внимание! Для корректной работы с сетевыми интерфейсами, имена которых содержат русские буквы, batch-файл должен быть сохранен в кодировке DOS (866)
Сеть 1. Все настройки получаются через DHCP


Самый простой случай. В batch-файле содержится единственная команда:
netsh interface ip set address "Подключение по локальной сети" dhcp
где:
interface ip - указание, что операция будет производиться с интерфейсом ip (v4).
set address — устанавливаем адреса
"Подключение по локальной сети" — имя подключения
dhcp — тип получаемого адреса, по DHCP
Сеть 2. Все настройки указываются вручную, все адреса статические.

Установка адресов:
netsh interface ip set address "Подключение по локальной сети" static X.X.X.X Y.Y.Y.Y Z.Z.Z.Z M
где (исключая упомянутое в предыдущем пункте):
static — тип получаемого адреса, статический
X.X.X.X — IP компьютера (точнее, его сетевого интерфейса)
Y.Y.Y.Y — маска подсети
Z.Z.Z.Z — адрес основного шлюза
M — Метрика шлюза. Если у вас всего 1 сетевая карта, то указываем 1:
Метрика — определяет оценочную метрику маршрута в целых числах (от 1 до 9999) и используется при выборе из нескольких маршрутов в таблице маршрутизации наиболее точно соответствующих адресу места назначения пересылаемого пакета. Выбирается маршрут с наименьшей метрикой. Метрика может отражать количество скачков, скорость передачи, надежность пути, его пропускную способность или административные настройки.
Т.е. в нашем случае команда выглядит так:
netsh interface ip set address "Подключение по локальной сети" static 192.168.1.11 255.255.255.0 192.168.1.1 1
Добавляем первичный DNS:
netsh interface ip set dns "Подключение по локальной сети" static 10.20.0.5
Добавляем вторичный DNS:
netsh interface ip add dns "Подключение по локальной сети" 10.20.0.4

Внимание!
Команда именно add а не set.Хотя командой add можно и первый добавить.
Сеть 3. Все адреса статические. Некоторые параметры не указаны.


Примечание:
Такую конфигурацию можно использовать для отключения компьютера от интернета, но сохранив доступ к локальной сети.
netsh interface ip set address "Подключение по локальной сети" static 192.168.0.6 255.255.255.0 none
Команда установки адресов отличается только словом none на месте адреса шлюза. Т.е. указывает, что шлюз не указан
Внимание! Всегда лучше явно указывать отсутствие шлюза. Почему? Да потому что, если до этого в настройках был указан IP шлюза, то без явного указания (словом none), того, что шлюз не нужен, netsh программа оставит этот параметр без изменений.
Удаляем DNS-адреса:
netsh interface ip delete dns "Подключение по локальной сети" all
(вместо all можно указать конкретный адрес, если нужно удалить только его).
Источники

1. Using Netsh (на буржуйском)
2. Netsh commands for Interface IP (на буржуйском)
3. Настройка нескольких шлюзов в сети

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/329789.html
Прокомментировать заметку можно по ссылке выше.