[LINUX] Créer un script Python pour Wake on LAN (Wake on LAN over NAT [5])

introduction

Ceci est une continuation de Dernière fois. C'est ce que je veux faire pour le moment.

network_detail.png

Cette fois, enfin, "Créez un script Python pour Wake on LAN".

Paramètres du PC de bureau

Hypothèse: Ubuntu 18.04. Tout d'abord, configurez-le pour que Wake on LAN puisse être exécuté.

Attribution IP fixe

sudo vi /etc/netplan/~~.yaml

Remplissez ce qui suit,

/etc/netplan/~~.yaml


# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager

  ethernets:
    eno1:
       dhcp4: no
       wakeonlan: true # enable wake on lan
       addresses: [192.168.1.**/24] # assign arbitrary address
       gateway4: 192.168.1.1  # your router(raspi)'s address
       nameservers:
         addresses: [8.8.8.8,8.8.4.4] # google's public dns

Redémarrer.

sudo netplan apply
sudo reboot

Installez ʻethtool` pour vous assurer que le réveil sur le réseau local est activé.

sudo apt-get install -y ethtool

Notez le nom Ethernet. Ensuite, vérifiez si l'adresse IP est fixe.

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1<<<<copy<<<<: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.**/24 brd 192.168.1.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever
    inet6 fe80::2d8:61ff:fe56:242d/64 scope link
       valid_lft forever preferred_lft forever

Assurez-vous que Wake on LAN est activé. C'est OK si c'est Wake-on: g.

$ sudo ethtool eno1
~~
Supports Wake-on: pumbg
Wake-on: g # if it's d, your wake on lan setting may be wrong
~~

Paramètres du BIOS

Omettre. Paramètre WOL (1/3) du PC démarré: Paramètre BIOS / UEFI wo se il vous plaît se référer.

Vérification

Vérifiez ʻip a avec Raspeye et c'est OK si ip est attribué à l'Ethernet connecté au bureau. (Ce doit être ʻUP, LOWER_UP. Merci telcomM # 588883)))

$ ip a
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::83fa:6dee:9799:9a6e/64 scope link 
       valid_lft forever preferred_lft forever

Confirmation (confirmation que wakeonlan peut être installé et démarré)

Installez wake onlan sur Raspai.

sudo apt install wakeonlan
wakeonlan -i 192.168.1.255 -p 7 **:**:**:**:**:**

Si vous pouvez commencer avec ceci, c'est OK.

mod_wsgi Tout d'abord, installez mod_wsgi et diverses choses qui peuvent exécuter des scripts Python avec Apache.

sudo apt install python3-dev python3-pip apache2 libapache2-mod-wsgi-py3
sudo apt-get -y install python3 ipython3 python3-flask curl

Création de scripts Python

Créez un script Python qui fonctionne pour le moment. Cette fois, nous utiliserons Flask.

cd ~
mkdir flask && cd flask
vi app.py

~/flask/app.py


from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'This is vpn server for wake on lan!\n\n'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Pour le moment, vérifiez si mod_wsgi fonctionne.

$ python3 app.py
$ curl http://localhost:5000 #Dans un autre onglet
This is vpn server for wake on lan!

Si vous voyez "Ceci est un serveur VPN pour le réveil sur le réseau local!", C'est OK.

Paramètres Apache et mod_wsgi

Créez un nouveau fichier de paramètres pour flask.

sudo vi /etc/apache2/sites-available/flask.conf

Cette fois, j'essaie de rediriger de GCP vers le port 80, alors entrez comme suit.

/etc/apache2/sites-available/flask.conf


<VirtualHost *:80>
    ServerName kado.example.com
    WSGIDaemonProcess flask user={username} group={username} threads=5
    WSGIScriptAlias / /home/{username}/flask/adapter.wsgi
    <Directory /home/{username}/flask/>
        WSGIProcessGroup flask
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Require all granted
    </Directory>
</VirtualHost>

Activez flask.conf.

sudo a2dissite 000-default.conf
sudo a2ensite flask.conf
sudo service apache2 restart

Créez un fichier adapter.wsgi.

vi ~/flask/adapter.wsgi

~/flask/adapter.wsgi


import sys
if sys.version_info[0]<3:       # require python3
    raise Exception("Python3 required! Current (wrong) version: '%s'" % sys.version_info)
sys.path.insert(0, '/home/kadorpi/flask/')
from app import app as application # <- app means app of app.py

Redémarrez Apache.

sudo service apache2 restart

Vérifiez si cela fonctionne.

$ curl localhost
This is vpn server for wake on lan!

Le script Python s'exécute maintenant sur Apache.

Création de script Wake on LAN pour Line bot

Ce sera un peu plus tard lorsque nous arriverons ici. Envoie une requête HTTP de Line vers GCP et redirige la requête reçue vers le port 80 de Raspai. Ensuite, la requête reçue par Raspeye est traitée par Python.

Tout d'abord, enregistrez un compte dans Line Developer. Ensuite, créez un canal.

1.png 2.png

3.png

Émettez un secret de chaîne et notez-le.

4.png

Émettez un jeton d'accès au canal et notez-le.

5.png

Définissez la réponse automatique, etc. dans les paramètres de réponse, selon le cas.

6.png

Entrez l'URL du Webhook depuis l'API Message. Cette fois, il s'agit de https: // {nom de domaine} / wake-on-lan.

7.png

Ceci termine les paramètres du bot LINE.

Reconfigurer mod_wsgi

Définissez le secret de canal et le jeton d'accès au canal que vous avez noté précédemment comme variables d'environnement.

vi ~/flask/adapter.wsgi

Ajoutez ce qui suit.

~/flask/adapter.wsgi


import os
os.environ['LINE_CHANNEL_SECRET'] = 'fuga'
os.environ['LINE_CHANNEL_ACCESS_TOKEN'] = 'hogehoge'

Script Python

Installez les modules requis.

pip3 install line-bot-sdk flask

Le code python ressemble à ceci:

python


import os, sys
from flask import Flask, request, abort
app = Flask(__name__)

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    TextMessage, TextSendMessage, MessageEvent
)

# get channel_secret and channel_access_token from your environment variable
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
if channel_secret is None:
    print('Specify LINE_CHANNEL_SECRET as environment variable.')
    sys.exit(1)
if channel_access_token is None:
    print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
    sys.exit(1)

line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)

@app.route('/')
def show_web():
    return 'This is vpn server for wake on lan!\n\n'

@app.route('/wake-on-lan', methods=['POST'])
def wake_on_lan():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'ok'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    message = event.message.text

    replies = []
    if re.compile("\s*(check)\s*", re.IGNORECASE).search(message):
        result = confirm()
        replies += [TextSendMessage(result)]

    elif re.compile("\s*(kick)\s*", re.IGNORECASE).search(message):
        if confirm() == 'Awake':
            replies += [TextSendMessage('Already awake')]
        else:
            result = kick()
            replies += [TextSendMessage(result)]

    buttons_template = ButtonsTemplate(
        title='usage', text='Tap below buttons', actions=[
            MessageAction(label=m, text=m) for m in message_list
        ])

    template_message = TemplateSendMessage(alt_text='Usage', template=buttons_template)
    replies += [template_message]

    line_bot_api.reply_message(event.reply_token, replies)


def confirm():
    hostname = "192.168.1.**"
    response = os.system("ping -c 1 " + hostname)
    # and then check the response...
    if response == 0:
        pingstatus = "Awake"
    else:
        pingstatus = "Sleeping"

    return pingstatus

def kick():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s.sendto(b'\xFF' * 6 + b'\x**\x**\x**\x**\x**\x**' * 16, ('192.168.1.255', 7))
    s.close()

    return 'kicked'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Pour donner une petite explication, commencez par charger le secret de canal et le jeton d'accès au canal pour LINE ci-dessous.

# get channel_secret and channel_access_token from your environment variable
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
if channel_secret is None:
    print('Specify LINE_CHANNEL_SECRET as environment variable.')
    sys.exit(1)
if channel_access_token is None:
    print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
    sys.exit(1)

line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)

Ce qui suit a été ajouté pour l'affichage Web.

@app.route('/')
def show_web():
    return 'This is vpn server for wake on lan!\n\n'

Écrivez ici le traitement des requêtes Webhook défini ci-dessus.

@app.route('/wake-on-lan', methods=['POST'])
def wake_on_lan():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'ok'

Et enfin, quand "kick" entre dans le message, envoie MagicPacket, et quand "check" arrive, j'écris le processus pour vérifier s'il peut être démarré par Ping.

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    message = event.message.text

    replies = []
    if re.compile("\s*(check)\s*", re.IGNORECASE).search(message):
        result = confirm()
        replies += [TextSendMessage(result)]

    elif re.compile("\s*(kick)\s*", re.IGNORECASE).search(message):
        if confirm() == 'Awake':
            replies += [TextSendMessage('Already awake')]
        else:
            result = kick()
            replies += [TextSendMessage(result)]

    buttons_template = ButtonsTemplate(
        title='usage', text='Tap below buttons', actions=[
            MessageAction(label=m, text=m) for m in message_list
        ])

    template_message = TemplateSendMessage(alt_text='Usage', template=buttons_template)
    replies += [template_message]

    line_bot_api.reply_message(event.reply_token, replies)


def confirm():
    hostname = "192.168.1.**"
    response = os.system("ping -c 1 " + hostname)
    # and then check the response...
    if response == 0:
        pingstatus = "Awake"
    else:
        pingstatus = "Sleeping"

    return pingstatus

def kick():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s.sendto(b'\xFF' * 6 + b'\x**\x**\x**\x**\x**\x**' * 16, ('192.168.1.255', 7))
    s.close()

    return 'kicked'

Redémarrez Apache.

sudo service apache2 restart

fin

En seconde période, j'étais fatigué et noyé. .. .. De plus, il peut être difficile à comprendre car il est rédigé sous forme de mémorandum. .. .. Je suis content de pouvoir tout écrire pour le moment. Je suis heureux que vous puissiez l'utiliser comme référence.

動画

référence

How To Use Apache HTTP Server As Reverse-Proxy Using mod_proxy Extension

Recommended Posts

Créer un script Python pour Wake on LAN (Wake on LAN over NAT [5])
Obtenir un domaine à l'aide de GCP et MyDNS (Wake on LAN over NAT [1])
Créer un environnement Python sur Mac (2017/4)
Créer un environnement python dans centos
Créer un environnement virtuel pour python sur mac [Très facile]
Concurrence avec VS Code Créez un environnement Python pour les professionnels sous Windows
Transformez Razzpie en routeur (Wake on LAN over NAT [4])
Créez un environnement python sur votre Mac
Créons un environnement virtuel pour Python
Un script python pour Mac qui zippe sans caractères déformés sous Windows
Créer une nouvelle tâche Todoist à partir d'un script Python
[Venv] Créer un environnement virtuel python sur Ubuntu
Un mémorandum pour toucher Python Flask avec Heroku
Créer un environnement d'exécution Python sur IBM i
Créer un module Python
Créer un environnement Python
[Python] 2 Créez une carte risque-rendement pour votre portefeuille d'actifs
Créez un code QR pour l'URL sous Linux
Construire l'extension Python E-Cell 4 sur Windows 7 (64 bits)
Créez un environnement de développement Python 3 (Anaconda) confortable avec Windows
Procédure de création d'un environnement CDK sous Windows (Python)
Créer une couche pour AWS Lambda Python dans Docker
Script Python qui crée un fichier JSON à partir d'un fichier CSV
Créez un environnement shell et python décent sur Windows
Créer un environnement de développement Python avec OS X Lion
Proxy inverse d'Apache sur GCP vers Raspeye Apache local (Wake on LAN over NAT [3])
Script pour créer facilement un environnement de périphérique client pour AWS IoT (version Python v2)
Créer un plugin Wox (Python)
Créer une fonction en Python
Créer un dictionnaire en Python
Créer un environnement de développement Python (pyenv / virtualenv) sur Mac (Homebrew)
[Python, script shell, développement d'équipe] Créez un dépôt Git astucieux
Créer un compte enfant de connect with Stripe en Python
[Python] Créer une liste de dates et d'heures pour une période spécifiée
Configurer Softether Server sur GCP (Se connecter depuis iPhone / Raspeye) (Wake on LAN over NAT (2])
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
Créer un tableau numpy python
Construire l'extension Python E-Cell 4 sur Mac OSX (Yosemite)
Créer une salle de classe sur Jupyterhub
Créer un répertoire avec python
Créez un environnement python sur CentOS 7.7 pour votre serveur domestique
[Python] Créer un écran pour le code d'état HTTP 403/404/500 avec Django
Créer un environnement d'exécution Windows Python avec VScode + Remote WSL
Créez une illusion rayée avec correction gamma pour Python3 et openCV3
Créez un script shell pour exécuter le fichier python plusieurs fois
Créez un sélecteur de couleurs pour la roue chromatique avec Python + Qt (PySide)
Python vba pour créer une chaîne de date pour créer un nom de fichier
Un script python qui supprime les fichiers ._DS_Store et ._ * créés sur Mac
Créer un Ubuntu de démarrage USB avec un environnement Python pour l'analyse des données
Construire un environnement Python sur Mac
Script Python pour le décodage ldapsearch base64
Créer une interface graphique python à l'aide de tkinter
Créer un conteneur DI avec Python
Construire un environnement Python sur Ubuntu
Créez un environnement virtuel avec Python!
Créer un fichier binaire en Python
Un petit script pour l'autodéfense des logiciels malveillants