Secuencia de comandos de una carga por lotes sFTP cada 1 minuto

8

Quiero grabar un video de una parte de mi casa con una cámara web mientras estoy ausente durante unos días para tratar de asegurarme de que cualquier ladrón sea fotografiado y la foto cargada en mi servidor antes de que se den cuenta.

He configurado una cámara web para transmitir secuencias usando mjpg_streamer. Eso funciona y está transmitiendo bien.

Es posible tomar una captura fija de la transmisión siempre que desee que se llame 'FileName.jpg':

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

Tengo un servidor FTP de Amazon con Amazon Web Services y acceso FTP usando sFTP. Estoy conectado usando el complemento FireFTP de Firefox actualmente, por lo que funciona. La idea es dejar la computadora funcionando con la conexión en vivo.

Me gustaría escribir la toma de una imagen de la transmisión, digamos cada 1 minuto y cargar la imagen a mi servidor a través de la conexión FTP en vivo, y eliminar el archivo original de mi PC para que el siguiente guarde O o agregue un número al final de cada archivo y luego envíelo por FTP. por ejemplo, FileName1.jpeg, Filename2.jpeg.

He buscado en Google durante horas y, aunque hay muchas publicaciones sobre la creación de secuencias de comandos para una carga FTP, no puedo encontrar ninguna sobre un flujo constante de carga ... es decir, "Mira esta carpeta, sube el contenido cada 1 minuto y luego un minuto después subir cualquier contenido nuevo que contenga ".

Supongo que necesito un script bash que:

  • mantener un contador para que cada archivo recién creado obtenga un nombre diferente
  • Envíe ese nombre de archivo al "wget http://127.0.0.1:8080/?action=snapshot -O FileName XX .jpg" cada 30 segundos o 1 minuto
  • Cargue el FileName XX .jpg al servidor FTP

