Création Paquets IPK - Luci
5. Identification.
Sélectionner "openwrt", taper le mot de passe "openwrt" et cliquer sur "Log In".
6. Mise clavier en Français.
Lorsque la session est ouverte cliquer sur le "bouton démarrer" en bas à gauche, ensuite "System Tools" → "LXTerminal" pour ouvrir le terminal.
6.1. Une nouvelle fenêtre s'ouvre:
setxkbmap fr
7. Création d'un paquet luci en ipk (création d'un dossier avec fichier Makefile, dossier "root" et "luasrc").
Cliquer sur le "dossier" en bas à gauche, à côté du bouton démarrer.
Aller dans le dossier:
/home/openwrt/code/barrier_breaker/feeds/luci/applications
Créer un dossier ("Create New..." → "Folder"), exemple: "luci-modbus".
Créer 2 dossiers "luasrc" et "root" dans la dossier précédemment créé ("Create New..." → "Folder")
Créer un fichier dans le dossier "luci-modbus" ("Create New..." → "Empty File"), appeler le - "Makefile".
Lien fichier exemple: luci-modbus.zip
Code à mettre dans "Makefile".
PO = modbus include ../../build/config.mk include ../../build/module.mk
8. Modifier le fichier "Makefile".
Modifier le nom PO. (exemple: modbus ou webapi).
PO = modbus
9. Ajouter dossiers et fichiers dans le dossier "luasrc".
- Ajouter un dossier "controller".
- Ajouter dans le dossier "controller" un fichier .lua (exemple: modbus.lua).
exemple:
Remplacer "modbus" par le nom du fichier.lua, respecter les majuscules.
module ("luci.controller.modbus", package.seeall) function index() if not nixio.fs.access("/etc/config/modbus") then return end local page page = entry({"admin", "services", "modbus"}, cbi("modbus"), _("Modbus"), 0) page.dependent = true end
- Ajouter un dossier "model".
- Ajouter dans le dossier "model", un dossier "cbi".
- Ajouter dans le dossier "cbi" un fichier .lua (exemple: modbus.lua).
--[[ m = Map("helloworld", translate("Helloworld")) s = m:section(TypedSection, "helloworld", translate("Parametrages Modbus")) s.anonymous = true name = s:option(Value, "nom", "Nom", "Entree votre nom") greeting = s:option(ListValue, "greeting", "Greeting") greeting:value("hi", "Hello") greeting:value("bye", "Goodbye") return m ]]-- local pythonfile = "/usr/lib/Script_python/Modbus.py", m, s f = SimpleForm("modbus", translate("Parametrages Modbus")) m = Map("luci", translate(""), translate("Cliquer sur Run pour lire les valeurs modbus")) s = m:section(TypedSection, "command", "") s.template = "commands" t = f:field(TextValue, "lines") t.rows = 28 function t.cfgvalue() return nixio.fs.readfile(pythonfile) or "" end function t.write(self, section, data) return nixio.fs.writefile(pythonfile, data:gsub("\r\n", "\n")) end function f.handle(self, state, data) return true end return f, m
s = m:section(TypedSection, "helloworld", translate("Parametrages Modbus")) local pythonfile = "/usr/lib/Script_python/Modbus.py", m, s f = SimpleForm("modbus", translate("Parametrages Modbus")) translate("Cliquer sur Run pour lire les valeurs modbus"))
10. Ajouter dossiers et fichiers dans le dossier "root".
Dans le dossier "root", on peut ajouter des dossiers et fichiers, qui seront installés en lieu et place dans le routeur.
- Ajouter un dossier "etc".
- Ajouter dans le dossier "etc", un dossier "config".
- Ajouter dans le dossier "config" un fichier "modbus" (nom à remplacer, sans extension)
exemple:
config modbus
- Il est possible d'ajouter un fichier "luci" dans le dossier "config", pour ajouter des informations dans les commandes personnalisées de la page web.
config core 'main' option lang 'auto' option mediaurlbase '/luci-static/openwrt.org' option resourcebase '/luci-static/resources' config extern 'flash_keep' option uci '/etc/config/' option dropbear '/etc/dropbear/' option openvpn '/etc/openvpn/' option passwd '/etc/passwd' option opkg '/etc/opkg.conf' option firewall '/etc/firewall.user' option uploads '/lib/uci/upload/' config internal 'languages' config internal 'sauth' option sessionpath '/tmp/luci-sessions' option sessiontime '3600' config internal 'ccache' option enable '1' config internal 'themes' option Bootstrap '/luci-static/bootstrap' config command option name 'Valeurs Modbus' option command './modbus.sh'
Dans le dossier "etc", on peut aussi ajouter un dossier "crontabs" pour des taches planifiées.
- Ajouter dans le dossier "crontabs" un fichier "root" (sans extension)
00 23 * * * /usr/sbin/d2sphere/d2sphere_client.sh & */5 * * * * /usr/bin/python /usr/lib/Script_python/Modbus.py
- Ajouter un dossier "usr" dans le dossier "root".
- Ajouter dans le dossier "usr", un dossier "lib".
- Ajouter dans le dossier "lib", un dossier "lua".
- Ajouter dans le dossier "lua", un dossier "luci".
- Ajouter dans le dossier "luci", un dossier "view".
- Ajouter dans le dossier "view", un fichier "commands.htm" mettre le code ci-dessous dans le fichier.
<%# LuCI - Lua Configuration Interface Copyright 2012 Jo-Philipp Wich <jow@openwrt.org> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 -%> <% css = [[ .commandbox { height: 12em; width: 30%; float: left; height: 12em; margin: 5px; position: relative; } .commandbox h3 { font-size: 1.5em !important; line-height: 2em !important; margin: 0 !important; } .commandbox input[type="text"] { width: 50% !important; } .commandbox div { position: absolute; left: 0; bottom: 1.5em; } ]] -%> <%+header%> <script type="text/javascript" src="<%=resource%>/cbi.js"></script> <script type="text/javascript">//<![CDATA[ var stxhr = new XHR(); function command_run(id) { var args; var field = document.getElementById(id); if (field) args = encodeURIComponent(field.value); var legend = document.getElementById('command-rc-legend'); var output = document.getElementById('command-rc-output'); if (legend && output) { output.innerHTML = '<img src="/<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' + '<%:Waiting for command to complete...%>' ; legend.parentNode.style.display = 'block'; legend.style.display = 'inline'; stxhr.get('<%=luci.dispatcher.build_url("admin", "system", "commands", "run")%>/' + id + (args ? '/' + args : ''), null, function(x, st) { if (st) { if (st.binary) st.stdout = '[<%:Binary data not displayed, download instead.%>]'; legend.style.display = 'none'; output.innerHTML = String.format( '<pre><strong># %h\n</strong>%h<span style="color:red">%h</span></pre>' + '<div class="alert-message warning">%s (<%:Code:%> %d)</div>', st.command, st.stdout, st.stderr, (st.exitcode == 0) ? '<%:Command successful%>' : '<%:Command failed%>', st.exitcode); } else { legend.style.display = 'none'; output.innerHTML = '<span class="error"><%:Failed to execute command!%></span>'; } location.hash = '#output'; } ); } } function command_download(id) { var args; var field = document.getElementById(id); if (field) args = encodeURIComponent(field.value); location.href = '<%=luci.dispatcher.build_url("admin", "system", "commands", "download")%>/' + id + (args ? '/' + args : ''); } function command_link(id) { var legend = document.getElementById('command-rc-legend'); var output = document.getElementById('command-rc-output'); var args; var field = document.getElementById(id); if (field) args = encodeURIComponent(field.value); if (legend && output) { var link = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '') + location.pathname.split(';')[0] + 'command/' + id + (args ? '/' + args : ''); legend.style.display = 'none'; output.parentNode.style.display = 'block'; output.innerHTML = String.format( '<div class="alert-message"><%:Access command with%> <a href="/%s">%s</a></div>', link, link ); location.hash = '#output'; } } //]]></script> <% local uci = require "luci.model.uci".cursor() local commands = { } uci:foreach("luci", "command", function(s) commands[#commands+1] = s end) %> <form method="get" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>"> <div class="cbi-map"> <h2><a id="content" name="content"><%:Commandes Personnalisees%></a></h2> <fieldset class="cbi-section"> <% local _, command; for _, command in ipairs(commands) do %> <div class="commandbox"> <h3><%=pcdata(command.name)%></h3> <p><%:Command:%> <code><%=pcdata(command.command)%></code></p> <% if command.param == "1" then %> <p><%:Arguments:%> <input type="text" id="<%=command['.name']%>" /></p> <% end %> <div> <input type="button" value="<%:Run%>" class="cbi-button cbi-button-apply" onclick="command_run('<%=command['.name']%>')" /> <input type="button" value="<%:Download%>" class="cbi-button cbi-button-download" onclick="command_download('<%=command['.name']%>')" /> <% if command.public == "1" then %> <input type="button" value="<%:Link%>" class="cbi-button cbi-button-link" onclick="command_link('<%=command['.name']%>')" /> <% end %> </div> </div> <% end %> <br style="clear:both" /><br /> <a name="output"></a> </fieldset> </div> <fieldset class="cbi-section" style="display:none"> <legend id="command-rc-legend"><%:Collecting data...%></legend> <span id="command-rc-output"></span> </fieldset> </form> <%+footer%>
- Il est possible d'ajouter dans le dossier "lib", un dossier avec les script python, dossier "Script_Python" et dans ce dossier un fichier "Modbus.py".
#!/usr/bin/env python import time import serial import minimalmodbus import requests import sqlite3 import csv from requests.auth import HTTPBasicAuth ####################################################### #Valeur a modifie MODBUS Compteurs ####################################################### Recepteur_ENLESS = 1 registre_Tp1 = 1008 registre_Tp2 = 1019 registre_Tp3 = 1030 registre_Tcontact = 1045 instrument = minimalmodbus.Instrument('/dev/ttyS1', Recepteur_ENLESS, mode='rtu') instrument.serial.baudrate = 9600 instrument.serial.bytesize = 8 instrument.serial.parity = serial.PARITY_NONE instrument.serial.stopbits = 1 instrument.serial.timeout = 2 # seconds ####################################################### #Base de donnees transmetteur1 ####################################################### conn = sqlite3.connect('/www/mabase.db') cursor = conn.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS tptransmetteur1( date DATE, temperature DECIMAL(4,2) ) """) conn.commit() recup_date_heure = time.strftime("%d/%m/%Y %H:%M") temp1 = instrument.read_register(registre_Tp1, 1, 3) temp2 = instrument.read_register(registre_Tp2, 1, 3) temp3 = instrument.read_register(registre_Tp3, 1, 3) print "******Transmetteur de temperature 1 - 12117072*******" print(recup_date_heure, temp1) print "******Transmetteur de temperature 2 - 12115376*******" print(recup_date_heure, temp2) print "******Transmetteur de temperature 3 - 12022135*******" print(recup_date_heure, temp3) cursor.execute("""INSERT INTO tptransmetteur1(date, temperature) VALUES(?, ?)""" , (recup_date_heure, temp1)) conn.commit() # Pour afficher les donnees d un tableau au format tableau print "******Donnees du tableau des temperatures*******" print "******Transmetteur de temperature 1 - 12117072*******" cur = conn.cursor() cur.execute('''SELECT * FROM tptransmetteur1''') rows = cur.fetchall() for row in rows: print(row) ####################################################### #Base de donnees transmetteur2 ####################################################### conn1 = sqlite3.connect('/www/mabase1.db') cursor1 = conn1.cursor() cursor1.execute(""" CREATE TABLE IF NOT EXISTS tptransmetteur2( date DATE, temperature DECIMAL(4,2) ) """) conn1.commit() recup_date_heure = time.strftime("%d/%m/%Y %H:%M") cursor1.execute("""INSERT INTO tptransmetteur2(date, temperature) VALUES(?, ?)""" , (recup_date_heure, temp2)) conn1.commit() # Pour afficher les donnees d un tableau au format tableau print "******Transmetteur de temperature 2 - 12115376*******" cur1 = conn1.cursor() cur1.execute('''SELECT * FROM tptransmetteur2''') rows1 = cur1.fetchall() for row1 in rows1: print(row1) ####################################################### #Base de donnees transmetteur3 ####################################################### conn2 = sqlite3.connect('/www/mabase2.db') cursor2 = conn2.cursor() cursor2.execute(""" CREATE TABLE IF NOT EXISTS tptransmetteur3( date DATE, temperature DECIMAL(4,2) ) """) conn2.commit() recup_date_heure = time.strftime("%d/%m/%Y %H:%M") cursor2.execute("""INSERT INTO tptransmetteur3(date, temperature) VALUES(?, ?)""" , (recup_date_heure, temp3)) conn2.commit() # Pour afficher les donnees d un tableau au format tableau print "******Transmetteur de temperature 3 - 12022135*******" cur2 = conn2.cursor() cur2.execute('''SELECT * FROM tptransmetteur3''') rows2 = cur2.fetchall() for row2 in rows2: print(row2) ####################################################### # Export donnees dans un fichier CSV ####################################################### print "Exportation de donnees vers CSV............" cursor = conn.cursor() cursor.execute("select * from tptransmetteur1") with open("/www/modem1_tp1_data.csv", "w") as csv_file: csv_writer = csv.writer(csv_file, delimiter=";") # csv_writer.writerows([i[0] for i in cursor.description]) csv_writer.writerows(cursor) cursor1 = conn1.cursor() cursor1.execute("select * from tptransmetteur2") with open("/www/modem1_tp2_data.csv", "w") as csv_file: csv_writer1 = csv.writer(csv_file, delimiter=";") # csv_writer1.writerows([i[0] for i in cursor1.description]) csv_writer1.writerows(cursor1) cursor2 = conn2.cursor() cursor2.execute("select * from tptransmetteur3") with open("/www/modem1_tp3_data.csv", "w") as csv_file: csv_writer2 = csv.writer(csv_file, delimiter=";") # csv_writer2.writerows([i[0] for i in cursor2.description]) csv_writer2.writerows(cursor2) print "Les donnees ont ete exportees avec succes" # Fermeture connexion databases cursor.close() conn.close() cursor1.close() conn1.close() cursor2.close() conn2.close() ####################################################### #Lecture valeur MODBUS ####################################################### recup_date_heure = time.strftime("%d/%m/%Y %H:%M") tempalar3 = round(instrument.read_register(registre_Tp3, 1, 3)) tempalarme = 25 #try pour creation fichier historique1 si non existant try: f = open("historique1", 'r') #recuperation tp3_alar_envoi = eval(f.readline().rstrip('\r\n')) f.close() print "******Transmetteur temperature - 12022135*******" print(recup_date_heure, tempalar3) print tp3_alar_envoi ####################################################### #Verification si alarme temperature ####################################################### if tempalar3 < tempalarme and tp3_alar_envoi == 0: print ("alarme temperature") data = "{'id': '@S.FR.AHU.Alarme_Temperature_Primaire', 'level': '9', 'val': " + str(tempalar3) + " , 'who': 'null'}" payload = eval(data) r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload) tp3_alar_envoi = 1 print r.url f = open("historique1", 'w') #sauvegarde f.write(repr(tp3_alar_envoi)+'\r\n') f.close() elif tempalar3 > tempalarme and tp3_alar_envoi == 1: data = "{'id': '@S.FR.AHU.Alarme_Temperature_Primaire', 'level': '9', 'val': " + str(tempalar3) + " , 'who': 'null'}" payload = eval(data) r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload) print("pas d'alarme de temperature") tp3_alar_envoi = 0 print tp3_alar_envoi print r.url f = open("historique1", 'w') #sauvegarde f.write(repr(tp3_alar_envoi)+'\r\n') f.close() else: print("pas d'alarme de temperature") print tp3_alar_envoi f = open("historique1", 'w') #sauvegarde f.write(repr(tp3_alar_envoi)+'\r\n') f.close() except IOError: f = open("historique1", 'w') f.write(repr(0)+'\r\n') f.close() f = open("historique1", 'r') #recuperation tp3_alar_envoi = eval(f.readline().rstrip('\r\n')) f.close() print "******Transmetteur contact - 11511213*******" print(recup_date_heure, tempalar3) print tp3_alar_envoi ####################################################### #Verification si alarme temperature ####################################################### if tempalar3 < tempalarme and tp3_alar_envoi == 0: print ("alarme temperature") data = "{'id': '@S.FR.AHU.Alarme_Temperature_Primaire', 'level': '9', 'val': " + str(tempalar3) + " , 'who': 'null'}" payload = eval(data) r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload) tp3_alar_envoi = 1 print r.url f = open("historique1", 'w') #sauvegarde f.write(repr(tp3_alar_envoi)+'\r\n') f.close() elif tempalar3 > tempalarme and tp3_alar_envoi == 1: data = "{'id': '@S.FR.AHU.Alarme_Temperature_Primaire', 'level': '9', 'val': " + str(tempalar3) + " , 'who': 'null'}" payload = eval(data) r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload) print("pas d'alarme de temperature") tp3_alar_envoi = 0 print tp3_alar_envoi print r.url f = open("historique1", 'w') #sauvegarde f.write(repr(tp3_alar_envoi)+'\r\n') f.close() else: print("pas d'alarmes de temperature") print tp3_alar_envoi f = open("historique1", 'w') #sauvegarde f.write(repr(tp3_alar_envoi)+'\r\n') f.close() tcontact = instrument.read_register(registre_Tcontact, 0, 3) #try pour creation fichier historique si non existant try: f = open("historique", 'r') #recuperation tcontact_stored = eval(f.readline().rstrip('\r\n')) f.close() print "******Transmetteur contact - 11511213*******" print(recup_date_heure, tcontact) print tcontact_stored ####################################################### #Verification si alarme ####################################################### if (tcontact == 306 or tcontact == 291 or tcontact == 290) and tcontact != tcontact_stored: print ("alarmes") data = "{'id': '@S.FR.AHU.ValeursContactsAlarmes', 'level': '9', 'val': " + str(tcontact) + " , 'who': 'null'}" payload = eval(data) r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload) print r.url f = open("historique", 'w') #sauvegarde f.write(repr(tcontact)+'\r\n') f.close() elif tcontact != tcontact_stored: data = "{'id': '@S.FR.AHU.ValeursContactsAlarmes', 'level': '9', 'val': " + str(tcontact) + " , 'who': 'null'}" payload = eval(data) r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload) print("pas d'alarmes ou de nouvelle alarmes") print tcontact_stored print r.url f = open("historique", 'w') #sauvegarde f.write(repr(tcontact)+'\r\n') f.close() else: print("pas d'alarmes ou de nouvelle alarmes") print tcontact_stored f = open("historique", 'w') #sauvegarde f.write(repr(tcontact)+'\r\n') f.close() except IOError: f = open("historique", 'w') f.write(repr(307)+'\r\n') f.close() f = open("historique", 'r') #recuperation tcontact_stored = eval(f.readline().rstrip('\r\n')) f.close() print "******Transmetteur contact - 11511213*******" print(recup_date_heure, tcontact) print tcontact_stored ####################################################### #Verification si alarme ####################################################### if (tcontact == 306 or tcontact == 291 or tcontact == 290) and tcontact != tcontact_stored: print ("alarmes") data = "{'id': '@S.FR.AHU.ValeursContactsAlarmes', 'level': '9', 'val': " + str(tcontact) + " , 'who': 'null'}" payload = eval(data) r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload) print r.url f = open("historique", 'w') #sauvegarde f.write(repr(tcontact)+'\r\n') f.close() elif tcontact != tcontact_stored: data = "{'id': '@S.FR.AHU.ValeursContactsAlarmes', 'level': '9', 'val': " + str(tcontact) + " , 'who': 'null'}" payload = eval(data) r = requests.get('http://192.168.10.2/haystack/pointWrite', auth=HTTPBasicAuth('RESTapi', 'Dumortier02'), params=payload) print("pas d'alarmes ou de nouvelle alarmes") print tcontact_stored print r.url f = open("historique", 'w') #sauvegarde f.write(repr(tcontact)+'\r\n') f.close() else: print("pas d'alarmes ou de nouvelle alarmes") print tcontact_stored f = open("historique", 'w') #sauvegarde f.write(repr(tcontact)+'\r\n') f.close()
Si besoin ajouter dans le dossier "root", un dossier "www", dans ce dossier ajouter le fichier souhaité (exemple: modbus.sh)
exemple de code du fichier "modbus.sh":
/usr/bin/python /usr/lib/Script_python/Modbus.py
11. Ajouter des dossiers et des fichiers pour la compilation.
Aller dans le dossier:
/home/openwrt/code/barrier_breaker/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/luci-addons/applications
copier et coller le dossier créer précédemment dans "applications" , exemple: "luci-modbus".
Dans le dossier exemple "luci-modbus" créer un dossier supplémentaire "dist", dans ce dossier copier, coller les dossiers, de "root", dans l'exemple "etc", "usr", "www".
- Dans le dossier:
/home/openwrt/code/barrier_breaker/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/luci-addons/applications/luci-modbus/dist/usr/lib/lua/luci
- Copier, coller les dossiers, du dossier "luasrc" créer précédemment en "8.", dans l'exemple "controller" et "model".
- Ajouter aussi un dossier "i18n".
12. Ajouter un lien dans le menu.
Aller dans le fichier:
/home/openwrt/code/barrier_breaker/feeds/luci/contrib/package/luci-addons/Makefile
Rechercher:
### Applications ###
Ajouter une ligne, (exemple dessous), avec les informations du paquet "luci" à installer.
$(eval $(call application,upnp,Universal Plug & Play configuration module,miniupnpd)) $(eval $(call application,ntpc,NTP time synchronisation configuration module,ntpclient)) $(eval $(call application,ddns,Dynamic DNS configuration module,ddns-scripts)) $(eval $(call application,samba,Network Shares - Samba SMB/CIFS module,samba36-server)) $(eval $(call application,mmc-over-gpio,MMC-over-GPIO configuration module,kmod-mmc-over-gpio)) $(eval $(call application,p910nd,p910nd - Printer server module,p910nd)) $(eval $(call application,ushare,uShare - UPnP A/V & DLNA Media Server,ushare)) $(eval $(call application,hd-idle,Hard Disk Idle Spin-Down module,hd-idle)) $(eval $(call application,tinyproxy,Tinyproxy - HTTP(S)-Proxy configuration,tinyproxy)) $(eval $(call application,polipo,LuCI Support for the Polipo Proxy,polipo)) $(eval $(call application,openvpn,LuCI Support for OpenVPN,openvpn @BROKEN)) $(eval $(call application,p2pblock,LuCI Support for the Freifunk P2P-Block addon,luci-app-firewall freifunk-p2pblock)) $(eval $(call application,multiwan,LuCI Support for the OpenWrt MultiWAN agent,luci-app-firewall multiwan)) $(eval $(call application,wol,LuCI Support for Wake-on-LAN,etherwake)) $(eval $(call application,vnstat,LuCI Support for VnStat,vnstat vnstati)) $(eval $(call application,radvd,LuCI Support for Radvd,radvd)) $(eval $(call application,ahcp,LuCI Support for AHCPd,ahcpd)) $(eval $(call application,wshaper,LuCI Support for wshaper,wshaper)) $(eval $(call application,modbus,LuCI modbus application)) $(eval $(call application,webapi,LuCI webapi))
Le paquet est prêt à être compilé.
Se mettre dans le dossier:
cd ~/code/barrier_breaker
Mise à jour des paquets:
./scripts/feeds/ update -a ./scripts/feeds/ update -i
Installer les paquets:
./scripts/feeds/ install -a
ouvrir le menu pour générer la compilation.
make menuconfig
13.3. Sélectionner avec les flèches "Luci" puis "Entrée".
13.4. Sélectionner avec les flèches "Applications" puis "Entrée".
13.6. Avec les flèches sélectionner "<Save>".
Valider "<Exit>", plusieurs fois pour sortir et revenir au terminal.
Dans le terminal taper la commande: (Compilation de tout openwrt).
make world
Les fichiers IPK créés sont dans le dossier:
/home/openwrt/code/barrier_breaker/bin/ramips/packages/luci