[PYTHON] Ich habe ein automatisches Kitskript für OpenBlocks IoT geschrieben

Wir haben uns entschlossen, eine große Anzahl ultrakleiner Server ** OpenBlocks ** für IoT-Gateways einzurichten. bx1.jpg Web UI, eine dedizierte GUI-Anwendung von Platt Home, ist in der OpenBlocks IoT-Familie installiert. image.png Gemäß den [FAQ] von Platt Home (https://openblocks.plathome.co.jp/products/obs_iot/bx1/faq3.html) können Elemente, die über die Web-Benutzeroberfläche festgelegt werden können, z. B. Netzwerkeinstellungen, über die Web-Benutzeroberfläche festgelegt werden. Es soll gesetzt werden, und es scheint, dass es nicht mit CUI (Linux-Befehl) gesetzt werden sollte. Wenn Sie die scp-Übertragung und Ausführung des Anwendungsprogramms einbeziehen, dauert es 15 Minuten pro Einheit. Ich habe beschlossen, ein Kitting-Skript in Python zu schreiben, da es möglich ist, die Gesamtzahl der Schritte zu reduzieren, indem von Anfang an ein automatisiertes Programm erstellt wird, anstatt lästige GUI-Vorgänge Dutzende Male zu wiederholen. Es hört sich gut an zu sagen, dass die Anzahl der Schritte reduziert ist, aber in Wirklichkeit wollte ich wirklich keine einfache Arbeit machen.

Automatisieren Sie Web-UI-Vorgänge

Automatisierte Browseroperationen mit Selenium. Es ist eine einfache Webanwendung, sodass Sie nichts Besonderes tun, indem Sie eine GET-Anfrage stellen, ein Textfeld eingeben oder auf die Schaltfläche Speichern klicken.

Python


"""
OpenBlocks IoT BX1 Kitting Script stage1
"""
__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)

#Stellen Sie eine Verbindung zur OpenBlocks IoT Web-Benutzeroberfläche her
driver.get('http://192.168.254.254:880')

#Wenn zuerst eine Zustimmungsschaltfläche vorhanden ist, wird diese als das erste zu verwendende Gerät beurteilt
ar = driver.find_elements_by_id('eula_agree')
if len(ar) == 0:
    #Anmeldebildschirm
    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()  #Einloggen
else:
    #Administratorkontoeinstellungen und Zustimmungsbildschirm
    driver.find_element_by_id('eula_agree').click()  #Genau
    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()  #sparen
time.sleep(1)

#System>>Serienbildschirm
driver.get('http://192.168.254.254:880/system/serial.php')
sq = driver.find_element_by_class_name('sq')  #Seriennummer abrufen
serial_num = sq.find_element_by_xpath('pre').text.strip()
print('Ordnungsnummer[' + serial_num + ']')

#Bedienung>>Grundbildschirm
driver.get('http://192.168.254.254:880/apps/m2miot/basic.php')
time.sleep(1)
driver.find_element_by_id('enable_bluetooth').click()  #Bluetooth-Berechtigung
driver.find_element_by_id('save').click()  #sparen
time.sleep(1)

#Bedienung>>Statusbildschirm
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(':', '')  #BD-Adresserfassung
print('BD-Adresse[' + bd_adrs + ']')

#System>>Bildschirm filtern
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()  #Wenn nicht aktiviert, überprüfen Sie
driver.find_element_by_id('mode_ssh_true').click()  #SSH aktiviert
driver.find_element_by_id('save').click()  #sparen
time.sleep(1)

#System>>SSH-bezogener Bildschirm
driver.get('http://192.168.254.254:880/system/sshd_config.php')
time.sleep(1)
driver.find_element_by_id('deny_passwd_login').click()  #Passwortauthentifizierung verboten

elm = driver.find_element_by_id('pubkey')
elm.clear()
elm.send_keys(id_rsa)

driver.find_element_by_id('save').click()  #sparen
time.sleep(1)

#System>>Mein Seitenbildschirm
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()  #sparen
time.sleep(1)

#Netzwerk>>Grundbildschirm
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)  #Domain

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)  #Passphrase

driver.find_element_by_id('enable_ppp0').click()  #Verwenden Sie PPP
time.sleep(1)

driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')  #Scrollen Sie zur untersten Zeile
time.sleep(1)

#Nur-Daten-SIM-Einstellungen für SORACOM
driver.find_element_by_id('ppp0_apn').send_keys('soracom.io')  # APN
driver.find_element_by_id('ppp0_user').send_keys('sora')  #Nutzername
driver.find_element_by_id('ppp0_pass').send_keys('sora')  #Passwort
driver.find_element_by_id('ppp0_autotype_false').click()  #Stellen Sie keine automatische Verbindung her
driver.find_element_by_id('ppp0_set_reconnect_false').click()  #Schließen Sie die Verbindung nicht regelmäßig an
driver.find_element_by_id('save').click()  #sparen
time.sleep(1)

#System>>Passwortbildschirm
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()  #sparen

#Instandhaltung>>Bildschirm neu starten
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()  #Starten Sie neu
driver.find_element_by_id('reboot_btn').click()  #Lauf
time.sleep(2)

alert = driver.switch_to.alert
alert.accept()  #Antworten Sie mit OK, um eine Warnung zu erhalten
sys.exit()

Automatisieren Sie die Dateiübertragung und die Ausführung von SSH-Befehlen

Mit den Paketen paramiko und scp haben wir die Übertragung und Ausführung der Application Deployment Shell automatisiert. Wenn Sie versuchen, dies manuell zu tun, ist das Einstellen des Schlüssels mühsam.

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):
    """Befehl mit ssh ausführen"""
    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)

Wenn Sie dies hilfreich finden!

Recommended Posts

Ich habe ein automatisches Kitskript für OpenBlocks IoT geschrieben
Ich habe ein automatisches Installationsskript für Arch Linux geschrieben
Ich habe ein Skript zur automatischen Erstellung eines leeren Verzeichnisses in Python geschrieben
AtCoder-Autor Ich habe ein Skript geschrieben, das Wettbewerbe für jeden Autor zusammenfasst
Ich habe ein alternatives Modul für japandas.DataReader erstellt
Ich habe einen Unit-Test für verschiedene Sprachen geschrieben
Ich habe den Code für Gibbs Sampling geschrieben
Ich habe einen IPython Notebook-ähnlichen Tkinter-Wrapper geschrieben [Python]
Hindernis (schwarz) Ich habe eine Raupe mit automatischer Vermeidung hergestellt.
Ich habe einen IPython Notebook-ähnlichen Gtk-Wrapper geschrieben [Python]
Ich habe ein Skript geschrieben, um ein WordPress-Plug-In hochzuladen
Ich habe versucht, eine Luftlippenerkennung und eine automatische Reaktion BOT für Fernarbeit zu machen