¡Pero no tengo idea de cómo hacerlo! ¿Alguien puede dirigirme? ¿O alguien sabe de una manera de hacer con FileZilla o algo (que no puede ver una carpeta AFAIK: https://forum.filezilla-project.org/viewtopic.php?t=41609 ?

Gizmo_the_Great
fuente
1
¿Por qué ejecutar un servidor FTP en EC2, cuando puede usar S3 y el cliente AWS CLI para cargar archivos a una fracción del costo?
trognanders
Tengo uno de los gratuitos afaik. Sin embargo, si el que mencionas sería mejor para la tarea, ¿usaría uno?
Gizmo_the_Great
Copiar archivos a ftp con winscp es como 5 líneas, vea su sitio web.
jiggunjer
Y es para Windows. Estamos hablando de Linux aquí.
Gizmo_the_Great
@Gizmo_the_Great Sin duda es lo que usaría.
trognanders

Respuestas:

4

Mi primer consejo sería nombrar los archivos usando la fecha y hora en que fueron tomados. De esa manera, no necesitará mantener un contador en ningún lado, lo que sería difícil en un script que no se ejecuta continuamente ya que sus variables se restablecerían en cada invocación. Puede almacenar las variables en archivos, pero es más fácil si se asegura de que los nombres no colisionen. Algo así como wget http://127.0.0.1:8080/?action=snapshot -O "Snapshot-$(date).jpg"si estás usando Bash. (Lo siento si la sintaxis no funciona, no soy un experto en Bash y estoy escribiendo esto en mi teléfono).

Como mencionó, hay varios tutoriales sobre la carga de scripts de FTP disponibles. Al menos uno de ellos debería haber incluido un ejemplo que carga archivos por un patrón, como "Instantánea - *. Jpg", donde el comodín coincidiría con la marca de tiempo. O bien, puede apuntar el programa FTP (como lftp o ncftp, que tienen binarios destinados a secuencias de comandos) para cargar todo en una carpeta determinada. Luego limpie la carpeta si el programa tuvo éxito. De esa manera, puede ejecutar su secuencia de comandos con la frecuencia que desee utilizando cron o un temporizador systemd, y hacer que sea lo suficientemente flexible como para intentar cargar siempre los archivos que no tuvo éxito la última vez que se ejecutó.

También hay un software diseñado para hacer esta tarea, y más, por su cuenta. Uno de estos programas, que he usado yo mismo, simplemente se llama "movimiento" y está disponible para la mayoría de las distribuciones. Tiene activador de movimiento incorporado (grabar y / o tomar instantáneas) o modos continuos. Puede ser un poco intensivo de CPU en sistemas como un Raspberry-Pi, pero ciertamente funciona.

Si desea intensificarlo un poco, quizás ejecute múltiples cámaras remotas / locales y descargue la detección de movimiento a una máquina central más potente, mire Zoneminder. La configuración lleva más tiempo y, en mi experiencia, es quisquilloso con usted al configurar manualmente las resoluciones correctas en las alimentaciones de su cámara, pero puede ser un guión hasta cierto punto.

TwoD
fuente
1

Usaría AWS S3 en lugar de un servidor FTP en EC2, y la herramienta AWS CLI para cargar los archivos. Es una solución mucho más ligera que no requiere administración de sistemas. S3 proporciona un almacenamiento mucho más duradero que los volúmenes para EC2.

Descarga de herramienta: https://aws.amazon.com/cli/

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

Puede crear un usuario que solo pueda cargar en el bucket de S3 usando IAM (¡para que los delincuentes no puedan borrar los archivos!)

Realizaría esta tarea haciendo un script bash (o perl, node.js, ruby, powershell? ...) que llama a wget y genera un nombre de archivo con la fecha y hora. Llame aws s3 cp ...en un bucle for para cargar todos los archivos en la carpeta. En el ciclo, después de cada aws s3 cpllamada exitosa para cada archivo, muévalo a una carpeta de archivo para guardarlo localmente también. Si no desea utilizar un archivo local aws s3 mvpara purgar automáticamente las cosas que ya se han cargado.

trognanders
fuente
Gran consejo S Bailey. Fui con esa idea al final, e incorporé el resto. ¡Gracias por el consejo!
Gizmo_the_Great
1

Caballeros: muchas gracias a todos los que han ayudado. En parte, todas sus sugerencias me han ayudado a llegar al resultado final. Así que le he dado todo el crédito por las respuestas, pero he publicado mi propia respuesta a continuación con la esperanza de que sea útil para otros. Me doy cuenta de que, en general, no es lo que se hace, pero en este caso hay muchas áreas para formar la solución, así que lo he vinculado todo en uno a continuación.

Instale los servicios necesarios para usar AWS S3

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

Regístrese en el servicio AWS S3 con su propia cuenta de Amazon: https://aws.amazon.com/s3/

Defina una nueva clave de acceso para su cuenta de usuario a través de 'Claves de acceso -> Crear nueva clave de acceso' y descargue el archivo CSV cuando se le solicite. Si no hace esto, no podrá usar las funciones de la línea de comandos S3: https://console.aws.amazon.com/iam/home?#security_credential

Abra el archivo ROOTKEY.CSV y copie y luego pegue el valor de AccessKeyID contenido y el valor de SecretKey cuando se le solicite cuando inicie 'aws configure', que inicia desde la línea de comandos antes de usar AWS con Linux.

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

Pruebe que puede conectar y cargar un archivo con un archivo sample.txt: > aws s3 mv ~/SourceFolder/sample.txt s3://NameOfYourAWSS3Bucket/ AFolderYouHaveCreated

Descargue e instale mjpg_streamer siguiendo las instrucciones de compilación aquí: https://github.com/jacksonliam/mjpg-streamer#building--installation Una vez hecho esto, navegue a su carpeta

> cd mjpg_streamer

Inicie el mjpg streamer:

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

Compruebe que se está ejecutando visitando el siguiente enlace en su navegador web:

http://127.0.0.1:8080/stream.html

Tome un solo archivo estampado de fecha y hora (y guárdelo en el directorio local desde el que se está ejecutando) con:

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

Esto creará un archivo en la subcarpeta 'www' de su carpeta mjpeg_streamer, llamada 'output-16-09-01-22-35-30.jpg' si se ejecuta a las 22:35 del 1 de septiembre de 2016.

Cree un nuevo script de bash (como MyScript.sh) y dele permisos ejecutables y copie el contenido en la parte inferior. Cuando se ejecuta, creará un JPEG con marca de tiempo cada 5 segundos hasta que la fecha actual se convierta en la fecha de finalización especificada. En este caso, comienza en la fecha A y termina en la Fecha B. Sustituya sus propias fechas.

Copie esto en el script, sustituyendo las rutas 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

Sugerencias para mejoras bienvenidas.

Además, puede verificar el progreso de su almacenamiento en el AWS S3 con

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

Lo dejé durante dos horas disparando cada 10 segundos y generó 74Mb de cargas. Así que calculo que es 6.5 Gb durante una semana, menos que el nivel de precios para el servicio donde entran los costos, que creo que es de 8 Gb.

Gracias de nuevo.

Gizmo_the_Great
fuente
1
Con respecto a las preocupaciones por el uso del espacio, S3 le permite establecer reglas de ciclo de vida para los objetos que los moverán a un almacenamiento más barato como el glaciar (o simplemente los eliminarán) después de un tiempo específico. Su script de carga es más simple de lo que imaginaba que sería el mío ... eso es un cumplido. ¡Gracias por publicar toda la solución!
trognanders