{"id":223,"date":"2025-12-30T20:23:51","date_gmt":"2025-12-30T19:23:51","guid":{"rendered":"https:\/\/we-bulle.fr\/?page_id=223"},"modified":"2025-12-30T20:23:51","modified_gmt":"2025-12-30T19:23:51","slug":"install-sh","status":"publish","type":"page","link":"https:\/\/we-bulle.fr\/?page_id=223","title":{"rendered":"Install.sh"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>\nset -e\n\necho \"========================================\"\necho \"\ud83d\ude80 INSTALLATION AVOGREEN ZEBRA CONNECTOR\"\necho \"========================================\"\n\n# V\u00e9rifier root\nif &#91;&#91; $EUID -ne 0 ]]; then\n    echo \"\u274c Ex\u00e9cutez avec : sudo bash install.sh\"\n    exit 1\nfi\n\n# Demander configuration\necho \"\"\necho \"Configuration de l'imprimante :\"\necho \"--------------------------------\"\n\nread -p \"IP de l'imprimante Zebra &#91;192.168.1.22]: \" ZEBRA_IP\nZEBRA_IP=${ZEBRA_IP:-192.168.1.22}\n\nread -p \"Port de l'imprimante &#91;9100]: \" ZEBRA_PORT\nZEBRA_PORT=${ZEBRA_PORT:-9100}\n\nread -p \"Port du proxy &#91;9090]: \" PROXY_PORT\nPROXY_PORT=${PROXY_PORT:-9090}\n\n# Cr\u00e9er r\u00e9pertoire\nmkdir -p \/opt\/avogreen-printer\ncd \/opt\/avogreen-printer\n\n# Cr\u00e9er le fichier Python AVEC les bonnes variables\ncat > printer_connector.py &lt;&lt; EOF\n#!\/usr\/bin\/env python3\n\"\"\"\nAvogreen Printer Connector\n\"\"\"\nimport socket\nimport json\nimport logging\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\n\n# Configuration - LES VARIABLES SONT ICI\nZEBRA_IP = \"$ZEBRA_IP\"\nZEBRA_PORT = $ZEBRA_PORT\nPROXY_PORT = $PROXY_PORT\n\n# Logging\nlogging.basicConfig(\n    level=logging.INFO,\n    format='%(asctime)s - %(levelname)s - %(message)s',\n    handlers=&#91;\n        logging.FileHandler('\/var\/log\/avogreen-printer.log'),\n        logging.StreamHandler()\n    ]\n)\nlogger = logging.getLogger(__name__)\n\nclass PrinterHandler(BaseHTTPRequestHandler):\n    def do_POST(self):\n        \"\"\"Re\u00e7oit les commandes ZPL depuis Avogreen\"\"\"\n        try:\n            content_length = int(self.headers&#91;'Content-Length'])\n            zpl_data = self.rfile.read(content_length)\n            logger.info(f\"Re\u00e7u {len(zpl_data)} octets\")\n            \n            # Envoyer \u00e0 l'imprimante\n            with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:\n                sock.settimeout(10)\n                sock.connect((ZEBRA_IP, ZEBRA_PORT))\n                sock.sendall(zpl_data)\n            \n            logger.info(f\"Envoy\u00e9 \u00e0 {ZEBRA_IP}:{ZEBRA_PORT}\")\n            self.send_response(200)\n            response = {\"status\": \"success\"}\n            \n        except Exception as e:\n            logger.error(f\"Erreur: {e}\")\n            self.send_response(500)\n            response = {\"status\": \"error\", \"reason\": str(e)}\n        \n        self.send_header('Content-Type', 'application\/json')\n        self.end_headers()\n        self.wfile.write(json.dumps(response).encode())\n    \n    def do_GET(self):\n        \"\"\"Health check\"\"\"\n        self.send_response(200)\n        self.send_header('Content-Type', 'application\/json')\n        self.end_headers()\n        \n        # Tester la connexion\n        try:\n            with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n                s.settimeout(3)\n                s.connect((ZEBRA_IP, ZEBRA_PORT))\n                connected = True\n        except:\n            connected = False\n        \n        status = {\n            \"service\": \"avogreen-printer\",\n            \"status\": \"running\",\n            \"printer_connected\": connected,\n            \"printer_ip\": ZEBRA_IP,\n            \"printer_port\": ZEBRA_PORT,\n            \"proxy_port\": PROXY_PORT\n        }\n        self.wfile.write(json.dumps(status, indent=2).encode())\n    \n    def log_message(self, format, *args):\n        logger.info(format % args)\n\nprint(f\"Connecteur d\u00e9marr\u00e9 sur le port {PROXY_PORT}\")\nHTTPServer(('0.0.0.0', PROXY_PORT), PrinterHandler).serve_forever()\nEOF\n\n# Rendre ex\u00e9cutable\nchmod +x printer_connector.py\n\n# Cr\u00e9er service systemd\ncat > \/etc\/systemd\/system\/avogreen-printer.service &lt;&lt; EOF\n&#91;Unit]\nDescription=Avogreen Zebra Printer Connector\nAfter=network.target\n\n&#91;Service]\nType=simple\nExecStart=\/usr\/bin\/python3 \/opt\/avogreen-printer\/printer_connector.py\nRestart=always\nRestartSec=10\n\n&#91;Install]\nWantedBy=multi-user.target\nEOF\n\n# D\u00e9marrer\nsystemctl daemon-reload\nsystemctl enable avogreen-printer\nsystemctl start avogreen-printer\n\n# Attendre\nsleep 2\n\n# Obtenir IP publique\nPUBLIC_IP=$(curl -s icanhazip.com || echo \"VOTRE-IP\")\n\n# Afficher r\u00e9sultats\necho \"\"\necho \"\u2705 INSTALLATION R\u00c9USSIE\"\necho \"========================\"\necho \"\ud83d\udce1 URL \u00c0 FOURNIR :\"\necho \"   http:\/\/${PUBLIC_IP}:${PROXY_PORT}\"\necho \"\"\necho \"\ud83d\udd0d TEST :\"\necho \"   curl http:\/\/localhost:${PROXY_PORT}\"\necho \"\"\necho \"\u2699\ufe0f  CONFIGURATION :\"\necho \"   Imprimante: ${ZEBRA_IP}:${ZEBRA_PORT}\"\necho \"========================\"\n\n# V\u00e9rifier\nif systemctl is-active --quiet avogreen-printer; then\n    echo \"\ud83c\udf89 Service actif !\"\n    echo \"Test API :\"\n    curl -s http:\/\/localhost:${PROXY_PORT} | head -c 100\n    echo \"\"\nelse\n    echo \"\u274c Service inactif\"\nfi<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-223","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/we-bulle.fr\/index.php?rest_route=\/wp\/v2\/pages\/223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/we-bulle.fr\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/we-bulle.fr\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/we-bulle.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/we-bulle.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=223"}],"version-history":[{"count":1,"href":"https:\/\/we-bulle.fr\/index.php?rest_route=\/wp\/v2\/pages\/223\/revisions"}],"predecessor-version":[{"id":225,"href":"https:\/\/we-bulle.fr\/index.php?rest_route=\/wp\/v2\/pages\/223\/revisions\/225"}],"wp:attachment":[{"href":"https:\/\/we-bulle.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}