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

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


воскресенье, 27 сентября 2015 г.

Немного о структуре файлов .desktop

Gnome uses some of the .desktop files specification functions in the context of autostart to achieve it's control panel functionality, in short:

  - A user .desktop autostart file with the same name as one global, overrides it
  - A .desktop file can have a OnlyShowIn=GNOME;XFCE;OTHER_DE configuration entry, which defines the desktop environments this app will autostart.
  - A .desktop file can have a NotShownIn=GNOME,LXDE;OTHER_DE configuration entry, wich defines the desktop environments this app willl NOT autostart.
  - A .desktop file can have a Hidden=True configuration entry, wich "enables" or "disables" the autostart of this file.

Источник: http://forum.bittorrent.com/topic/28106-linux-desktop-gui-unofficial-packages-for-bittorrent-sync/

пятница, 18 сентября 2015 г.

bash: нумерация строк в файле

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

Структура файла данных /var/samba/secret/work (файл был несколько причёсан из исходного сырья):

NNN Текст[;]

Где NNN - трехзначное число. Если меньше 100, то дополненное ведущими нулями, хотя можно обойтись и без этого. (ведущие нули, кстати, сыграли злую шутку вроде той, о которой я уже писал в "особенностях арифметики")

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

#!/bin/bash
while read
    do
    a=$[a+1]
    deptSA=`echo "$REPLY"|cut -d \  -f 2-|sed "s/\;//"`
    depNSA=${REPLY:0:3}
    printf "%02d:%03d:$deptSA\n" $a $[10#$depNSA]
    if [ -d /var/samba/secret/$depNSA ]
    then
        ln -s /var/samba/secret/$depNSA /var/samba/secret/"$deptSA"
    fi
done</var/samba/secret/work

Файл будем читать построчно в цикле while командой read. Мне лень изощряться, поэтому читаем из stdin, куда файл вливается через переназначение. Вдвойне лень изощряться, поэтому не присваиваю никакую переменную, а использую дефолтную $REPLY.

среда, 9 сентября 2015 г.

bash: Возврат значений из функций и работа с файлами конфигурации

Удобно, когда скрипт берет настройки из некоего файла. Например, можно дать доступ к настройкам пользователю, не давая ему изменять собственно скрипт. Чтобы не повторять довольно длинный кусок кода в каждом скрипте каждый раз, когда надо получить какую-то настройку, лучше написать функцию, которая будет лезть в файл настроек и брать оттуда нужную переменную.
Тут вылезает другая грабля: функции в bash не умеют возвращать свои результаты. Максимум, на что они способны - вернуть код завершения. А как быть со строками?

вторник, 8 сентября 2015 г.

Zimbra: грамотно работаем с фильтрами сообщений в веб-клиенте и в командной строке

Содержание: как правильно экспортировать и импортировать фильтры обработки сообщений из учетных записей зимбры.

Веб-интерфейс позволяет создавать фильтры для обработки сообщений. Они сохраняются в параметре zimbraMailSieveScript.

Например:

$ zmprov ga учетка zimbramailsievescript

понедельник, 7 сентября 2015 г.

Zimbra: postfix, aliases и почтовые роботы

Содержание: как заставить postfix в составе Zimbra нормально принимать почту на псевдо-адреса в файле /etc/aliases или его аналоге.

Понадобилось мне обработать дополнительно письма, приходящие на конкретный адрес. Это было частью весьма эротичной (в смысле - поебаться с ней пришлось конкретно) задачи: письмо, отправленное на несколько абонентов "Мегафона", разбить на отдельные сообщения. То есть, "Мегафон" позволяет отправлять емайлы на "адреса" вида номер_телефона@sms.megafondv.ru (для Дальнего Востока). Но из строк to:/cc:/bcc: обрабатывается только последний адрес получателя, все остальные молча игнорируются. "Мегафон" предлагает услугу, что-то вроде пакетной рассылки смс таким способом, но за приличные таньга.
Проблема только в том, что если не удастся отправить своевременно короткие сообщения именно этим нескольким конкретным получателям, то "Мегафон" в нашей области может сдохнуть через несколько часов после наступления необходимости в такой отправке - диспетчер энергосистемы должен таким способом проинформировать начальство о серьезных сбоях вроде взрыва Фукусимы или пожаре на входном городском трансформаторе.
Тем не менее, такая общественно-полезная рассылка меньше чем на десяток корпоративных номеров всё равно осталась платной услугой, и мы решили её не покупать.

среда, 2 сентября 2015 г.

Особенности арифметики в bash: системы счисления

Краткое содержание: надо учитывать или явно указывать систему счисления.

Простая задача: найти, какой месяц был 7 месяцев назад.
Любым способом получаем текущий месяц, например:

(дальше использованы фрагменты рабочего скрипта, поэтому много излишеств, удалены некоторые другие команды, которые этими излишествами активно используются)

# лишняя переменная tSA только для удобства, чтобы не появились ошибки из-за
# неправильного экранирования вложенных команд
tSA=`date +%s`
# сегодня
todaySA=`date -d @$tSA +%Y%m%d`
# месяц сегодня
motSA=${todaySA:4:2}


Если месяц меньше 10, то в переменную motSA попадает значение вида 0N, где N - номер месяца с добавленным ведущим нулём. Всё красиво и гладко.Теперь находим искомое:

curmo=$motSA
echo curmo=$curmo
oldermo=$[curmo-7]
echo oldermo=$oldermo


Однако же... На дворе сентябрь, а значит curmo=09. По логике, 7 месяцев назад был февраль. Казалось бы, чего проще:

oldermo=$[curmo-7] ==> oldermo=$[09-7]

Однако, вместо oldermo=2 получаем ошибку:

$ curmo=09;echo $[curmo-7]
bash: 09: значение слишком велико для основания (ошибочная метка "09")


Мать моя женщина! Что за нафиг? Роемся в памяти и вспоминаем, что в некоторых языках программирования число с ведущим нулём считается заданным не в десятичной системе. В каком-то из ассемблеров ведущий ноль указывал на восьмеричную систему счисления (СС), и там вылезла бы подобная ошибка, потому как восьмеричные цифры от нуля до семёрки.
Начинаем курить мануал по bash и без проблем находим упоминание про base, hexadecimal, octal и т.п. В языке FORTH есть специальная конструкция, позволяющая временно изменить основание системы счисления (ОСС)в пределах текущего (под)выражения, что-то подобное должно быть и в bash. Точно, есть.

Для указания СС, в которой записано число, перед этим числом ставим префикс, в котором указываем десятичное значение ОСС. Например, 16 для шестнадцатиричной:

$ a=$[16#20];echo $a; a=$[8#20];echo $a;
32
16


По умолчанию bash распознает восьмеричную и шестнадцатеричную СС по префиксам 0 и 0x соответственно. Есть и некоторые другие особенности (знак "меньше" в сочетании "greater< than 9" не мой - скопировано из мануала к bash 4.3.11, для версии 4.2.25 такой ошибки нет):

Constants  with  a  leading 0 are interpreted as octal numbers.  A leading 0x or 0X denotes hexadecimal.  Otherwise, numbers take the form [base#]n, where the optional base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base.  If base# is omitted,  then  base 10  is  used.  When specifying n, the digits greater< than 9 are represented by the lowercase letters, the uppercase letters, @, and _, in that order.  If base is less than or equal to 36, lowercase and uppercase letters may be used interchangeably to represent numbers between 10 and 35.

Ладно, с ОСС разобрались, тестовый пример работает:

$ echo $[10#09-7]
2


И тут снова вылезает злосчастное "однако":

$ curmo=09;echo $[10#curmo-7]
bash: 10#curmo: значение слишком велико для основания (ошибочная метка "10#curmo")


На этот раз ошибка в том, что с указанием ОСС имя переменной перестает восприниматься как имя, а считается просто числом, записанным в указанной СС. Но в десятичке нет цифр c, m, o, r или u. Придется разыменовывать переменную:

$ curmo=09;echo $[10#$curmo-7]
2


Ура!