Manual Para Varias Instancias De OctoPrint Octo
User Manual:
Open the PDF directly: View PDF .
Page Count: 22
Download | |
Open PDF In Browser | View PDF |
Manual para varias instancias de OctoPrint David Zotes González ABADÍA TECNOLÓGICA Contenido 1. Maquina ........................................................................................................................................ 2 2. Usuarios ........................................................................................................................................ 2 3. Grupos de trabajo .......................................................................................................................... 2 4. Usuario cámara ............................................................................................................................. 3 5. Clonar repositorio ......................................................................................................................... 3 6. Scripts OctoPrint ........................................................................................................................... 3 7. Scripts cámaras ............................................................................................................................. 7 8. Monitor OctoPrint ....................................................................................................................... 13 9. Controles OctoPrint .................................................................................................................... 18 10. Proxy Nginx ............................................................................................................................ 19 1. Maquina Lo primero que tenemos que tener es instalada una maquina con un Linux. En nuestro caso hemos instalado un Debian. También existe una imagen reparada para Raspberry Pi pero en este manual lo vamos a hacer sobre un pc con Debian. No nos vamos a detener en este aspecto ya que asumimos que este paso no debería dar problemas. 2. Usuarios A continuación, procederemos a añadir un usuario por cada instancia de OctoPrint que queremos instalar. Añadirems un usuario por cada instancia de OctoPrint que queramos instalar. Esto lo haremos con el siguiente comando: 1. 2. 3. 4. 5. 6. 7. adduser adduser adduser adduser adduser adduser adduser impresor1 impresor2 impresor3 impresor4 impresor5 impresor6 impresor7 Importante: Como en nuestro caso nos conectaremos a nuestra maquina por SSH NO deberemos utilizar el comando “useradd” ya que si usamos este comando en la consola no saldrá el prompt y dificultará enormemente nuestra labor. 3. Grupos de trabajo Una vez hemos creado los usuarios (en nuestro caso 7) deberemos añadir todos nuestros usuarios a los grupos de trabajo “dialout” y “tty” para ello usaremos el comando “usermod” de la siguiente manera: 1. 2. 3. 4. 5. 6. 7. 8. usermod -a -G dialout impresor1 usermod -a -G tty impresor1 usermod -a -G dialout impresor2 usermod -a -G tty impresor2 . . . 4. Usuario cámara A continuación, hemos creado un usuario nuevo para controlar todas las webcams: useradd -G video -M -r webcam 5. Clonar repositorio Debemos iniciar sesión con todos los usuarios que hemos creado anteriormente y luego procederemos a clonar todas las instancias de OctoPrint dentro de cada usuario (uno por uno). Ahora procederemos a clonar nuestro repositorio de OctoPrint en cada usuario que hemos creado. En nuestro caso lo hemos clonado desde aquí: https://github.com/foosel/OctoPrint Pero también se puede clonar desde el repositorio oficial de OctoPrint. Además de clonar el repositorio deberemos arrancar el virtualenv y ejecutar el setup de python. Esto lo haremos de la siguiente manera: 1. 2. 3. 4. 5. 6. git clone https://github.com/foosel/OctoPrint cd OctoPrint virtualenv venv ./venv/bin/pip install pip --upgrade ./venv/bin/python setup.py install mkdir ~/.octoprint Para lanzar el servidor de manera manual utilizaremos el siguiente comando: ~/OctoPrint/venv/bin/octoprint serve Tan solo lo haremos para probar ya que más adelante veremos cómo configurar los scripts para que se arranquen de manera automática desde una misma consola. 6. Scripts OctoPrint Octoprint cuenta con unos scripts para lanzar los OctoPrint con un solo comando y nos permite poderlos lanzar todos desde la misma consola. Los scripts de encuentran en los directorios /etc/init.d y etc/default y deberemos cambiarlos para adecuarlos a nuestras necesidades. A continuación, veremos el script asociado al octoprint1, pero en nuestro caso tenemos 7 máquinas así que cambiaremos la variable “INSTANCENUMBER” para configurar los demás scripts. Script /etc/init.d/octoprint1: 1. 2. 3. 4. 5. 6. #!/bin/sh ### BEGIN INIT INFO # Provides: # Required-Start: # Required-Stop: octoprint $local_fs networking 7. # Should-Start: 8. # Should-Stop: 9. # Default-Start: 2 3 4 5 10. # Default-Stop: 0 1 6 11. # Short-Description: OctoPrint daemon 12. # Description: Starts the OctoPrint daemon with the user specified in 13. # /etc/default/octoprint. 14. ### END INIT INFO 15. 16. # Author: Sami Olmari & Gina Häußge 17. INSTANCENUMBER=1 18. 19. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 20. DESC="OctoPrint $INSTANCENUMBER Daemon" 21. NAME="OctoPrint $INSTANCENUMBER" 22. PKGNAME=octoprint$INSTANCENUMBER 23. PIDFILE=/var/run/$PKGNAME.pid 24. SCRIPTNAME=/etc/init.d/$PKGNAME 25. DEFAULTS=/etc/default/$PKGNAME 26. 27. # Read configuration variable file if it is present 28. [ -r $DEFAULTS ] && . $DEFAULTS 29. 30. # Define LSB log_* functions. 31. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. 32. . /lib/lsb/init-functions 33. 34. # Exit if the DAEMON is not set 35. if [ -z "$DAEMON" ] 36. then 37. log_warning_msg "Not starting $PKGNAME, DAEMON not set in /etc/default/$PKGNAME." 38. exit 0 39. fi 40. 41. # Exit if the DAEMON is not installed 42. [ -x "$DAEMON" ] || exit 0 43. 44. # Load the VERBOSE setting and other rcS variables 45. [ -f /etc/default/rcS ] && . /etc/default/rcS 46. 47. if [ -z "$START" -o "$START" != "yes" ] 48. then 49. log_warning_msg "Not starting $PKGNAME, edit /etc/default/$PKGNAME to start it." 50. exit 0 51. fi 52. 53. if [ -z "$OCTOPRINT_USER" ] 54. then 55. log_warning_msg "Not starting $PKGNAME, OCTOPRINT_USER not set in /etc/default/$PKGNAME." 56. exit 0 57. fi 58. 59. COMMAND_ARGS= 60. if [ -n "$BASEDIR" ] 61. then 62. COMMAND_ARGS="--basedir $BASEDIR $COMMAND_ARGS" 63. fi 64. 65. if [ -n "$CONFIGFILE" ] 66. then 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. COMMAND_ARGS="--config $CONFIGFILE $COMMAND_ARGS" fi # # Function to verify if a pid is alive # is_alive() { pid=`cat $1` > /dev/null 2>&1 kill -0 $pid > /dev/null 2>&1 return $? } # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started is_alive $PIDFILE RETVAL="$?" if [ $RETVAL != 0 ]; then start-stop-daemon --start --background --quiet --pidfile $PIDFILE --make-pidfile \ 95. --exec $DAEMON --chuid $OCTOPRINT_USER --user $OCTOPRINT_USER --umask $UMASK --nicelevel=$NICELEVEL \ 96. -- serve $COMMAND_ARGS $DAEMON_ARGS 97. RETVAL="$?" 98. fi 99. } 100. 101. # 102. # Function that stops the daemon/service 103. # 104. do_stop() 105. { 106. # Return 107. # 0 if daemon has been stopped 108. # 1 if daemon was already stopped 109. # 2 if daemon could not be stopped 110. # other if a failure occurred 111. 112. start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 -user $OCTOPRINT_USER --pidfile $PIDFILE 113. RETVAL="$?" 114. [ "$RETVAL" = "2" ] && return 2 115. 116. rm -f $PIDFILE 117. 118. [ "$RETVAL" = "0" ] && return 0 || return 1 119. } 120. 121. case "$1" in 122. start) 123. [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" 124. do_start 125. case "$?" in 126. 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 127. 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $? ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2 exit 3 ;; esac Ahora haremos lo propio para los que se encuentran en la ruta /etc/default/ Script /etc/default/octoprint1: 1. # Configuration for /etc/init.d/octoprint 2. 3. INSTANCENUMBER=1 4. 5. # The init.d script will only run if this variable non-empty. 6. OCTOPRINT_USER=impresor$INSTANCENUMBER 7. 8. # base directory to use 9. BASEDIR=/home/impresor${INSTANCENUMBER}/.octoprint 10. 11. # configuration file to use 12. CONFIGFILE=/home/impresor${INSTANCENUMBER}/.octoprint/config.yaml 13. 14. # On what port to run daemon, default is 5000 15. PORT=500$INSTANCENUMBER 16. 17. # Path to the OctoPrint executable, you need to set this to match your installation! 18. 19. 20. 21. 22. 23. DAEMON=/home/impresor${INSTANCENUMBER}/OctoPrint/venv/bin/octoprint # What arguments to pass to octoprint, usually no need to touch this DAEMON_ARGS="--port=$PORT" # Umask of files octoprint generates, Change this to 000 if running octoprint as its own, separate user 24. UMASK=022 25. 26. # Process priority, 0 here will result in a priority 20 process. 27. # -2 ensures Octoprint has a slight priority over user processes. 28. NICELEVEL=-2 29. 30. # Should we run at startup? 31. START=yes Una vez tenemos tantos scripts como instancias de OctoPrint procederemos a lanzar los scripts de la siguiente manera. En nuestro caso los lanzamos desde el usuario maestro de nuestra maquina (es el único que tiene permisos sudo). 1. 2. 3. 4. 5. 6. sudo sudo sudo sudo sudo sudo /etc/init.d/octoprint1 /etc/init.d/octoprint2 /etc/init.d/octoprint3 /etc/init.d/octoprint4 /etc/init.d/octoprint5 /etc/init.d/octoprint6 start start start start start start 7. Scripts cámaras Una vez tengamos nuestras instancias de OctoPrint funcionando deberemos hacer lo propio con las cámaras para ello deberemos modificar los scripts que se encuentran en /usr/share/scripts y en /etc/init.d/webcam1 Puede que la carpeta “scripts” anteriormente citada no exista por defecto, por lo que la deberemos crear y colocar en ella los scripts correspondientes. Al igual que pasaba con los scripts de los OctoPrint deberemos cambiar la variable “INSTANCENUMBER” por el número de cámara adecuado. En este caso deberemos asegurarlo de cambiar también el “device” y “DispositivoVideo” por el nombre de la cámara que queramos modificar. Por defecto las cámaras operan el puerto 8080, en este script lo hemos modificado para que la primera cámara opere en la 8081, la segunda en el 8082 y así sucesivamente. Script /usr/share/scripts/webcam1: 1. #!/bin/bash 2. 3. ######################################################################## 4. ### DO NOT EDIT THIS FILE TO CHANGE THE CONFIG!!! ### 5. ### ---------------------------------------------------------------- ### 6. ### There is no need to edit this file for changing resolution, ### 7. ### frame rates or any other mjpg-streamer parameters. Please edit ### 8. ### /boot/octopi.txt instead - that's what it's there for! You can ### 9. ### even do this with your Pi powered down by directly accessing the ### 10. ### file when using the SD card as thumb drive in your regular ### 11. ### computer. ### 12. #################################################################### #### 13. 14. MJPGSTREAMER_HOME=/usr/local/lib/mjpg-streamer 15. MJPGSTREAMER_INPUT_USB="input_uvc.so" 16. 17. INSTANCENUMBER=1 18. device="/dev/videoEYE" #/dev/video 19. DispositivoVideo="/dev/videoEYE" 20. camera="auto" 21. # camera_usb_options="-d /dev/video$INSTANCENUMBER -r 640x480 -f 10 -y" 22. camera_usb_options="-d $DispositivoVideo -r 640x480 -f 10 -y" 23. camera_raspi_options="-fps 10" 24. camera_http_webroot="/usr/local/share/mjpg-streamer/www-octopi" 25. camera_http_options="-n -p 808$INSTANCENUMBER" 26. #camera_http_options="-p 808$INSTANCENUMBER" 27. additional_brokenfps_usb_devices=() 28. 29. 30. brokenfps_usb_devices=("046d:082b" "${additional_brokenfps_usb_devices[@]}") 31. 32. # cleans up when the script receives a SIGINT or SIGTERM 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. # make sure that child processed die when we die local pids=$(jobs -pr) [ -n "$pids" ] && kill $pids exit 0 } # says goodbye when the script shuts down function goodbye() { # say goodbye echo "" echo "Goodbye..." echo "" } # runs MJPG Streamer, using the provided input plugin + configuration 50. 51. 52. 53. function runMjpgStreamer { input=$1 pushd $MJPGSTREAMER_HOME > /dev/null 2>&1 echo Running ./mjpg_streamer -o "output_http.so -w /usr/local/share/mjpg-streamer/www-octopi $camera_http_options" -i "$input" 54. LD_LIBRARY_PATH=. mjpg_streamer -o "output_http.so -w /usr/local/share/mjpg-streamer/www-octopi $camera_http_options" -i "$input" & 55. wait 56. popd > /dev/null 2>&1 57. } 58. 59. # starts up the USB webcam 60. function startUsb { 61. options="$camera_usb_options" 62. device="video$INSTANCENUMBER" 63. extracted_device=`echo $options | sed 's@.*-d /dev/\(video[09]+\).*@\1@'` 64. if [ "$extracted_device" != "$options" ] 65. then 66. # the camera options refer to another device, use that for determining product 67. device=$extracted_device 68. fi 69. 70. uevent_file="/sys/class/video4linux/$device/device/uevent" 71. if [ -e $uevent_file ]; then 72. # let's see what kind of webcam we have here, fetch vid and pid... 73. product=`cat $uevent_file | grep PRODUCT | cut -d"=" -f2` 74. vid=`echo $product | cut -d"/" -f1` 75. pid=`echo $product | cut -d"/" -f2` 76. vidpid=`printf "%04x:%04x" "0x$vid" "0x$pid"` 77. 78. # ... then look if it is in our list of known broken-fps-devices and if so remove 79. # the -f parameter from the options (if it's in there, else that's just a no-op) 80. for identifier in ${brokenfps_usb_devices[@]}; 81. do 82. if [ "$vidpid" = "$identifier" ]; then 83. echo 84. echo "Camera model $vidpid is known to not work with -f parameter, stripping it out" 85. echo 86. options=`echo $options | sed -e "s/\(\s\+\|^\)f\s\+[0-9]\+//g"` 87. fi 88. done 89. fi 90. 91. logger -s "Starting USB webcam" 92. runMjpgStreamer "$MJPGSTREAMER_INPUT_USB $options" 93. } 94. 95. # make sure our cleanup function gets called when we receive SIGINT, SIGTERM 96. trap "cleanup" SIGINT SIGTERM 97. # say goodbye when we EXIT 98. trap "goodbye" EXIT 99. 100. # echo configuration 101. echo "Starting up webcamDaemon..." 102. echo "" 103. echo "--- Configuration: ----------------------------" 104. echo "camera: $camera" 105. echo "usb options: $camera_usb_options" 106. echo "raspi options: $camera_raspi_options" 107. echo "http options: -w $camera_http_webroot $camera_http_options" 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. mera" 118. 119. 120. 121. 122. 123. 124. 125. 126. echo "-----------------------------------------------" echo "" # we need this to prevent the later calls to vcgencmd from blocking # I have no idea why, but that's how it is... vcgencmd version > /dev/null 2>&1 # keep mjpg streamer running if some camera is attached while true; do if [ -e "$DispositivoVideo" ] && { [ "$ca= "auto" ] || [ "$camera" = "usb" ] ; }; then startUsb sleep 30 & wait else echo "No camera detected, trying again in two minutes" sleep 120 & wait fi done Haremos los mismo para los scripts que se encuentran en el directorio /etc/init.d/ Script /etc/init.d/webcamd1: 1. #!/bin/sh 2. 3. ### BEGIN INIT INFO 4. # Provides: webcamd1 5. # Required-Start: $local_fs networking 6. # Required-Stop: 7. # Should-Start: 8. # Should-Stop: 9. # Default-Start: 2 3 4 5 10. # Default-Stop: 0 1 6 11. # Short-Description: webcam daemon 12. # Description: Starts the OctoPi webcam daemon with the user specified config in 13. # /etc/default/webcamd. 14. ### END INIT INFO 15. 16. # Author: Gina Haeussge 17. 18. INSTANCENUMBER=1 19. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 20. DESC="Webcam $INSTANCENUMBER Daemon" 21. NAME="webcamd$INSTANCENUMBER" 22. DAEMON=/usr/share/scripts/webcamd$INSTANCENUMBER 23. USER=maestro 24. PIDFILE=/var/run/$NAME$INSTANCENUMBER.pid 25. PKGNAME=webcamd$INSTANCENUMBER 26. SCRIPTNAME=/etc/init.d/$PKGNAME 27. LOG=/var/log/webcamd$INSTANCENUMBER.log 28. 29. # Read configuration variable file if it is present 30. [ -r /etc/default/$PKGNAME ] && . /etc/default/$PKGNAME 31. 32. # Exit if the octoprint is not installed 33. [ -x "$DAEMON" ] || exit 0 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. # Load the VERBOSE setting and other rcS variables [ -f /etc/default/rcS ] && . /etc/default/rcS # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions if [ -z "$ENABLED" -o "$ENABLED" != "1" ] then log_warning_msg "Not starting $PKGNAME, edit /etc/default/$PKGNAME to start it." 45. exit 0 46. fi 47. 48. # 49. # Function to verify if a pid is alive 50. # 51. is_alive() 52. { 53. pid=`cat $1` > /dev/null 2>&1 54. kill -0 $pid > /dev/null 2>&1 55. return $? 56. } 57. 58. # 59. # Function that starts the daemon/service 60. # 61. do_start() 62. { 63. # Return 64. # 0 if daemon has been started 65. # 1 if daemon was already running 66. # 2 if daemon could not be started 67. 68. is_alive $PIDFILE 69. RETVAL="$?" 70. 71. if [ $RETVAL != 0 ]; then 72. start-stop-daemon --start --background --no-close --quiet -pidfile $PIDFILE --make-pidfile \ 73. --startas /bin/bash --chuid $USER --user $USER -- c "exec $DAEMON" >> $LOG 2>&1 74. RETVAL="$?" 75. fi 76. } 77. 78. # 79. # Function that stops the daemon/service 80. # 81. do_stop() 82. { 83. # Return 84. # 0 if daemon has been stopped 85. # 1 if daemon was already stopped 86. # 2 if daemon could not be stopped 87. # other if a failure occurred 88. 89. start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 -user $USER --pidfile $PIDFILE 90. RETVAL="$?" 91. [ "$RETVAL" = "2" ] && return 2 92. 93. rm -f $PIDFILE 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. [ "$RETVAL" = "0" ] && return 0 || return 1 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 exit 3 ;; esac Cuando tenemos todas las cámaras configuradas procederemos a lanzarlas de la siguiente manera (método recomendado): 1. sudo /etc/init.d/webcamd1 start 2. sudo /etc/init.d/webcamd2 start 3. sudo /etc/init.d/webcamd3 start El comando start se puede sustituir por stop o restart dependiendo de nuestra necesidad en cada momento. Si queremos lanzar las cámaras de manera manual (nos ocupara una terminal cada cámara que lancemos, por lo que solo se suele usar con la finalidad de pruebas) deberemos hacerlo con el siguiente método: Para añadir más cámaras deberemos copiar los scripts de las rutas /usr/share/scripts/webcamd1 y /etc/default/webcamd1 y sustituir el “INSTANCENUMBER” que se encuentra dentro de dichos archivos. 8. Monitor OctoPrint Hemos creado un monitor de OctoPrint para poder visualizar el estado de todas las impresoras en una misma página web. A continuación, copiado nuestro monitor de OctoPrint en la ruta /home/maestro/FlaskApp Debemos hacer algunos cambios en nuestro programa para que funcione el script. Deberemos incluir la siguiente línea en la primera línea de monitorOcto.py (incluido en la carpeta FlaskApp): #!/usr/bin/python Ademas, para que no tengamos problemas con las rutas deberemos indicar la ruta completa de los CSV donde se encuentran los datos de las impresoras. Además, deberemos añadir: 1. import sys 2. import os Y añadir las siguientes líneas para solucionar los problemas de ejecutar la aplicación fuera de su ruta predeterminada: 1. pathname = os.path.dirname(sys.argv[0]) 2. os.chdir(os.path.abspath(pathname)) Y a continuación el resto de “imports” que nos faltan, de manera que los “imports” al completo quedarán de la siguiente manera: 1. #!/usr/bin/python 2. 3. import json as simplejson 4. import requests 5. import threading 6. import collections 7. import sys 8. import os 9. import csv 10. 11. pathname = os.path.dirname(sys.argv[0]) 12. os.chdir(os.path.abspath(pathname)) 13. 14. from flask import Flask, render_template, redirect, url_for, request, session, abort 15. from flask import jsonify 16. from flask import request 17. from datetime import datetime,timedelta 18. 19. from sqlalchemy.orm import sessionmaker from tabledef import * IMPORTANTE: Nos debemos asegurar de que el final de línea del archivo esta en formato Linux, ya que si tiene el final de línea de tipo Windows tendremos problemas a la hora de ejecutar los scripts. Para que funcione deberemos modificar el script que se encuentra en la ruta: /etc/init.d/monitorOcto: Hemos modificado el DESC, NAME y PKGNAME. 1. #!/bin/sh 2. 3. ### BEGIN INIT INFO 4. # Provides: octoprint 5. # Required-Start: $local_fs networking 6. # Required-Stop: 7. # Should-Start: 8. # Should-Stop: 9. # Default-Start: 2 3 4 5 10. # Default-Stop: 0 1 6 11. # Short-Description: OctoPrint daemon 12. # Description: Starts the OctoPrint daemon with the user specified in 13. # /etc/default/octoprint. 14. ### END INIT INFO 15. 16. # Author: Sami Olmari & Gina Häußge 17. 18. 19. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 20. DESC="Monitor OctoPrint Daemon" 21. NAME="Monitor OctoPrint" 22. PKGNAME=monitorOcto 23. PIDFILE=/var/run/$PKGNAME.pid 24. SCRIPTNAME=/etc/init.d/$PKGNAME 25. DEFAULTS=/etc/default/$PKGNAME 26. 27. # Read configuration variable file if it is present 28. [ -r $DEFAULTS ] && . $DEFAULTS 29. 30. # Define LSB log_* functions. 31. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. 32. . /lib/lsb/init-functions 33. 34. # Exit if the DAEMON is not set 35. if [ -z "$DAEMON" ] 36. then 37. log_warning_msg "Not starting $PKGNAME, DAEMON not set in /etc/default/$PKGNAME." 38. exit 0 39. fi 40. 41. # Exit if the DAEMON is not installed 42. [ -x "$DAEMON" ] || exit 0 43. 44. # Load the VERBOSE setting and other rcS variables 45. [ -f /etc/default/rcS ] && . /etc/default/rcS 46. 47. if [ -z "$START" -o "$START" != "yes" ] 48. 49. then log_warning_msg "Not starting $PKGNAME, edit /etc/default/$PKGNAME to start it." 50. exit 0 51. fi 52. 53. if [ -z "$OCTOPRINT_USER" ] 54. then 55. log_warning_msg "Not starting $PKGNAME, OCTOPRINT_USER not set in /etc/default/$PKGNAME." 56. exit 0 57. fi 58. 59. COMMAND_ARGS= 60. if [ -n "$BASEDIR" ] 61. then 62. COMMAND_ARGS="--basedir $BASEDIR $COMMAND_ARGS" 63. fi 64. 65. #if [ -n "$CONFIGFILE" ] 66. #then 67. # COMMAND_ARGS="--config $CONFIGFILE $COMMAND_ARGS" 68. #fi 69. 70. # 71. # Function to verify if a pid is alive 72. # 73. is_alive() 74. { 75. pid=`cat $1` > /dev/null 2>&1 76. kill -0 $pid > /dev/null 2>&1 77. return $? 78. } 79. 80. # 81. # Function that starts the daemon/service 82. # 83. do_start() 84. { 85. # Return 86. # 0 if daemon has been started 87. # 1 if daemon was already running 88. # 2 if daemon could not be started 89. 90. is_alive $PIDFILE 91. RETVAL="$?" 92. 93. if [ $RETVAL != 0 ]; then 94. echo "arrancando MonitorOctoprint" 95. start-stop-daemon --start --background --quiet --pidfile $PIDFILE --make-pidfile \ 96. --exec $DAEMON --chuid $OCTOPRINT_USER --user $OCTOPRINT_USER --umask $UMASK --nicelevel=$NICELEVEL #\ 97. #-- serve $COMMAND_ARGS $DAEMON_ARGS 98. RETVAL="$?" 99. fi 100. } 101. 102. # 103. # Function that stops the daemon/service 104. # 105. do_stop() 106. { 107. # Return 108. # 0 if daemon has been stopped 109. # 1 if daemon was already stopped 110. # 2 if daemon could not be stopped 111. # other if a failure occurred 112. 113. start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 -user $OCTOPRINT_USER --pidfile $PIDFILE 114. RETVAL="$?" 115. [ "$RETVAL" = "2" ] && return 2 116. 117. rm -f $PIDFILE 118. 119. [ "$RETVAL" = "0" ] && return 0 || return 1 120. } 121. 122. case "$1" in 123. start) 124. [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" 125. do_start 126. case "$?" in 127. 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 128. 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 129. esac 130. ;; 131. stop) 132. [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" 133. do_stop 134. case "$?" in 135. 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 136. 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 137. esac 138. ;; 139. status) 140. status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $? 141. ;; 142. restart) 143. log_daemon_msg "Restarting $DESC" "$NAME" 144. do_stop 145. case "$?" in 146. 0|1) 147. do_start 148. case "$?" in 149. 0) log_end_msg 0 ;; 150. 1) log_end_msg 1 ;; # Old process is still running 151. *) log_end_msg 1 ;; # Failed to start 152. esac 153. ;; 154. *) 155. # Failed to stop 156. log_end_msg 1 157. ;; 158. esac 159. ;; 160. *) 161. echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2 162. exit 3 163. ;; 164. esac También deberemos hacer algún cambio en el siguiente script. Hemos modificado el “OCTOPRINT_USER”, en “BASEDIR” le hemos indicado la ruta en la que se encuentra nuestra aplicación, el puerto sobre el que queremos que se ejecute (“PORT”) y por último el “DAEMON” con el ejecutable de Python. Script /etc/default/: 1. # Configuration for /etc/init.d/monitorOcto 2. 3. 4. # The init.d script will only run if this variable non-empty. 5. OCTOPRINT_USER=maestro 6. 7. # base directory to use 8. BASEDIR=/home/maestro/FlaskApp 9. 10. # configuration file to use 11. #CONFIGFILE=/home/maestro/FlaskApp/config 12. 13. # On what port to run daemon, default is 5000 14. PORT=8050 15. 16. # Path to the OctoPrint executable, you need to set this to match your installation! 17. DAEMON=/home/maestro/FlaskApp/monitorOcto.py 18. 19. # What arguments to pass to octoprint, usually no need to touch this 20. DAEMON_ARGS="--port=$PORT" 21. 22. # Umask of files octoprint generates, Change this to 000 if running octoprint as its own, separate user 23. UMASK=022 24. 25. # Process priority, 0 here will result in a priority 20 process. 26. # -2 ensures Octoprint has a slight priority over user processes. 27. NICELEVEL=-2 28. 29. # Should we run at startup? 30. START=yes Una vez tengamos todo configurado utilizaremos el siguiente comando para ejecutar nuestro monitorOcto: sudo /etc/init.d/monitorOcto start Para que esto funcione hemos copiado los scripts de la ruta /etc/init.d/ y /etc/default/ y los hemos modificado con los nombre y las rutas de nuestra aplicación monitorOcto. Por defecto el monitor de OctoPrint funcionará en la dirección: 192.168.1.200:8050. Pero si queremos que lo haga en otro puerto habrá que cambiar este parámetro tanto en los scripts anteriormente citados como en el método run() del propio monitorOcto.py 9. Controles OctoPrint Para que funcionen las herramientas de apagar y reiniciar Octoprint desde su propia página hemos creado un grupo llamado impresores al que pertenecen todos los usuarios “impresor”. Para añadir los usuarios se puede hacer modificando el archivo “group” que se encuentra en la ruta sudo nano cd /etc/group. Ademas deberemos darle permisos sudo, ya que los comando de apagar y reiniciar lo necesitan. Para ello modificamos el archivo “sudoers” que se encuentra en la ruta /etc/. De forma que nuestro archivo quedaría de la siguiente manera: sudo groupadd impresores A continuación, mostraremos el archivo sudoers necesario para ejecutar todos los scripts y todas las ordenes desde OctoPrint sin tener ningún tipo de problema: 1. # 2. # This file MUST be edited with the 'visudo' command as root. 3. # 4. # Please consider adding local content in /etc/sudoers.d/ instead of 5. # directly modifying this file. 6. # 7. # See the man page for details on how to write a sudoers file. 8. # 9. Defaults env_reset 10. Defaults mail_badpass 11. Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 12. 13. # Host alias specification 14. 15. # User alias specification 16. 17. # Cmnd alias specification 18. 19. # User privilege specification 20. root ALL=(ALL:ALL) ALL 21. 22. # Allow members of group sudo to execute any command 23. %sudo ALL=(ALL:ALL) ALL 24. %maestro ALL=(ALL)ALL 25. %maestro ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/reboot 26. %impresores ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/reboot 27. %impresores ALL=(ALL) NOPASSWD: /etc/init.d/octoprint? 28. #%impresores ALL=(ALL) NOPASSWD: /etc/init.d/octoprint1 29. #%impresores ALL=(ALL) NOPASSWD: /etc/init.d/octoprint2 30. #%impresores ALL=(ALL) NOPASSWD: /etc/init.d/octoprint3 31. #%impresores ALL=(ALL) NOPASSWD: /etc/init.d/octoprint4 32. # See sudoers(5) for more information on "#include" directives: 33. 34. #includedir /etc/sudoers.d 10. Proxy Nginx Vamos a configurar un proxy llamado nginx para poder acceder con el nombre de la máquina en lugar de una dirección y un puerto. Lo primero que debemos hacer es instalar el proxy con el siguiente comando: sudo apt-get install nginx Una vez instalado procederemos a configurar el proxy. Para ello deberemos editar el archivo que mostrare a continuación: sudo nano /etc/nginx/nginx.config Para configurar cada máquina de OctoPrint deberemos añadir las siguientes líneas dentro del bloque HTML: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. upstream "octoprint_1" { server 127.0.0.1:5001; } upstream "octoprint_2" { server 127.0.0.1:5002; } upstream "webcam1" { server 127.0.0.1:8081; } upstream "webcam2" { server 127.0.0.1:8082; } upstream "monitorOcto" { server 127.0.0.1:8050; } “octoprint_1” es el nombre que le hemos dado y server en la dirección que tiene cada máquina de OctoPrint El resto de los archivos de configuración se encuentran en la ruta “/etc/nginx/sites-avaliable”. Dentro de esta carpeta deberemos editar el archivo “default” siguiendo la siguiente estructura: El “server_name” es el nombre que debemos introducir en el navegador para que nos lleve a los OctoPrints o al monitor que hemos creado. 1. 2. 3. 4. 5. 6. server_name linuxtipia.local www.linuxtipia.local; location / { proxy_pass http://monitorOcto/; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; 7. 8. 9. proxy_set_header Connection "upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. proxy_set_header X-Scheme $scheme; proxy_http_version 1.1; proxy_set_header X-Script-Name /; client_max_body_size 0; } location /3dp1/ { proxy_pass http://octoprint_1/; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 24. 25. 26. 27. 28. 29. 30. proxy_set_header X-Scheme $scheme; proxy_http_version 1.1; proxy_set_header X-Script-Name /3dp1; client_max_body_size 0; } Deberemos cambiar el texto del “location”, el “proxy_pass “y el “proxy_set_header X-Script-Name” para cada instancia de OctoPrint. En nuestro caso 3dp1, 3dp2, 3dp3… Para configurar la página del monitor de Octoprint que hemos añadido el siguiente código en el archivo de configuración anteriormente citado De esta manera cuando pongamos en el navegador “linuxtipia.local” nos cargará por defecto nuestro panel de control con todas las máquinas de OctoPrint. Y si ponemos “linuxtipia.local/3dp1” nos cargará la página de OctoPrint con la impresora 1. En este manual solo hemos visto la configuración para una impresora, esto lo deberemos replicar y modificar los apartados determinados para que funcionen las demás impresoras. Una vez tengamos toda hayamos cambiado toda la información de las impresoras deberemos lanzar el servicio de la siguiente manera: sudo service nginx start Se podrá usar también el comando stop para parar dicho servicio. 11. Scripts al inicio Una vez tenemos todos los scripts en la carpeta /etc/init.d y hemos comprobado que funcionan correctamente individualmente vamos a proceder configurar la máquina para que cuando se inicie arranquen todos las instancias de OctoPrint, las cámaras y nuestro monitor de OctoPrint. Deberemos ejecutar los siguientes comandos con todos los scripts que queremos que se ejecuten al inicio: 1. sudo 2. sudo 3. sudo 4. sudo 5. sudo 6. sudo 7. sudo 8. sudo 9. sudo 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. update-rc.d octoprint1 defaults update-rc.d octoprint1 enable update-rc.d octoprint2 defaults update-rc.d octoprint2 enable update-rc.d octoprint3 defaults update-rc.d octoprint3 enable update-rc.d octoprint4 defaults update-rc.d octoprint4 enable update-rc.d octoprint5 defaults sudo update-rc.d octoprint5 enable sudo update-rc.d octoprint6 defaults sudo update-rc.d octoprint6 enable sudo update-rc.d octoprint7 defaults sudo update-rc.d octoprint7 enable sudo update-rc.d monitorOcto defaults sudo update-rc.d monitorOcto enable sudo update-rc.d webcamd1 defaults sudo update-rc.d webcamd1 enable sudo update-rc.d webcamd2 defaults sudo update-rc.d webcamd2 enable sudo update-rc.d webcamd3 defaults sudo update-rc.d webcamd3 enable En nuestro caso hemos ejecutado las instancias de los siete OctoPrint, el monitor y las tres camaras.
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.7 Linearized : No Page Count : 22 Language : es-ES Tagged PDF : Yes XMP Toolkit : 3.1-701 Producer : Microsoft® Word para Office 365 Title : Manual para varias instancias de OctoPrint Creator : AdministradoFDr Creator Tool : Microsoft® Word para Office 365 Create Date : 2019:03:22 18:24:39+01:00 Modify Date : 2019:03:22 18:24:39+01:00 Document ID : uuid:AA00529F-1E18-4CCB-9D85-8590F7097015 Instance ID : uuid:AA00529F-1E18-4CCB-9D85-8590F7097015 Author : AdministradoFDrEXIF Metadata provided by EXIF.tools