Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


среда, 20 октября 2021 г.

Справочная информация: Подключение к Диску Яндекс через webdav в Thunar

Завелся у меня "мегадиск" от мегафона. Ну, как завелся, еще почти год назад. Сегодня пришла смс, что из 100 полученных тогда гигов 75 были заманушными и всё такое. Решил хоть попробовать, что это. Заодно попробовать зайти туда через тунар.
Не сразу сообразил, как правильно подключать webdav, и нашел подсказку здесь.
У меня прекрасно сработало по первому же способу

Справочная информация: Подключение к Диску Яндекс через webdav в Thunar: При работе в Linux Mint xfce возникла необходимость подключаться к Диску Яндекс прямо из файлового менеджера Thunar. Было найдено 2 спосо...

понедельник, 23 августа 2021 г.

Bash: рисование рамок или повтор символа нужное количество раз

 Понадобилось мне рисовать рамочку вокруг выводимого из скрипта сообщения.

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

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

Элегантное решение нашлось в комментариях здесь:

head -c 80 < /dev/zero | tr '\0' '.'

То есть, загружаем нужное количество символов с кодом 0x00 из псевдоустройства /dev/zero, а потом в полученном "тексте" меняем каждый такой символ на нужный нам.

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

ALRDY='| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА '$SENDING_TO' |'
ALRDY_LINE='+'`head -c $(( ${#ALRDY}-2 )) </dev/zero|tr '\0' '-'`'+'
echo $ALRDY_LINE
echo $ALRDY
echo $ALRDY_LINE

В переменную ALRDY помещаем шаблонную строку - фиксированный текст и место для вставки переменной. По краям стоят символы "вертикальная черта", они образуют боковые стороны рамки. А в переменную ALRDY_LINE поместим нужное количество дефисов, размещенных между двумя плюсиками - "углами" рамки. Т.к. верхняя и нижняя стороны рамки одинаковы, то используем только одну переменную, но ничто не мешает использовать их две или больше, в зависимости от.

Веселье начинаем в следующей строке. В начале и в конце добавляем знак "+" к ALRDY_LINE, а между ними результат слегка переработанной команды из примера в начале поста.

${#ALRDY} возвращает длину переменной в СИМВОЛАХ (не в байтах! поэтому юникод работает нормально)

$(( ... )) - это арифметика, из полученной длины переменной ALRDY вычитаем 2, то есть, не принимаем в расчет начальную и конечную вертикальные черточки, поскольку над ними будут не дефисы, а два добавленных вручную плюса.

Результат этого выражения используем как параметр для ключа -c команды head, и вся комбинация обозначает "получить из /dev/zero символы в количестве "длина переменной ALRDY минус два" и заменить каждый из них на дефис". Так как к ALRDY_LINE пририсовываем еще два плюсика, то длины ALRDY и ALRDY_LINE становятся равными.

И вот примерно что получается:

+-----------------------------------------------------+
| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА bobylova_mv@jcx.srkz.ru |
+-----------------------------------------------------+

+---------------------------------------------+
| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА kmv@khv.cpsu.su |
+---------------------------------------------+

Просто и очень текстово :-)

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


среда, 4 августа 2021 г.

WMIC и серийный номер APC ИБП

 Обект WMI Win32_Battery имеет много интересных свойств, одно из них - deviceId. Но ИБП от APC пихают в это поле всё подряд - от серийного номера до версий firmware.

Возникла задача: выделить только серийный номер, при этом остальные свойства, которые wmic возвращает в виде непрерывной строки, поля в которой разделяются вертикальной чертой (|) остались на месте.

В конце концов родилось вот такое:

wmicc.sh ИМЯ_КОМПА|tail -n +3 |sed -r "s/([0-9][A-Z][0-9]{4}[A-Z][0-9]{5})[^|]*/\1/g" |datamash transpose -t \| |column -t -s \|

wmicc.sh - это скрипт-обертка, передающий wmic-у вспомогательные параметры - авторизацию и т.п., а так же параметры отбора.

tail обрезает первые 2 строки, в которых содержится ненужный мне мусор.

datamash transpose преобразует последовательные строки в столбцы

