[PYTHON] J'ai écrit un script de kit automatique pour OpenBlocks IoT

Il a été décidé d'équiper un grand nombre de serveurs ultra-petits ** OpenBlocks ** pour les passerelles IoT. bx1.jpg Web UI, une application GUI dédiée fournie par Platt Home, est installée dans la famille OpenBlocks IoT. image.png 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.

Automatisez les opérations de l'interface utilisateur Web

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()

Automatisez le transfert de fichiers et l'exécution de la commande ssh

À 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

J'ai écrit un script de kit automatique pour OpenBlocks IoT
J'ai écrit un script d'installation automatique pour Arch Linux
J'ai écrit un script de création automatique de répertoire vide en Python
Écrivain AtCoder J'ai écrit un script qui regroupe les concours pour chaque écrivain
J'ai créé un module alternatif pour les japandas.
J'ai écrit un test unitaire pour différentes langues
J'ai écrit le code pour l'échantillonnage Gibbs
J'ai écrit un wrapper Tkinter semblable à un notebook IPython [Python]
Obstacle (noir) J'ai fait une chenille d'évitement automatique.
J'ai écrit un wrapper Gtk semblable à un notebook IPython [Python]
J'ai écrit un script pour télécharger un plug-in WordPress
J'ai essayé de faire un BOT de détection de lèvre d'air et de réponse automatique pour le travail à distance