Ceci est une continuation de Dernière fois. C'est ce que je veux faire pour le moment.
Cette fois, enfin, "Créez un script Python pour Wake on LAN".
Hypothèse: Ubuntu 18.04. Tout d'abord, configurez-le pour que Wake on LAN puisse être exécuté.
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
~~
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é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
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é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.
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.
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.
Émettez un secret de chaîne et notez-le.
Émettez un jeton d'accès au canal et notez-le.
Définissez la réponse automatique, etc. dans les paramètres de réponse, selon le cas.
Entrez l'URL du Webhook depuis l'API Message. Cette fois, il s'agit de
https: // {nom de domaine} / wake-on-lan
.
Ceci termine les paramètres du bot LINE.
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'
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
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.
How To Use Apache HTTP Server As Reverse-Proxy Using mod_proxy Extension
Recommended Posts