column придает этим столбцам красивую ширину

А самое интересное делает sed. В поле deviceId текст выглядит примерно так:

1A2152Z12345  American Power ConversionBack-UPS XS 650CI FW:892.R2.I USB FW:R2

Первое алфавитно-цифровое сочетание и есть серийный номер ИБП, причем 2 цифры сразу после первой буквы (A21) - это год выпуска (пример серийника выше - условный, так что год в нём 2021). Но вот всё остальное до конца строки мне ни к чему.

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

  1. найти сочетание вида ЦБЦЦЦЦБЦЦЦЦЦ (Ц - цифра, Б - буква), обозначить его как "группа 1"
  2. в той же строке сразу после этой группы искать любое количество любых символов кроме вертикальной черты
  3. заменить найденное в п.п.1 и 2 на то, что находится в "группа 1"
  4. Профит!
$ echo "1A2152Z12345  American Power ConversionBack-UPS XS 650CI FW:892.R2.I USB FW:R2|" |sed -r "s/([0-9][A-Z][0-9]{4}[A-Z][0-9]{5})[^|]*/\1/g"

1A2152Z12345|

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

понедельник, 2 августа 2021 г.

Windows 10 определяет HDD как SSD

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

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

Решение здесь:(ответ от DavidELindsay()

1. Открываем командную строку от имени администратора (*)

2. Выполняем winsat formal.

3. PROFIT!

(*) поскольку винда после 98-ой пигшется индусскими наркоманами, то даже winsat /? невозможно выполнить из обычной командной строки, даже если войти в систему с администраторской учеткой.

понедельник, 28 июня 2021 г.

Zimbra: квоты и размер почтового ящика

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

В GUI пункт с размерами п/я зарыт слишком глубоко, поэтому решил найти способ получить эти сведения в CLI для возможной автоматической обработки.

Были использованы материалы:

  1. https://nwildner.com/posts/2019-09-27-zimbra-cli-tips/
  2. https://webhostinggeeks.com/howto/how-to-show-mailbox-size-on-zimbra-via-command-line/
  3. мануал по awk (оказалось, я забыл бейсик, пришлось лезть в шпаргальник)
  4. собственный пост по близкой тематике

Где хранится индивидуальная переопределенная квота, я не проверял.

Итак: zmprov gqu (в первой ссылке, кстати, эта команда написана неправильно - qgu вместо gqu, get quota usage) выводит списком почтовые ящики на сервере в формате "адрес квота занято", например "gates_wh@contoso.ru 471859200 1546199" - "пользователю В.Г. Гейтс выделено 450М, из которых занято полтора".

То есть, размеры выводятся в байтах, а дальше потребитель информации решает, в каких единицах ее использовать.

Для более-менее удобного анализа родил такую хитровыделанную команду:

zmprov gqu localhost|sort -nr -k2,3|awk {'printf "%.2fK:%.2fK=%2.2f%% %s\n", $3/1024, $2/1024, $3/$2*100, $1'}

  1. берем данные с этого же сервера
  2. сортируем по убыванию сначала квоты, потом - использованного места (2-е и 3-е поля в выводе gqu)
  3. выводим в виде "x.xxK:z.zzK=y.yy% адрес", увеличивая порядок единиц для удобочитаемости - килобайты вместо байтов, например "1509.96K:460800.00K=0.33% gates_wh@contoso.ru", то есть, у тов. Гейтса занято 0.33% от выделенной ему квоты

На этом пока всё

P.S.

Усовершенствованная версия команды для отправки отчетов и т.п.

zmprov gqu localhost|sort -nr -k2|awk {'printf "%.2fK:%.2fK=%2.2f%% %s\n", $3/1024, $2/1024, $3/$2*100, $1'} |grep -v "=-nan%"|sort -rn -t \=  -k2 |head -n 10

отличия: убираем недопустимые значения, например, деление на ноль, потом сортируем по процентажу и выводим только топ-10

сдуру решил, что "-d" у sort задает разделитель полей, и долго не мог понять, на что сортировка ругается... Оказалось, надо -t. И, да, -k позволяет задать только одно поле для сортировки, поэтому в исходной команде результаты сортировки могут быть странные