RESTCONF - alapok

Eszköz konfigurálása

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.

Kiinduló program a teszteléshez

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.