Estou tentando capturar os dados destinados a uma "impressora em rede" para que possam ser processados localmente ou encaminhados para outro sistema. PareceLinux como dispositivo de impressora de rede (Raw, porta 9100)
farei o que eu quiser e só exigir:
9100 stream tcp nowait cat > some_file
mas gostaria de poder testá-lo no meu Macbook e isso não tem inetd
.
Potencialmente eu poderia usar, launchd
pois é o substituto inetd
do OSX, mas lendo a documentação, não está claro como fazer o equivalente ao acima. Portanto, qualquer solução - como obter inetd
o OSX ou como criar um arquivo plist para launchd
fazer o equivalente é o que estou procurando.
Responder1
Os arquivos XML de lançamento existentes /Library/LaunchDaemons
ou /System/Library/LaunchDaemons
merecem estudo; de um deles e com algumas tentativas em/etc/services
$ grep 9100 /etc/services
hp-pdl-datastr 9100/udp # PDL Data Streaming Port
hp-pdl-datastr 9100/tcp # PDL Data Streaming Port
pode-se adaptar um dos arquivos existentes ao que salvei/Library/LaunchDaemons/cattery.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>Label</key>
<string>com.exampe.cattery</string>
<key>ProgramArguments</key>
<array>
<string>/var/root/cattery</string>
</array>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
<key>InitGroups</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>hp-pdl-datastr</string>
<key>SockType</key>
<string>stream</string>
</dict>
</dict>
</dict>
</plist>
Onde /var/root/cattery
está o script de teste ruim (o que acontece se os clientes se conectarem duas ou mais vezes por segundo?):
$ sudo cat /var/root/cattery
#!/bin/sh
cat > "/var/root/out.$(date +%s)"
$ sudo chmod +x /var/root/cattery
E então habilitamos nosso novo serviço
$ sudo launchctl load -w /Library/LaunchDaemons/cattery.plist
E alimente alguns dados de teste
$ echo foo | nc localhost 9100
$ sudo find /var/root -name out\* -maxdepth 1
/var/root/out.1511845970
$ sudo cat /var/root/out.1511845970
foo
$
NOTA este código provavelmente não deve ser executado como root
, um
<key>UserName</key>
<string>_lp</string>
linha como visto em /System/Library/LaunchDaemons/org.cups.cups-lpd.plist
pode ajudar a não executar o acima como root
, nesse caso o diretório de saída para os dados salvos deve ser gravável por esse usuário, e o programa executado como executável (e talvez também legível) por esse usuário.