Il a été décidé d'équiper un grand nombre de serveurs ultra-petits ** OpenBlocks ** pour les passerelles IoT. Web UI, une application GUI dédiée fournie par Platt Home, est installée dans la famille OpenBlocks IoT. Selon la [FAQ] de Platt Home (https://openblocks.plathome.co.jp/products/obs_iot/bx1/faq3.html), les éléments qui peuvent être définis à partir de l'interface utilisateur Web, tels que les paramètres réseau, peuvent être définis à partir de l'interface utilisateur Web. Il est censé être défini, et il semble qu'il ne devrait pas être défini avec CUI (commande Linux). Si vous incluez le transfert scp et l'exécution du programme d'application, cela prendra 15 minutes par unité. J'ai décidé d'écrire un script de kitting en Python car il est possible de réduire le nombre total d'étapes en créant un programme automatisé dès le début plutôt que de répéter des opérations d'interface graphique gênantes des dizaines de fois. Cela semble bon de dire que le nombre d'étapes est réduit, mais en réalité, je ne voulais vraiment pas faire de travail simple.
Opérations de navigateur automatisées avec Selenium. C'est une application Web simple, vous ne faites donc rien de spécial simplement en effectuant une requête GET, en entrant une zone de texte ou en cliquant sur le bouton Enregistrer.
Python
"""
OpenBlocks IoT BX1 Kitting Script étape1
"""
__author__ = "MindWood"
__version__ = "1.00"
__date__ = "13 Mar 2020"
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import sys
admin_id = 'adminUser'
admin_pw = 'adminPass'
passphrase = 'passPhrase'
id_rsa = 'ssh-rsa XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX== mw'
domain = 'example.com'
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(10)
#Connectez-vous à l'interface Web IoT d'OpenBlocks
driver.get('http://192.168.254.254:880')
#S'il y a d'abord un bouton de consentement, il est considéré comme l'appareil à utiliser pour la première fois
ar = driver.find_elements_by_id('eula_agree')
if len(ar) == 0:
#Écran de connexion
driver.find_element_by_name('name').send_keys(admin_id)
driver.find_element_by_name('password').send_keys(admin_pw)
driver.find_element_by_name('_act').click() #S'identifier
else:
#Paramètres du compte administrateur et écran de consentement
driver.find_element_by_id('eula_agree').click() #je suis d'accord
time.sleep(1)
driver.find_element_by_name('_name').send_keys(admin_id)
driver.find_element_by_name('_password').send_keys(admin_pw)
driver.find_element_by_name('_password_confirm').send_keys(admin_pw)
driver.find_element_by_id('save').click() #enregistrer
time.sleep(1)
#système>>Écran série
driver.get('http://192.168.254.254:880/system/serial.php')
sq = driver.find_element_by_class_name('sq') #Obtenez le numéro de série
serial_num = sq.find_element_by_xpath('pre').text.strip()
print('Numéro de série[' + serial_num + ']')
#un service>>Écran de base
driver.get('http://192.168.254.254:880/apps/m2miot/basic.php')
time.sleep(1)
driver.find_element_by_id('enable_bluetooth').click() #Autorisation Bluetooth
driver.find_element_by_id('save').click() #enregistrer
time.sleep(1)
#un service>>Écran d'état
driver.get('http://192.168.254.254:880/apps/m2miot/status.php')
time.sleep(1)
sq = driver.find_element_by_class_name('sq')
hcconfig = sq.find_element_by_xpath('pre').text
p = hcconfig.find('BD Address: ')
bd_adrs = hcconfig[p+12:p+29].replace(':', '') #Acquisition d'adresse BD
print('Adresse BD[' + bd_adrs + ']')
#système>>Écran de filtre
driver.get('http://192.168.254.254:880/system/ipfilter.php')
time.sleep(1)
this_checkbox = driver.find_element_by_id('filter_hold_true')
if not this_checkbox.is_selected(): this_checkbox.click() #Si non coché, vérifiez
driver.find_element_by_id('mode_ssh_true').click() #SSH activé
driver.find_element_by_id('save').click() #enregistrer
time.sleep(1)
#système>>Écran lié à SSH
driver.get('http://192.168.254.254:880/system/sshd_config.php')
time.sleep(1)
driver.find_element_by_id('deny_passwd_login').click() #Authentification par mot de passe interdite
elm = driver.find_element_by_id('pubkey')
elm.clear()
elm.send_keys(id_rsa)
driver.find_element_by_id('save').click() #enregistrer
time.sleep(1)
#système>>Mon écran de page
driver.get('http://192.168.254.254:880/system/mypage.php')
time.sleep(1)
driver.find_element_by_id('password').send_keys(admin_pw)
driver.find_element_by_id('save').click() #enregistrer
time.sleep(1)
#réseau>>Écran de base
driver.get('http://192.168.254.254:880/network/basic.php')
time.sleep(1)
elm = driver.find_element_by_id('domainname')
elm.clear()
elm.send_keys(domain) #domaine
elm = driver.find_element_by_id('wlan0_ssid')
elm.clear()
ssid = serial_num + '_MindWood'
elm.send_keys(ssid) # SSID
elm = driver.find_element_by_id('wlan0_passphrase')
elm.clear()
elm.send_keys(passphrase) #Mot de passe
driver.find_element_by_id('enable_ppp0').click() #Utiliser PPP
time.sleep(1)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)') #Faites défiler jusqu'à la ligne du bas
time.sleep(1)
#Paramètres SIM SORACOM pour données uniquement
driver.find_element_by_id('ppp0_apn').send_keys('soracom.io') # APN
driver.find_element_by_id('ppp0_user').send_keys('sora') #Nom d'utilisateur
driver.find_element_by_id('ppp0_pass').send_keys('sora') #mot de passe
driver.find_element_by_id('ppp0_autotype_false').click() #Ne vous connectez pas automatiquement
driver.find_element_by_id('ppp0_set_reconnect_false').click() #Ne vous reconnectez pas régulièrement
driver.find_element_by_id('save').click() #enregistrer
time.sleep(1)
#système>>Écran de mot de passe
driver.get('http://192.168.254.254:880/system/passwd.php')
time.sleep(1)
driver.find_element_by_id('password').send_keys(admin_pw)
driver.find_element_by_id('password_confirm').send_keys(admin_pw)
driver.find_element_by_id('save').click() #enregistrer
#entretien>>Écran de redémarrage
driver.get('http://192.168.254.254:880/maintenance/shutdown.php')
time.sleep(1)
sq = driver.find_element_by_class_name('sq')
sq.find_element_by_xpath('//input[@onclick="pre_reboot()"]').click() #Redémarrer
driver.find_element_by_id('reboot_btn').click() #Courir
time.sleep(2)
alert = driver.switch_to.alert
alert.accept() #Répondre OK pour alerter
sys.exit()
À l'aide des packages paramiko et scp, nous avons automatisé le transfert et l'exécution du shell de déploiement d'application. Si vous essayez de le faire manuellement, la configuration de la clé est un problème.
Python
"""
OpenBlocks IoT BX1 Kitting Script stage2
"""
__author__ = "MindWood"
__version__ = "1.00"
__date__ = "13 Mar 2020"
import paramiko
import scp
import time
def exec_cmd(cmd, ssh):
"""Exécuter la commande avec ssh"""
print('# ' + cmd)
stdin, stdout, stderr = ssh.exec_command(cmd)
for out_line in stdout:
print(out_line.strip('\n'))
for err_line in stderr:
print(err_line.strip('\n'))
with paramiko.SSHClient() as ssh:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
pkey = paramiko.RSAKey.from_private_key_file('bx1_rsa.key')
ssh.connect(hostname='192.168.254.254', port=22, username='root', password='adminPass', pkey=pkey)
exec_cmd('rm -f write_firmware.sh; ls -l', ssh)
with scp.SCPClient(ssh.get_transport()) as scp:
scp.put('write_firmware.sh', 'write_firmware.sh')
time.sleep(1)
exec_cmd('chmod 755 write_firmware.sh; ./write_firmware.sh', ssh)
time.sleep(2)
exec_cmd('reboot', ssh)
Si vous trouvez cela utile!
Recommended Posts