LINUX.ORG.RU

Поиск в множестве шаблонов по конкретному образцу

 , , ,


0

1

Изначальная задача: пройтись по файловой структуре и проверить права у файлов.

Хочется создать map с shell-glob, чтоб эффективно определять права файлов, например:

my $default_mode = '0644';

my %specific_rights = (
    'app/bin/*' => { # все файлы в папке запускаемые
        owner => 'root',
        group => 'root',
        mode  => '0755'
    }
);

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

Возникает проблема: как найти шаблон app/bin/* для файла app/bin/prog? Как правильно организовать структуры данных для такой задачи? Какие алгоритмы использовать? Помогите пожалуйста

★★★★★

Последнее исправление: KennyMinigun (всего исправлений: 2)

Возникает проблема: как найти шаблон app/bin/* для файла app/bin/prog?

А если примерно так:

mask =~ s/\*/[^\\\/]*/g; # вместо 'app/bin/*' будет 'app/bin/[^\/]*'
my $re = qr/$mask/;

if ( $filename =~ $re ) {
    # ы?
}
router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)

З.Ы. возможно, стоит посмотреть в сторону cfengine, puppet, chef, ansible

З.З.Ы. именно такой кусок кода, как в твоём примере, осчастливит пользователей публично доступным /etc/shadow, файлами с паролями. И плюс неработающим входом по ssh ключам

router ★★★★★
()
Ответ на: комментарий от router

Спасибо, вариант. Единственное, что беспокоит — это зависимость времени исполнения от размера хеша исключений. (т.е. ка)

По моим скромным подсчётам это ограничено сверху O(n * m), где n — количество файлов, m — количество исключений. Хорошо бы сделать хотя бы O(n * log(m)) (а в идеале O(n)).

KennyMinigun ★★★★★
() автор топика
Ответ на: комментарий от router

З.З.Ы. именно такой кусок кода, как в твоём примере, осчастливит пользователей публично доступным /etc/shadow, файлами с паролями. И плюс неработающим входом по ssh ключам

Проверять мне надо только файлы конкретного приложения, да и в шапке пример лишь для понятности :)

KennyMinigun ★★★★★
() автор топика

как найти шаблон app/bin/* для файла app/bin/prog?

Если нужно перебирать все файлы, то можно сделать ключи хеша регекспами:

my %specific_rights = (
    qr'app/bin/.*' => {}
);
и в коде для каждого файла циклом сопостовлять его с регекспом. Если ключей не слишком много(<100) то достаточно быстро будет работать(на фоне вызовов stat).

Если нужно не для все файлов, то можно запрашивать файлы по glob:

while(my $f=glob $glob){...}
и проверять соответствие их аттрибутов, будет куда меньше вызовов stat.

У меня в костыле для мониторинга есть удобная штука для проверки соответствия аттрибутов файлов прямо из конфига вроде такого:

files_teewgl=>{
        glob=>'/var/www/tee/wgl/json/*',
        size=>[500,512,20*2**20,30*2**20],
        count=>[400,450,600,700],
        perm=>'0755'
}
получает глоб, проходит по всем файлам смотрит какие у файла должны быть аттрибуты вроде даты модификации, размера, запускает соответствующие процедуры и в случае если они сообщают о отличии от нормы зажигает лампочку.

disarmer ★★★
()
Ответ на: комментарий от KennyMinigun

Хорошо бы сделать хотя бы O(n * log(m)) (а в идеале O(n)).

Можно сделать вложенный хеш

my %specific_rights = (
    'app'=>{
        'bin'=>{
            owner => 'root',
            group => 'root',
            mode  => '0755'
        }
    }
);
и спускаться по веткам, которые совпадают, тогда в хеше будет значительно меньше ключей. Усложнит код, но ускорит при большом количестве исключений.

disarmer ★★★
()
Ответ на: комментарий от disarmer

Спасибо, неплохой подход. Надо попробовать

KennyMinigun ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.