A RESTCONF HTTPS-t használ, így az ehhez szükséges beállításokat el kell végezni az eszközön.
A HTTPS-hez szükséges egy RSA tanúsítvány, amihez be kell állítani egy hosztnevet és egy domain nevet.
Router> enable
Router# configure terminal
Router(config)# hostname R1
R1(config)# ip domain name local
R1(config)# crypto key generate rsa general-keys modulus 4096
A RESTCONF-hoz szükség lesz egy felhasználóra 15-ös privilege szinttel.
R1(config)# username test privilege 15 secret test
Kapcsoljuk be a HTTPS szolgáltatást, ha nincsen. Ezt követően már csak a RESTCONF-ot kell engedélyezni.
R1(config)# ip http secure-server
R1(config)# restconf
Természetesen az eszköz eléréséhez egy IP címre is szükség lesz, ennek beállítását az olvasóra bízom.
import requests
import json
requests.packages.urllib3.disable_warnings()
ip = "192.168.86.130"
url = f"https://{ip}:443/restconf/data/Cisco-IOS-XE-native:native/hostname"
headers = {
"Accept": "application/yang-data+json",
"Content-Type": "application/yang-data+json"
}
response = requests.get(
url=url,
headers=headers,
auth=("test","test"), # test:test -> BASE64
verify=False
)
print(json.dumps(response.json(), indent=2))
Ez a program lekérdezi az eszköz hosztnevét, de nézzük is meg, hogy mi történik pontosan:
Ez a parancs kikapcsolja a HTTPS szerver tanúsítványának ellenőrzését.
requests.packages.urllib3.disable_warnings()
Ezt követően össze kell raknunk a lekérdezés URL-jét. Az IP címet követő részből a /restconf/data
rész gyakorlatilag a RESTCONF szerver gyökér útja. Utána következik annak a tulajdonságnak az útvonala, amire a lekérdezés vonatkozik.
Az ilyen URL-ek kikeresésére egy jó online dokumentáció a Yang Catalog, de még ennél is pontosabb információt nyújt a Cisco Yang Suite, viszont az utóbbit le kell töltenünk és magunknak kell futtatni.
A HTTP kérésnek fejléceket is kell adni. A példákban minden esetben az előbb is bemutatott fejlécet használjuk, bár fontos megjegyezni, hogy a gyakorlatban ezekre nem mindig van szükség. Az Accept
fejléc például csak szükséges, ha a válaszban konfigurációs adatokat várunk vissza - vagyis legtöbbször a GET
kérések esetén. A Content-Type
fejléc pedig csak akkor szükséges, ha adatot módosítunk, vagyis a kérés törzsében konfigurációs adatokat helyezünk el.
Ezt követően már csak el kell küldeni a kérést. Az auth
paraméternek megadva a felhasználónév jelszó kombinációt, az automatikusan beíródik a Authorization
fejlécbe. (Basic típus)
A válaszban megérkezik az eszköz hosztnevét tartalmazó JSON objektum, a következő formában:
{
"Cisco-IOS-XE-native:hostname": "R1"
}
Még egy példát nézünk meg, ami frissíti az eszköz hosztnevét. Nem sok dolog módosul, gyakorlatilag csak a HTTP metódus, illetve már egy törzset is küldünk a kéréssel. A requests
könyvtár a kérés data
mezejébe csak szöveges adatot fogad el, így a body
objektumot először át kell alakítani.
import requests
import json
requests.packages.urllib3.disable_warnings()
ip = "192.168.86.131"
url = f"https://{ip}:443/restconf/data/Cisco-IOS-XE-native:native/hostname"
headers = {
"Accept": "application/yang-data+json",
"Content-Type": "application/yang-data+json"
}
body = {
"hostname": "R2"
}
response = requests.put(
url=url,
headers=headers,
data=json.dumps(body),
auth=("test","test"),
verify=False
)
print(response)
Ebben az esetben a válaszban nem kapunk törzset, amit a státuszkód (204 - No Content) is jelez.