urllib.error.URLError: - PullRequest
       4

urllib.error.URLError:

0 голосов
/ 06 ноября 2019

Я пытаюсь создать мастер, агент сценарий, где мастер получает информацию от агента. Информация, такая как:

  • Использование имени хоста
  • Использование процессора
  • Использование диска
  • Использование памяти

У меня естьпоместите это в функцию, которая возвращает данные. Когда данные собираются отправить, я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "./agent.py", line 42, in <module>
    send_data(out_data)
  File "./agent.py", line 36, in send_data
    with urllib.request.urlopen(req) as response :
  File "/usr/lib64/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib64/python3.6/urllib/request.py", line 526, in open
    response = self._open(req, data)
  File "/usr/lib64/python3.6/urllib/request.py", line 544, in _open
    '_open', req)
  File "/usr/lib64/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/usr/lib64/python3.6/urllib/request.py", line 1346, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "/usr/lib64/python3.6/urllib/request.py", line 1320, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 113] No route to host>

Я проверил, есть ли связь между двумя виртуальными машинами. Один IP-адрес = 192.168.234.2 (мастер), остальные 192.168.234.10 (агент). Таблица маршрутизации от агента показывает агент таблицы маршрутизации , а вот пинг между двумя пингом

Agent.py

#!/bin/python3
##importeer onderstaande modules om deze te gebruiken##
import psutil
import socket
import time
import urllib.parse
import urllib.request

url = 'http://192.168.234.2/cgi-bin/master.py'
##de output van bovenstaande prints word geplaats in deze variabel om deze in onderstaande variabelen door te sturen##


#De dictionairys worden klaar gezet om gebruikt te worden
def save_data():
    return {
        'machine'   : socket.gethostname(),
        'memory'    : psutil.virtual_memory()[2],
        'disk'      : psutil.disk_usage('/').percent,
        'cpu'       : psutil.cpu_percent()
    }

#De data wordt in de dictionairys gezet
def print_info(out_data):
    print ("Het script heeft gedraaid op: ",time.strftime('%m/%d/%Y %H:%M:%S'))
    print ('De naam van deze host machine is:', out_data['machine'])
    print ('Het geheugen is ', out_data['memory'],'% in gebruik')
    print ('De schijf is ', out_data['disk'],'% vol')
    print ('Het CPU percentage dat in gebruik is: ', out_data['cpu'])

#de data wordt naar de master verzonden
def send_data(out_data):
    data = urllib.parse.urlencode(out_data)
    data = data.encode('ascii')
    req = urllib.request.Request(url, data)
    with urllib.request.urlopen(req) as response :
        the_page = response.read()


out_data = save_data()        
print_info(out_data)
send_data(out_data)

Master.py

#!/usr/bin/python3
###importeren van modules om deze vervolgens te kunnen gebruiken in het script###
import cgi, cgitb
import matplotlib.pyplot as plt
import io
import sqlite3

#maak een instance van een field storage
cgitb.enable()
form = cgi.FieldStorage()

#het verkrijgen van data van de velden die vanuit de agent worden opgestuurd.
def get_data():
    system_data = {
    "machine" : form.getvalue('machine'),
    "cpu": form.getvalue('cpu'),
    "mem": form.getvalue('mem'),
    "disk": form.getvalue('disk')}
    return system_data

#print ("Content-type:text/html\n\n")

current_data = get_data()

