Posso criar um arquivo “symlink-esque” para “mesclar” dois arquivos juntos?

5

Estou lidando com um aplicativo que lê um arquivo de configuração, config.yml , do diretório atual. Esse arquivo de configuração contém informações secretas (chaves de API) que não devem ser registradas no controle de origem e outras informações de configuração que podem ser.

O que eu gostaria de fazer é dividir este arquivo de configuração em dois, para ter config.secret.yml e config.public.yml . config.secret.yml será ignorado pelo controle de origem, enquanto config.public.yml pode ser verificado.

Depois, quero criar de alguma forma um objeto semelhante a um arquivo config.yml , que efetivamente "simbolize" o conteúdo concatenado de config.secret.yml e config.public.yml , para que isso aconteça:

> cat config.secret.yml
---
:api_key: 2712ab206a8003e44b2a84c467fc1b58
>
> cat config.public.yml    
:site_id: 123
>
> cat config.yml
---
:api_key: 2712ab206a8003e44b2a84c467fc1b58
:site_id: 123

Estou ciente de que os próprios links simbólicos não suportam esse tipo de comportamento, e que normalmente as configurações "padrão" e "local" são lidas do lado do aplicativo, mas vamos trabalhar sob a suposição de que apenas uma única arquivo de configuração pode ser lido.

O arquivo é lido pelo método File.read() do Ruby e analisado por YAML.load() se isso oferecer alguma oportunidade para hacks astutos.

    
por Gavin Ballard 02.06.2014 / 12:26

1 resposta

3

Você deve poder usar um pipe nomeado para isso.

Como exemplo:

echo foo > file1
echo bar > file2

crie um novo script no mesmo diretório da seguinte forma:

combine.sh:

#!/bin/bash

[ -p foobar ] && rm foobar

trap "[ -p foobar ] && rm foobar && exit" SIGINT

while [  true ]; do
  mkfifo foobar
  echo "Writing File"
  cat file1 file2 > foobar
  rm foobar
done

Então

chmod +x combine.sh
./combine.sh

Isso criará um pipe chamado foobar no mesmo diretório. Agora você pode ler este pipe de qualquer processo como se fosse um arquivo real.

Por exemplo, em um terminal separado:

$ cat foobar
foo
bar

É claro que você pode executar isso em segundo plano usando ./combine.sh 2>&1 > /dev/null & ou executá-lo como um serviço se precisar de maior persistência.

    
por 03.06.2014 / 20:59