Script de upload em lote de sFTP a cada 1 minuto

8

Estou querendo gravar um vídeo de parte da minha casa com uma webcam enquanto estou ausente por alguns dias para tentar garantir que todos os hambúrgueres sejam fotografados e a foto carregada no meu servidor antes que eles percebam.

Eu configurei uma webcam para transmitir imagens usando mjpg_streamer. Isso funciona e está transmitindo bem.

É possível fazer uma captura imóvel do fluxo sempre que você quiser chamado 'FileName.jpg':

wget http://127.0.0.1:8080/?action=snapshot -O FileName.jpg 

Eu tenho um servidor FTP da Amazon com Amazon Web Services e acesso ao FTP usando sFTP. Estou conectado usando o plug-in FireFTP do Firefox atualmente, para que funcione. A idéia é deixar o computador funcionando com a conexão ativa.

Gostaria de criar um script para tirar uma foto do fluxo, digamos a cada 1 minuto e fazer o upload da foto para o meu servidor através da conexão FTP ao vivo, e excluir o arquivo original do meu PC para que o próximo salve O ou acrescente um número ao final de cada arquivo e, em seguida, envie-o por FTP. por exemplo, FileName1.jpeg, Filename2.jpeg.

Pesquisei no Google por horas e, embora existam muitas postagens sobre scripts de envio de FTP, não consigo encontrar nada sobre um fluxo constante de envios ... ou seja, "Assista a esta pasta, envie o conteúdo a cada 1 minuto e depois um minuto depois faça upload de qualquer conteúdo novo ".

Eu acho que preciso de um script bash que:

  • mantenha um contador para que cada arquivo recém-criado obtenha um nome diferente
  • Envie esse nome de arquivo para o "wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg" a cada 30 segundos ou 1 minuto
  • Carregue o nome do arquivo XX .jpg no servidor FTP

