Frequently Asked Questions - Clixon =================================== Q: What is the best way of understanding Clixon? A: Run the ietf yang routing example. Q: How do you build and install Clixon (and the example)? A: Clixon: ./configure; make; sudo make install; sudo make install-include Example: cd example; make; sudo make install Q: Is there any reference documentation? A: Clixon uses Doxygen for reference documentation. Build using 'make doc' and aim your browser at doc/html/index.html Q: How do you run the example? A: Start a backend server: 'clicon_backend -Ff /usr/local/etc/routing.conf' Start a cli session: clicon_cli -f /usr/local/etc/routing.conf Start a netconf session: clicon_netconf -f /usr/local/etc/routing.conf Q: How does Clixon differ from Clicon? A: Clixon is a fork of Clicon focussing on Yang specification and XML database. The yang support in clicon was grown out of a key-based scheme that was complex since it had to translate between formats. Clixon uses only XML. A simplified commit transaction mechanism has been added to. But Clixon is not backward compliant with key-based Clicon applications, such as ROST. Q: In the example, how can you alter its semantics? - routing.conf.local - Override default settings - The yang specifications - Alter accepted XML, database format and the configuration part of the CLI commands that are generated. - routing_cli.cli - Change the fixed part of the CLI commands - routing_cli.c - New cli commands may need to write a new C-funtion. - routing_backend.c - What happens at commit. - routing_netconf.c - Modify semantics of netconf commands. Q: How do you check what is in a database? clicon_dbctrl -d -p The name of the running or candidate databases are found in the configuration file, eg /usr/local/var/routing/candidate_db Example: /interfaces/interface/eth0/ipv4 /interfaces/interface/eth0/type bgp /interfaces/interface/eth0 /interfaces/interface/eth0/name eth0 Each line corresponds to a database entry (node in an XML tree). If the node is a leaf, the value appears as the second entry. Q: How do you write a commit rule in the example? A: You write a commit function in routing_backend.c. Every time a commit is made, transaction_commit() is called in the backend. It has a 'transaction_data td' argument which is used to fetch information on added, deleted and changed entries. You access this information using access functions as defined in clicon_backend_transaction.h Q: How do you check what has changed on commit? A: You use XPATHs on the XML trees in the transaction commit callback. Suppose you want to print all added interfaces: cxobj *target = transaction_target(td); # wanted XML tree # Get all added i/fs cxobj **vec = xpath_vec_flag(target, "//interface", &len, XML_FLAG_ADD); for (i=0; i("This is a variable"), mycallback("myarg"); Then define a function in routing_cli.c mycallback(clicon_handle h, cvec *cvv, cg_var *arg) where 'cvv' contains the value of the variable and 'arg' contains the function parameter 'myarg'. Q: What are cg_var and cvec used in CLI callbacks? Those are 'CLIgen variables' and vector of CLOgen variables. Documented in CLIgen documentation. Some examples on usage is found in the routing_cli.c Q: How do you write a validation rule? Similar to a commit rule, but instead write the transaction_validate() function. Check for consitencies in the XML trees and if they fail, make an clicon_err() call. clicon_err(OE_PLUGIN, 0, "Route %s lacks ipv4 addr", name); return -1; The validation or commit will then be aborted.