Project

General

Profile

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