Mas não tenho ideia de como fazer isso! Alguém pode me dirigir? Ou alguém sabe alguma maneira de fazer com o FileZilla ou algo assim (que não pode assistir a uma pasta AFAIK: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?

Gizmo_the_Great
fonte
11
Por que executar um servidor FTP no EC2, quando você pode usar o S3 e o cliente AWS CLI para upload de arquivos por uma fração do custo?
trognanders
Eu tenho um dos gratuitos grátis. Se o que você mencionou seria melhor para a tarefa, eu usaria um?
precisa saber é o seguinte
Copiar arquivos para ftp com winscp é como 5 linhas, consulte o site deles.
precisa saber é o seguinte
E é para Windows. Estamos falando de Linux aqui.
precisa saber é o seguinte
@Gizmo_the_Great É certamente o que eu usaria.
trognanders

Respostas:

4

Minha primeira dica seria nomear os arquivos usando a data e a hora em que foram tirados. Dessa forma, você não precisará manter um contador em nenhum lugar, o que seria difícil em um script que não seja executado continuamente, pois suas variáveis ​​serão redefinidas a cada chamada. Você pode armazenar as variáveis ​​em arquivos, mas é mais fácil garantir que os nomes não colidam. Algo como wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"se você estivesse usando o Bash. (Desculpe, se a sintaxe não funcionar, eu não sou especialista em Bash e estou digitando isso no meu telefone.)

Como você mencionou, existem vários tutoriais sobre scripts de upload de FTP disponíveis. Pelo menos um deles deveria ter incluído um exemplo que carrega arquivos por um padrão, como "Snapshot - *. Jpg", em que o curinga corresponderia ao carimbo de data / hora. Ou, você pode apontar o programa FTP (como lftp ou ncftp, que possui binários para script) para fazer upload de tudo em uma determinada pasta. Em seguida, limpe a pasta se o programa tiver êxito. Dessa forma, você pode executar seu script quantas vezes quiser usando o cron ou um timer do systemd, e seja flexível o suficiente para sempre tentar carregar os arquivos que não foram bem-sucedidos na execução posterior.

Também há software projetado para executar essa tarefa e muito mais por conta própria. Um desses programas, que eu já usei, é simplesmente chamado de "movimento" e está disponível para a maioria das distribuições. Possui acionamento de movimento interno (gravar e / ou tirar instantâneos) ou modos contínuos. Pode ser um pouco intensivo de CPU em sistemas como um Raspberry-Pi, mas certamente funciona.

Se você quiser acelerar um pouco, talvez execute várias câmeras remotas / locais e tenha a detecção de movimento descarregada em uma máquina central mais poderosa, consulte o Zoneminder. Demora mais tempo para configurar e, na minha experiência, é exigente que você defina manualmente as resoluções corretas nos feeds da câmera, mas pode ser um script até certo ponto.

TwoD
fonte
1

Eu usaria o AWS S3 em vez de um servidor FTP no EC2 e a ferramenta AWS CLI para fazer upload dos arquivos. É uma solução muito mais leve que não requer administração de sistemas. O S3 fornece armazenamento muito mais durável do que os volumes do EC2.

Download da ferramenta: https://aws.amazon.com/cli/

Documentos relevantes: http://docs.aws.amazon.com/cli/latest/reference/s3/

Você pode criar um usuário que só pode fazer upload para o bucket S3 usando o IAM (para que os criminosos não possam apagar os arquivos!)

Eu realizaria essa tarefa criando um script bash (ou perl, node.js, ruby, powershell ?, ...) que chama wget e gera um nome de arquivo com a data e hora. Chame aws s3 cp ...um loop for para carregar todos os arquivos na pasta. No loop, a cada aws s3 cpchamada bem-sucedida de cada arquivo, mova-o para uma pasta de arquivamento para ser salva localmente também. Se você não deseja que um arquivo local use, aws s3 mvlimpe automaticamente os itens que já foram enviados.

reconhecedores
fonte
Grande conselho S Bailey. Eu fui com essa ideia no final e incorporei o resto. Obrigado pela dica!
Gizmo_the_Great 29/08
1

Senhores - muito obrigado a todos que ajudaram. Em parte, todas as suas sugestões me ajudaram a chegar ao resultado final. Portanto, dei todo o crédito pelas respostas, mas postamos minha própria resposta abaixo, na esperança de que seja útil para outras pessoas. Sei que geralmente não é o que está feito, mas neste caso há muitas áreas para formar a solução, então juntei tudo em uma delas abaixo.

Instale os serviços necessários para usar o AWS S3

# > sudo apt-get install python-pip
# > sudo pip install awscli

Inscreva-se no Serviço AWS S3 com sua própria conta Amazon: https://aws.amazon.com/s3/

Defina a nova chave de acesso para sua conta de usuário em 'Teclas de acesso -> Criar nova chave de acesso' e faça o download do arquivo CSV quando solicitado. Se você não fizer isso, não poderá usar as funções da linha de comando S3: https://console.aws.amazon.com/iam/home?#security_credential

Abra o arquivo ROOTKEY.CSV, copie e cole o valor AccessKeyID contido e o valor SecretKey quando solicitado quando você inicia o 'aws configure', que é iniciado na linha de comando antes de usar a AWS com Linux.

> aws configure
Enter your access key and secret key when asked. You can leave the third and fourth empty or as 'None'. 

Teste você pode conectar e fazer upload de um arquivo com um arquivo sample.txt: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

Faça o download e instale o mjpg_streamer seguindo as instruções de compilação aqui: https://github.com/jacksonliam/mjpg-streamer#building--installation Depois de concluído, navegue até a pasta

> cd mjpg_streamer

Inicie o streamer mjpg:

> mjpg_streamer -i "./input_uvc.so -f 15 -r 1280x960" -o "./output_http.so -w ./www"

Verifique se está funcionando, visitando o seguinte link no seu navegador da web:

http://127.0.0.1:8080/stream.html

Pegue um único arquivo com data e hora (e salve-o no diretório local a partir do qual está sendo executado) com:

> wget http://127.0.0.1:8080/?action=snapshot -O output-$(date +"%Y-%m-%d-%k-%M-%S").jpg

Isso criará um arquivo na subpasta 'www' da pasta mjpeg_streamer, chamada 'output-16-09-01-22-35-30.jpg', se executado às 22:35 de 1º de setembro de 2016.

Crie um novo script bash (como MyScript.sh) e dê permissões executáveis ​​a ele e copie o conteúdo na parte inferior. Quando executado, ele cria um JPEG com carimbo de data e hora a cada 5 segundos até que a data atual se torne a data final especificada. Nesse caso, começa na data A e termina na data B. Substitua suas próprias datas.

Copie isso no script, substituindo os caminhos relevantes:

#!/bin/bash  
     SOURCE="/home/YourUser/YourSourceFolder"
     DESTINATION="s3://YourS3Bucket/DestinationFolder"
     input_start=2016-8-29
     input_end=2016-9-9
     startdate=$(date -I -d "$input_start") || exit -1
     enddate=$(date -I -d "$input_end")     || exit -1

     d="$startdate"

       while [ "$d" != "$enddate" ]; do 
       sleep 5
         wget "http://127.0.0.1:8080/?action=snapshot" -O output-$(date +"%Y-%m-%d-%k-%M-%S")'.jpg';
         aws s3 mv $SOURCE $DESTINATION --recursive;
       done

Sugestões de melhorias são bem-vindas.

Além disso, você pode verificar o andamento do seu armazenamento no AWS S3 com

aws s3 ls s3://yourbucketname --recursive --human-readable --summarize

Deixei por duas horas disparando a cada 10 segundos e gerou 74Mb de uploads. Por isso, calculo que são 6,5 Gb por uma semana - menos do que o nível de preços do serviço em que os custos aumentam, o que eu acho que é 8 Gb.

Obrigado novamente.

Gizmo_the_Great
fonte
11
No que diz respeito às preocupações de uso de espaço, o S3 permite definir regras de ciclo de vida para objetos que os moverão para um armazenamento mais barato, como geleira (ou apenas exclua-os) após um tempo especificado. Seu script de upload é mais simples do que eu imaginava que o meu seria ... isso é um elogio. Obrigado por postar toda a solução!
trognanders