В настоящее время у меня есть служба потокового аудио AirPlay (Shairport), работающая на Raspbian на моем Raspberry Pi. У меня настроено сохранение метаданных песен, которые воспроизводятся. Для каждой песни она сохраняет обложку альбома в папку метаданных. Затем я написал другую программу на Java для чтения обложек альбомов и их отображения.

Единственная проблема заключается в том, что когда файлы создаются shairport, разрешения устанавливаются так, что только пользователь shairport может получить к ним доступ. Я пытался использовать setfacl для изменения разрешений, но либо он не работает, либо, скорее всего, я делаю что-то не так.

Как настроить его так, чтобы при добавлении файла в папку его права доступа автоматически устанавливались для других?

Я перепробовал каждое решение, которое смог найти, и ни одно из них не сработало.

3 ответа3

1

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

Я относительно новичок во всем этом, так что терпите меня.

Моя идея - отредактировать файл metadata.c. Вот ссылка на файл на GirHub Shairport:https://github.com/abrasive/shairport/blob/master/metadata.c

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

int cover_fd = open(path, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Это откроет файл и сохранит полученный код в int cover_fd, который можно использовать для проверки, был ли файл открыт успешно.

В c open() вызывается так: open(const char *path, int oflags, mode_t mode) . http://codewiki.wikidot.com/c:system-calls:open

В частности, режим mod_t определяет права доступа для вновь создаваемого файла. Затем Shairport устанавливает права доступа как S_IRUSR | S_IWUSR, или (Установите права чтения для владельца на true и установите права на запись для владельца на true.)

Open также может использовать разрешения в стиле Linux. Это означает, что вы можете изменить S_IRUSR | S_IWUSR, скажем, 0666 или что угодно.

После этого сохраните измененный файл metadata.c и перекомпилируйте его так:

cd shairport

./configure

make

make install

У меня нет ни пи, ни шейпорта передо мной, чтобы проверить это прямо сейчас, но это должно сработать.

1

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

Я написал следующий скрипт bash, который прослушивает новые файлы, которые будут добавлены в папку, а затем автоматически меняет разрешения для файла.

#!/bin/sh

echo "Starting change_permissions"

inotifywait -m /etc/shairport/metadata/ -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        sudo chmod 777 /etc/shairport/metadata/$file
    done

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

0

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

Если вы измените следующие строки:

size_t pl = strlen(dir) + 1 + strlen(префикс) + strlen(img_md5_str) + 1 + strlen(ext);

char * path = malloc(pl + 1);

snprintf(путь, pl + 1, "% s/% s% s.% s", dir, префикс, img_md5_str, ext);

int cover_fd = open(путь, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

чтобы:

char * cover_file_name = "/cover_art.jpg";

size_t pl = strlen(dir) + strlen(имя_файла_крытия);

char * path = malloc(pl + 1);

snprintf(путь, pl + 1, "% s% s", dir, имя_файла_крытия);

int cover_fd = open(путь, O_TRUNC | O_WRONLY | O_CREAT, 0666);

Он должен изменить shairport, чтобы постоянно перезаписывать один файл обложки альбома, вместо того, чтобы каждый раз создавать новый. Преимущество заключается в том, что ваша java-программа всегда будет знать, что имя самого последнего изображения будет cover_art.jpg. Это может быть намного проще, чем выяснять, какой jpg является самым последним. Я упоминаю об этом, потому что, по крайней мере для меня, обновления Shairport файла FIFO, кажется, всегда отображают обложку предыдущей песни. Это все еще не проверено, но должно привести вас на правильный путь. Удачи!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .