Scripting de um upload de lote sFTP a cada 1 minuto

8

Eu estou querendo gravar um vídeo de parte da minha casa com uma webcam enquanto eu estou fora por alguns dias para tentar garantir que qualquer hamburgers sejam fotografados e a foto enviada para o meu servidor antes que eles percebam.

Eu configurei uma webcam para transmitir imagens usando o mjpg_streamer. Isso funciona e está fluindo OK.

É possível capturar uma imagem do stream 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 o Amazon Web Services e acesso FTP usando sFTP. Estou conectado usando o plugin FireFTP do Firefox atualmente, então isso funciona. A ideia é deixar o computador rodando com a conexão ao vivo.

Eu gostaria de fazer um roteiro para tirar uma foto do fluxo, digamos a cada 1 minuto e ter a foto enviada para o meu servidor através da conexão FTP ao vivo, e também ter o arquivo original apagado do meu PC para que o próximo irá salvar O ou acrescentar um número ao final de cada arquivo e, em seguida, enviá-lo por FTP. Por exemplo, FileName1.jpeg, Filename2.jpeg.

Eu pesquisei por horas no Google e, embora haja muitas postagens sobre o script de um upload de FTP, não consigo encontrar nada sobre um fluxo constante de upload ... ou seja, "Assista a esta pasta, faça o upload do conteúdo a cada 1 minuto e, em seguida, um minuto depois, carregue qualquer conteúdo novo nele".

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 link -O nome_do_arquivo XX .jpg" a cada 30 segundos ou 1 minuto
  • Envie o nome de arquivo XX .jpg para o servidor FTP

Mas não tenho ideia de como fazer isso! Alguém pode me dirigir? Ou alguém sabe de uma maneira de fazer com o FileZilla ou algo assim (que não pode assistir a uma pasta AFAIK: link ?

    
por Gizmo_the_Great 27.08.2016 / 21:14

3 respostas

1

Gents - muito obrigado a todos que ajudaram. Em parte, todas as suas sugestões me ajudaram a chegar ao resultado final. Por isso, dei-lhe todo o crédito pelas respostas, mas publiquei a minha própria resposta abaixo, na esperança de que seja útil para os outros. Eu percebo que geralmente não é a coisa feita, mas neste caso há muitas áreas para formar a solução, então eu amarrei tudo em uma 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 AWS S3 Service com sua própria conta da Amazon: link

Defina uma nova chave de acesso para sua conta de usuário por meio de "Chaves de acesso - > Criar nova chave de acesso 'e baixar o arquivo CSV quando prometido. Se você não fizer isso, não poderá usar as funções da linha de comando S3: link

Abra o arquivo ROOTKEY.CSV, copie e cole o valor AccessKeyID contido e o valor de SecretKey quando solicitado ao iniciar o 'aws configure', que você inicia na linha de comando antes de usar o AWS com o 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 se conectar e fazer o 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 criação aqui: link Uma vez feito, navegue até sua pasta

> cd mjpg_streamer

Inicie o streams mjpg:

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

Verifique se está em execução visitando o seguinte link no seu navegador:

http://127.0.0.1:8080/stream.html

Pegue um único arquivo de data e hora (e salve-o no diretório local a partir do qual ele 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 sua pasta mjpeg_streamer, chamada 'output-16-09-01-22-35-30.jpg' se executada às 22:35 do dia 1º de setembro de 2016.

Crie um novo script bash (como MyScript.sh) e conceda permissões executáveis a ele e copie o conteúdo na parte inferior dele. Quando executado, ele criará um JPEG com registro de data e hora a cada 5 segundos até que a data atual se torne a data final especificada. Nesse caso, ele 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 bem-vindas.

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

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

Eu deixei por duas horas disparando a cada 10 segundos e gerou 74Mb de uploads. Então, eu trabalho isso para ser 6.5Gb por uma semana - menos do que o nível de preços para o serviço onde os custos entram em ação, o que eu acho que é 8Gb.

Obrigado novamente.

    
por 29.08.2016 / 17:00
4

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

Como você mencionou, há vários tutoriais sobre o envio de scripts de FTP disponíveis. Pelo menos um deles deveria ter incluído um exemplo que envia arquivos por um padrão, como "Snapshot - *. Jpg", onde o curinga corresponderia ao timestamp. Ou, você poderia apontar o programa FTP (como lftp ou ncftp, que possuem binários para scripts) para fazer upload de tudo em uma determinada pasta. Em seguida, limpe a pasta se o programa for bem-sucedido. Dessa forma, você pode executar o script com a frequência que desejar usando o cron ou um timer do systemd, e ter flexibilidade suficiente para sempre tentar fazer upload de todos os arquivos que não foram bem-sucedidos no último momento em que foi executado.

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

Se você quiser aumentar um pouco, talvez executar várias câmeras remotas / locais e fazer com que a detecção de movimento seja transferida para uma máquina central mais potente, veja o Zoneminder. Demora mais tempo para configurar, e é na minha experiência exigente sobre você definir manualmente as resoluções corretas em seus feeds de câmera, mas pode ser roteirizado em algum grau.

    
por 27.08.2016 / 22:32
1

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

Download de ferramentas: link

Documentos relevantes: link

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

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

    
por 29.08.2016 / 00:00