con = sqlite3.connect('toets_school.db')
cursor = con.cursor()
cursor.execute("CREATE TABLE if NOT EXISTS gegevens ('machine',VARCHAR, 'cpu' float, 'mem' float, 'disk' float)")
cursor.execute("INSERT INTO gegevens (machine, cpu, mem, disk) VALUES ('"+str(current_data["machine"])+"','"+str(current_data["cpu"])+"', '"+str(current_data["mem"])+"', '"+str(current_data["disk"])+"')")
cursor.execute("SELECT cpu, mem, disk FROM gegevens WHERE machine = '"+str(current_data["machine"]+"'")
data = cursor.fetchall()

cpulijst = []
memlijst = []
disklijst = []

for info in data:
    cpulijst.append(info[0])
    memlijst.append(info[1])
    disklijst.append(info[2])

#print(data)
con.commit()
get_data()

print (cpulijst)
def chart_cpu():
    plt.plot(cpulijst)
    plt.title("CPU gebruik")
    plt.xlabel('minuten')
    plt.ylabel('percentage(%)')
    plt.grid(True)
    plt.savefig("cpu.png")
    plt.show()

def chart_memory():
    plt.plot(memlijst)
    plt.title("Geheugen")
    plt.xlabel('minuten')
    plt.ylabel('percentage (%)')
    plt.grid(True)
    plt.savefig("memory.png")
    plt.show()

def chart_disk_usage():
    plt.plot(disklijst)
    plt.title("Schuifruimte")
    plt.xlabel('minuten')
    plt.ylabel('(%)in gebruik')
    plt.grid(True)
    plt.savefig("disk_usage.png")
    plt.show()

chart_cpu()
chart_disk_usage()
chart_memory()

print ("Content-type:text/html\n\n")
print ("<center>")
print ('De naam van deze machine is :', machine)
print ("<br>")
print ("<html><head><title>Website HAF sportschool</title></head><body>")
print("<img src='data:image/png;base64,"+str(base64.b64encode(buf.getvalue()).decode('ascii'))+"' />")
print("<img src='data:image/png;base64,"+str(base64.b64encode(buf2.getvalue()).decode('ascii'))+"' />")
print ("</body></html>")


conn.close()

Я ожидаю, что агент, отправляющий информацию, сохраняется в функции save_data и передается в out_data. И что данные передаются в функцию def send_data ведущему.

Редактировать: После благодарности от Билла Ханеке, большое спасибо за это. Первая проблема решена. С помощью команд Linux:

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

я смог скрутить master.py. Теперь моя проблема в том, что база данных на мастере заполняется только «Нет».

Кто-нибудь, кто знает, как это исправить?

1 Ответ

0 голосов
/ 06 ноября 2019

Возможно, вы захотите устранить неполадку, попытавшись сначала получить этот URL за пределами вашего Python.

Итак, запустите 'curl http://192.168.234.2/cgi-bin/master.py' и посмотрите, что вы получите. Возможно, вы неправильно настроили веб-сервер на .2 или у вас есть правило брандмауэра или какое-то другое, которое не позволяет общаться с веб-сервером.

Редактировать: уточнение - ошибка «нет маршрута к хосту» не обязательноуказание на то, что маршрутизация является проблемой. Вводит в заблуждение, я знаю. Это также может указывать на то, что конкретный порт (в данном случае http, 80) недоступен / не отвечает. Ping - хороший шаг, но он не полностью диагностирует это.

Обновление (после изменения вопроса):

Я рад слышать, что вы устранили ошибку «Нет маршрута к хосту», которую выпервоначально спрашивали о.

Я понимаю, что вы теперь находите больше проблем. Читая остальную часть вашего сценария, я бы сказал, что у вас есть много необычных элементов, которые не выглядят для меня так, как будто они будут работать. Я рекомендую вам строить свою систему постепенно. Возьмите все из ваших сценариев и просто вставьте одну вещь и сделайте так, чтобы она работала идеально. Итерируйте с этого момента: поместите свою работу в систему контроля версий (например, Git), чтобы вы могли вернуться к ней по мере продвижения. Продолжайте добавлять функции, добавляйте больше полей в базу данных и т. Д. Делайте это медленно, постройте постепенно. Задавайте индивидуальные вопросы по ходу дела.

Начните с работы над очень простой вставкой базы данных, содержащей только одно значение и одно поле. Если что-то не работает, используйте другие инструменты (как вы сделали с curl), чтобы убедиться, что взаимодействующие компоненты действительно говорят то, что, по вашему мнению, они говорят. Например, вы должны посмотреть на то, что отправляется на ваш сервер, чтобы убедиться, что отправляемые данные формы действительно правильно сформированы и это именно то, что пытается проанализировать ваш мастер.

Кроме того, система, которую вы пытаетесьдля сборки хорошо подходит для таких фреймворков, как Django или Flask. Помещение вашего проекта в один из них обеспечит направляющие, которые приведут (в конечном итоге) к успеху.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...