NETCONF¶
netconfd¶
netconfd je "databázový server", s nímž komunikuje klient yangcli skrze ssh subsystém netconfd-ssh. Netconfd spustíme následujícími způsoby
- /usr/sbin/netconfd
nebo pod určitým uživatelem, který pak bude užit při autentizaci
- /usr/sbin/netconfd --superuser=<username>
nebo skrze init skript, který je již dostupný v OpenWrt balíčku
- /etc/init.d/netconfd start
Typy databáze¶
- <running/>*
Running databáze reprezentuje aktivní konfiguraci zařízení. Jestliže server disponuje schopností <:candidate capability>, pak musí umožňovat přímou editaci této databáze. V ostatních případech server není povinnen podporovat přímou změnu databáze. Pokud ji ale přesto podporuje, pak by měl propagovat schopnost <:writable-running capability>.
<running> databáze reflektuje aktuální stav informací dostupných na zařízení. Operace jako <get> pracují nad touto databází.
- <candidate/>*
<candidate> databáze je dostupná v případě, že je deklarována schopnost <:candidate capability> serverem. Tato databáze je užita pro případy, kdy se sbírají úpravy databáze (edit) nebo více těchto operací (edit-config). Klient může takhle kumulovat změny, které nemusí být validovány serverem do doby, než jsou commitnuty do <running> konfigurace, a to všechny najednou skrze operaci <commit>.
Narozdíl od <running> databáze jakékoliv změny provedené v této databázi <candidate> nemají okamžitý vliv na zařízení.
Při použití operace <commit> se přenesou změny z candidate databáze do running konfigurace. Po úspěšné operaci commit je obsah <candidate> a <running> databáze shodný.
This special condition is important because a <lock> operation on the <candidate/> database cannot be granted otherwise. It does not matter which session makes any changes to the <candidate/> database. If it is different than the <running/> database, then it cannot be locked.
Před commitem může klient provést operaci <discard-changes> pro odstranění nechtěných změn. Tato operace vyčistí <candidate> databázi, je však ale nutné dávat pozor na správné užití zámků, a to v případě, když je připojeno více klientů, kteří editují databázi současně.
- <startup/>*
Tato databáze je dostupná tehdy, když je schopnost <:startup capability> podporována serverem. Reprezentuje konfiguraci, která se použije při dalším restartu zařízení.
Jestliže je dostupná schopnost <:startup capability>, pak NETCONF server neuloží automaticky změny z <running> databáze do pevného uložiště (non-volatile). Pro uložení konfigurace je zapotřebí volat operaci <copy-config> pro přepiš obsahu <startup> databáze ze stávající konfigurace.
Jestliže tato schopnost není k dispozici, pak bude server automaticky ukládat <running> konfiguraci do pevného uložiště v době, kdy bude modifikována.
V obou případech je server povinnen ukládat stav <running> konfigurace pro její možné obnovení po restartu zařízení.
yangcli¶
Yangcli je CLI klient určený pro komunikaci s libovolným NETCONF serverem. Yangcli umožňuje spouštět příkazy skrze dávkový soubor či interaktivní režim následujícím způsobem:
- pouhým spuštěním yangcli se dostaneme do interaktivního režimu
- předáním souboru obsahujícím jednotlivé příkazy skrze parametr příkazové řádky:
yangcli --batch-mode --run-script=@davkovy.soubor
Interaktivní režim Yangcli¶
Příkazy pro YangCLI se skládají z lokálních příkazů a vzdálených příkazů (obecně NETCONF příkazů).
Lokální příkazy nám umožňují se připojit na NETCONF server (connect), umožňuje vyhodnocovat XPath výrazy (eval), zaznamenávat informace do souboru (log-*), procházet historii příkazů (history) či třeba jednoduše programovat pomocí podmínek a cyklů (if, while, ..).
Vzdálené příkazy jsou vesměs standardizované zprávy (pro nás příkazy), které zde existují v několika variantách. Pro příklad - xget a xget-config umožňují aplikovat XPath výraz, díky čemuž se nám liší způsob práce se zprávou get - umožňuje nám jednodušší zpracovávání dat. Příkazy jsou následující:
close-session, commit, copy-config, create-subscription, delete-config, discard-changes, edit-config, get, get-config, get-schema, kill-session, lock, unlock, validate, create, delete, get-locks, insert, merge, release-locks, replace, save, sget, sget-config, xget, xget-config.
Stěžejními příkazy jsou příkazy, které nám umožňují registraci k notifikacím, ukládání, získávání dat či změny stavu databáze.
Kromě těchto příkazů Yangcli interpretuje i příkazy pouze pro netconfd server od netconfcentral.org - pro restart, vypnutí a nastavení verbozity serveru.
Příklad komunikace s netconf serverem skrze yangcli¶
Spustíme na serveru netconfd server pomocí:
/usr/sbin/netconfd --superuser=<username>
načteme v yangcli na serveru žádaný modul
load <moduleName>
načteme modul do yangcli, aby yangcli znalo strukturu modulu
mgrload <moduleName>
po načtení modulu můžeme načíst data do databáze pomocí
edit-config target=candidate default-operation=replace test-option=test-then-set error-option=stop-on-error config=@<datafile>
(je možné nahrát automaticky modul i s daty, jen nevím, kde to zatím hledat)
Pro notifikace, které chceme získávat z NETCONFu, se musíme zaregistrovat
create-subscription
po vytvoření subscription nám budou přicházet veškeré notifikace bez ohledu na modul, v němž změny probíhají.
Změnu dat v databázi děláme pomocí:
replace /besip/interfaces/interface[ifname='eth0']/gateway --value=1.1.1.5
přičemž předtím, než začneme měnit data v databázi, musíme databázi zamknout pomocí (uzamkne všechny databáze, pokud je nedokáže zamknout, uvolní všechny dosud vytvořené zámky)
get-locks
a pak následně po operaci replace odemknout
release-locks
(globální lock na netconf databázi je lock, pro odemknutí unlock)
Příkaz pro uložení z běžícího configu do uložiště slouží příkaz save, který se obvykle mapuje také na commit.
save
Pro převedení <candidate> databáze do <running> databáze:
commit
Po ukončení práce s netconfem se z yangcli odpojujeme ukončením sezení a pak ukočením yangcli, a to pomocí:
close-session quit
YANG moduly, validace, převod¶
Validaci modulů provádíme skrze webovou aplikaci:
[[http://www.netconfcentral.org/run_yangdump]]
nebo pomocí CLI aplikace yangdump, kde foo je název souboru modulu
yangdump foo
nebo můžeme zvalidovat foo modul z YUMA_MODPATH
yangdump --module=foo
můžeme také zvalidovat podstromy jednotlivých modulů
yangdump --subtree=test1 --subtree=test2 --logfile=mylogfile
Převod yang modulu do xml můžeme realizovat pomocí parametru
--format=yin
který je doplňkem YANGu. Další možnosti jsou html, xsd, sql a sqldb.
YANG¶
Basic statements¶
- Header statements
yang-version, namespace, prefix
- Linkage statements
import, include
- Meta information
organization, contact
- Revision history
revision
module acme-module { namespace "http://acme.example.com/module"; prefix acme; import "yang-types" { prefix yang; } include "acme-system"; organization "ACME Inc."; contact joe@acme.example.com; description "The module for entities implementing the ACME products"; revision 2007-06-09 { description "Initial revision."; } … }
How to create Yang module - Semantic Differentiators¶
- unique
Ensure unique values within list siblings
- keyref
Ensure referential integrity
- config
Indicate if a node is config data or not
- default
Supply default value for leafs
- mandatory
Node must exist in valid config datastore
- error-app-tag
Define the tag used when constraint fails
- error-message
Define the message used
How to create Yang module - Types¶
- Integral
int{8,16,32,64}
- String
string, enumeration, boolean
- String
string, enumeration, boolean
- Binary Data
binary
- Bit fields
bits
- References
instance-identifier, keyref
- typedef
type created by user
typedef percent { type uint16 { range "0 .. 100"; } description "Percentage"; } leaf completed { type percent; }
- Union
allows a leaf to contain a superset of types
leaf limit { description "Number to allow"; type union { type uint16 { range "0 .. 100"; } type enumeration { enum none { description "No limit"; } } } }
How to create Yang module - Statements¶
leaf¶
- one value
- no children
- one instance
leaf host-name { type string; mandatory true; config true; description "Hostname for this system"; }
leaf-list¶
- one value
- no children
- multiple instances
leaf-list domain-search { type string; ordered-by user; description "List of domain names to search"; }
container¶
- no value
- holds related children
- one instance
container system { container services { container ssh { presence "Enables SSH"; description "SSH service specific configuration"; // more leafs, containers and stuff here... } } }
list¶
- uniquely identified by key(s)
- holds related children
- no value
- multiple instances
list user { key name; leaf name { type string; } leaf uid { type uint32; } leaf full-name { type string; } leaf class { type string; default viewer; } }
must¶
- Constrains nodes by XPath expression
container timeout { leaf access-timeout { description "Maximum time without server response"; units seconds; mandatory true; type uint32; } leaf retry-timer { description "Period to retry operation"; units seconds; type uint32; must "$this < ../access-timeout" { error-app-tag retry-timer-invalid; error-message "The retry timer must be " + "less than the access timeout"; } } }
when¶
- Nodes are only added when condition is true
- "when" is XPath expression
augment system/login/user { when "class = wheel"; leaf shell { type string; } }
augment¶
- Extends data model - current or imported modules
- Inserts nodes into an existing hierarchy, nodes appear in current module's namespace, original (augmented) module is unchanged
augment system/login/user { leaf expire { type yang:date-and-time; } }
Manuals¶
under Yuma -> V2 HTML Manuals
http://www.netconfcentral.org/yuma
Files¶