Herdar permissões de arquivo

0

Atualmente tenho um serviço de transmissão de áudio AirPlay (Shairport) rodando em Raspbian no meu Raspberry Pi. Eu tenho configurado para salvar os metadados para as músicas que são tocadas. Para cada música, ela salva a capa do álbum na pasta de metadados. Então, escrevi outro programa em Java para ler as capas dos álbuns e exibi-las.

O único problema é que, quando os arquivos são criados pelo shairport, as permissões são definidas para que apenas o usuário do shairport possa acessá-las. Eu tentei usar setfacl para alterar as permissões, mas isso não funciona ou, mais provavelmente, estou fazendo algo errado.

Como posso configurá-lo para que, quando um arquivo for adicionado à pasta, suas permissões sejam automaticamente definidas para outras pessoas?

Eu tentei todas as soluções que posso encontrar e nenhuma delas funciona.

    
por dabecks 19.12.2014 / 17:13

3 respostas

1

Eu encontrei outra solução antes de as outras respostas serem postadas, então não sei se os outros trabalham, mas no caso de alguém precisar de ajuda com isso, foi o que acabei fazendo:

Eu escrevi o seguinte script bash, que escuta novos arquivos a serem adicionados à pasta e, em seguida, altera automaticamente as permissões para o arquivo.

#!/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

Eu, então, criei um daemon para o script para mantê-lo em execução em segundo plano. Não tenho certeza se esta é a melhor maneira de fazê-lo, mas sei que funciona.

    
por 31.01.2015 / 21:23
1

Aqui está uma solução potencial. Eu olhei para o código dentro do shairport que escreve o arquivo de capa do álbum. Provavelmente, podemos modificar o código do shairport para incluir um conjunto específico de permissões.

Sou relativamente novo em tudo isso, então fique comigo.

Minha ideia é editar o arquivo metadata.c. Aqui está um link para o arquivo no shaitport github: link

Dentro desse arquivo, procuramos a linha que primeiro abre o arquivo de arte do álbum para gravação. Nesse caso, parece assim:

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

Isso abre o arquivo e armazena o código resultante no int cover_fd, que pode ser usado para verificar se o arquivo foi aberto com sucesso.

Em c, open () é chamado assim: open(const char *path, int oflags, mode_t mode) . link

Em particular, o modo mod_t define as permissões do arquivo recém-criado. Shairport, em seguida, define as permissões como S_IRUSR | S_IWUSR ou (Defina direitos de leitura para o proprietário como true e defina os direitos de gravação para o proprietário como true.)

O Open também pode usar permissões de estilo do Linux. Isso significa que você pode alterar S_IRUSR | S_IWUSR para, digamos, 0666 ou o que você quiser.

Uma vez feito, salve os metadata.c modificados e recompile assim:

cd shairport

./configure

make

make install

Eu não tenho um pi ou shairport na minha frente para testar isso agora, mas deve funcionar.

    
por 28.01.2015 / 19:54
0

Enquanto estiver lá, você também pode pensar em fazer algumas outras alterações.

Se você alterar as seguintes linhas:

size_t pl = strlen(dir) + 1 + strlen(prefix) + strlen(img_md5_str) + 1 + strlen(ext);

char *path = malloc(pl+1);

snprintf(path, pl+1, "%s/%s%s.%s", dir, prefix, img_md5_str, ext);

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

para:

char *cover_file_name = "/cover_art.jpg";

size_t pl = strlen(dir) + strlen(cover_file_name);

char *path = malloc(pl+1);

snprintf(path, pl+1, "%s%s", dir, cover_file_name);

int cover_fd = open(path, O_TRUNC | O_WRONLY | O_CREAT, 0666);

Ele deve modificar o shairport para substituir continuamente um arquivo de capa do álbum, em vez de criar um novo sempre. O benefício seria que seu programa java sempre saberia que o nome da imagem mais recente seria cover_art.jpg. Pode ser muito mais fácil fazer as coisas dessa maneira, em vez de ter que descobrir qual jpg é o mais recente. Eu menciono isso porque, pelo menos para mim, as atualizações do shairport do arquivo FIFO parecem sempre exibir o trabalho artístico da música anterior. Isso ainda não foi testado, mas deve colocá-lo no caminho certo. Boa sorte!

    
por 29.01.2015 / 00:30