Multiple plugins can be mounted into the \hyperlink{md_doc_help_elektra-glossary_doc_help_elektra-glossary_md}{key database} (K\+DB). On every access to the key data base they are executed and thus can change the functionality and behavior.

Elektra has a wide range of different plugins. The plugin folders should contain a R\+E\+A\+D\+M\+E.\+md with further information. (Or follow links below.) The plugins are\+:

 \subsubsection*{C-\/\+Interface}

All plugins implement the same interface\+:


\begin{DoxyItemize}
\item {\ttfamily \hyperlink{group__kdb_ga6808defe5870f328dd17910aacbdc6ca}{kdb\+Open()}} calls {\ttfamily \hyperlink{elektra_2plugin_8c_a32a70a7876542c51d153164ac5108a57}{elektra\+Plugin\+Open()}} of every plugin to let them do their initialisation.
\item {\ttfamily \hyperlink{group__kdb_ga28e385fd9cb7ccfe0b2f1ed2f62453a1}{kdb\+Get()}} requests {\ttfamily elektra\+Plugin\+Get()} of every plugin in the queried backends to return a key set.
\item {\ttfamily \hyperlink{group__kdb_ga11436b058408f83d303ca5e996832bcf}{kdb\+Set()}} usually calls {\ttfamily elektra\+Plugin\+Set()} of every plugin in the queried backends to store the configuration.
\item {\ttfamily \hyperlink{group__kdb_ga11436b058408f83d303ca5e996832bcf}{kdb\+Set()}} also calls {\ttfamily elektra\+Plugin\+Error()} for every plugin when an error happens. Because of {\ttfamily elektra\+Plugin\+Error()}, plugins are guaranteed to have their chance for necessary cleanups.
\item {\ttfamily \hyperlink{group__kdb_gadb54dc9fda17ee07deb9444df745c96f}{kdb\+Close()}} makes sure that plugins can finally free their own resources in {\ttfamily elektra\+Plugin\+Close()}.
\item {\ttfamily kdb\+Check\+Config()} can be called manually to ensure a plugin is configured properly.
\item {\ttfamily kdb\+Gen\+Config()} can be called to produce all valid configurations of a plugin.
\end{DoxyItemize}

\subsubsection*{K\+D\+B-\/\+Interface}


\begin{DoxyItemize}
\item To list all plugins use \hyperlink{md_doc_help_kdb-list_doc_help_kdb-list_md}{kdb-\/list(1)}.
\item To check a plugin use \hyperlink{md_doc_help_kdb-check_doc_help_kdb-check_md}{kdb-\/check(1)}.
\item For information on a plugin use \hyperlink{md_doc_help_kdb-info_doc_help_kdb-info_md}{kdb-\/info(1)}.
\item For mount plugin(s) use \hyperlink{md_doc_help_kdb-mount_doc_help_kdb-mount_md}{kdb-\/mount(1)}.
\end{DoxyItemize}

\subsection*{See also}

For an easy introduction, see \hyperlink{doc_tutorials_plugins_md}{this tutorial how to write a storage plugin}. For more background information of the \hyperlink{doc_dev_plugins-framework_md}{plugins framework, continue here}. Otherwise, you can visit the \href{https://doc.libelektra.org/api/current/html/group__plugin.html}{\tt the A\+PI documentation}.

\subsection*{Plugins}

\subsubsection*{Resolver}

Before configuration is actually written, the file name needs to be determined (resolvers will be automatically added by kdb mount)\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_resolver_README_src_plugins_resolver_README_md}{resolver} uses advanced P\+O\+S\+IX A\+P\+Is to handle conflicts gracefully
\item wresolver minimalistic resolver for non-\/\+P\+O\+S\+IX systems
\item \hyperlink{md_src_plugins_noresolver_README_src_plugins_noresolver_README_md}{noresolver} does not resolve, but can act as one
\item \hyperlink{md_src_plugins_gitresolver_README_src_plugins_gitresolver_README_md}{gitresolver} checks out and commits files to a local git repository and afterwards the configuration file must be synced with harddisc (recommended to add at every kdb mount)\+:
\item \hyperlink{md_src_plugins_curlget_README_src_plugins_curlget_README_md}{curlget} fetches configuration file from a remote host
\item \hyperlink{md_src_plugins_blockresolver_README_src_plugins_blockresolver_README_md}{blockresolver} resolves tagged blocks inside config files
\item \hyperlink{md_src_plugins_multifile_README_src_plugins_multifile_README_md}{multifile}
\item \hyperlink{md_src_plugins_sync_README_src_plugins_sync_README_md}{sync} uses P\+O\+S\+IX A\+P\+Is to sync configuration files with the hard disk
\end{DoxyItemize}

\subsubsection*{Storage}

Are responsible for reading writing the configuration to configuration files.

Read and write everything a Key\+Set might contain\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_dini_README_src_plugins_dini_README_md}{dini} uses by default the ini plugin but has legacy support for dump
\item \hyperlink{md_src_plugins_ini_README_src_plugins_ini_README_md}{ini} supports a range of I\+NI file formats.
\item \hyperlink{md_src_plugins_dump_README_src_plugins_dump_README_md}{dump} makes a dump of a Key\+Set in an Elektra-\/specific format
\end{DoxyItemize}

Read (and write) standard config files\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_augeas_README_src_plugins_augeas_README_md}{augeas} reads/writes many different configuration files using the augeas library
\item \hyperlink{md_src_plugins_hosts_README_src_plugins_hosts_README_md}{hosts} reads/writes hosts files
\item \hyperlink{md_src_plugins_line_README_src_plugins_line_README_md}{line} reads/writes any file line by line
\item \hyperlink{md_src_plugins_yajl_README_src_plugins_yajl_README_md}{yajl} reads/writes J\+S\+ON.
\end{DoxyItemize}

Using semi-\/structured data for config files, mainly suitable for spec-\/namespace (put a focus on having nice syntax for metadata)\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_ni_README_src_plugins_ni_README_md}{ni} parses I\+NI files based on (including metadata) \href{https://github.com/chazomaticus/bohr/blob/master/include/bohr/ni.h}{\tt ni}.
\item \hyperlink{md_src_plugins_tcl_README_src_plugins_tcl_README_md}{tcl}-\/like config files (including metadata).
\end{DoxyItemize}

Only suited for import/export\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_xerces_README_src_plugins_xerces_README_md}{xerces} uses X\+ML (without a specific schema).
\item \hyperlink{md_src_plugins_xmltool_README_src_plugins_xmltool_README_md}{xmltool} uses X\+ML (in Elektra\textquotesingle{}s X\+ML schema).
\item \hyperlink{md_src_plugins_simpleini_README_src_plugins_simpleini_README_md}{simpleini} line-\/based key-\/value pairs with configurable format (without sections)
\item \hyperlink{md_src_plugins_mini_README_src_plugins_mini_README_md}{mini} dependency free, line based key-\/value storage plugin.
\end{DoxyItemize}

Plugins that just show some functionality, (currently) not intended for productive use\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_fstab_README_src_plugins_fstab_README_md}{fstab} for fstab files.
\item \hyperlink{md_src_plugins_regexstore_README_src_plugins_regexstore_README_md}{regexstore}
\item \hyperlink{md_src_plugins_csvstorage_README_src_plugins_csvstorage_README_md}{csvstorage} for csv files
\item \hyperlink{md_src_plugins_passwd_README_src_plugins_passwd_README_md}{passwd} for passwd files
\item \hyperlink{md_src_plugins_dpkg_README_src_plugins_dpkg_README_md}{dpkg} reads /var/lib/dpkg/\{available,status\}
\item \hyperlink{md_src_plugins_mozprefs_README_src_plugins_mozprefs_README_md}{mozprefs} for Mozilla preference files
\item \hyperlink{md_src_plugins_c_README_src_plugins_c_README_md}{c} writes Elektra C-\/structures ({\ttfamily ks\+New(.. key\+New(...})
\item \hyperlink{md_src_plugins_file_README_src_plugins_file_README_md}{file} reads and writes a file from/to a single key
\item \hyperlink{md_src_plugins_camel_README_src_plugins_camel_README_md}{camel} reads and writes a very limited subset of \href{http://www.yaml.org}{\tt Y\+A\+ML}
\item \hyperlink{md_src_plugins_yamlcpp_README_src_plugins_yamlcpp_README_md}{yamlcpp} reads and writes data in the \href{http://www.yaml.org}{\tt Y\+A\+ML} format using \href{https://github.com/jbeder/yaml-cpp}{\tt yaml-\/cpp}
\end{DoxyItemize}

\subsubsection*{System Information}

Information compiled in Elektra\+:
\begin{DoxyItemize}
\item version is a built-\/in plugin directly within the core so that it cannot give wrong version information
\item \hyperlink{md_src_plugins_constants_README_src_plugins_constants_README_md}{constants} various constants, including version information
\item \hyperlink{md_src_plugins_desktop_README_src_plugins_desktop_README_md}{desktop} contains information which desktop is currently running
\end{DoxyItemize}

Providing information found on the system not available in persistent files\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_uname_README_src_plugins_uname_README_md}{uname} information from the uname syscall.
\end{DoxyItemize}

\subsubsection*{Filter}

{\itshape Filter plugins} process keys and their values in both directions. In one direction they undo what they do in the other direction. Most filter plugins available now encode and decode values. Storage plugins that use characters to separate key names, values or metadata will not work without them.


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_cachefilter_README_src_plugins_cachefilter_README_md}{cachefilter} stores filtered keys internally so that they do not get accidentally lost and can be written to the storage again without the user having to remember including them in the writeout
\end{DoxyItemize}

{\bfseries Encoding}

Rewrite unwanted characters with different techniques\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_ccode_README_src_plugins_ccode_README_md}{ccode} using the technique from arrays in the programming language C
\item \hyperlink{md_src_plugins_hexcode_README_src_plugins_hexcode_README_md}{hexcode} using hex codes
\item \hyperlink{md_src_plugins_base64_README_src_plugins_base64_README_md}{base64} using the Base64 encoding scheme (R\+F\+C4648)
\end{DoxyItemize}

Transformations\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_directoryvalue_README_src_plugins_directoryvalue_README_md}{directoryvalue} converts directory values to leaf values
\item \hyperlink{md_src_plugins_keytometa_README_src_plugins_keytometa_README_md}{keytometa} transforms keys to metadata
\item \hyperlink{md_src_plugins_rename_README_src_plugins_rename_README_md}{rename} renames keys according to different rules
\item \hyperlink{md_src_plugins_boolean_README_src_plugins_boolean_README_md}{boolean} canonicalizes boolean keys
\end{DoxyItemize}

Doing other stuff\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_crypto_README_src_plugins_crypto_README_md}{crypto} encrypts / decrypts confidential values
\item \hyperlink{md_src_plugins_fcrypt_README_src_plugins_fcrypt_README_md}{fcrypt} encrypts / decrypts entire backend files
\item \hyperlink{md_src_plugins_iconv_README_src_plugins_iconv_README_md}{iconv} makes sure the configuration will have correct character encoding
\item \hyperlink{md_src_plugins_hidden_README_src_plugins_hidden_README_md}{hidden} hides keys whose names start with a {\ttfamily .}.
\item \hyperlink{md_src_plugins_null_README_src_plugins_null_README_md}{null} takes care of null values and other binary specialities
\end{DoxyItemize}

\subsubsection*{Notification and Logging}

Log/\+Send out all changes to configuration to\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_dbus_README_src_plugins_dbus_README_md}{dbus} sends notifications for every change via dbus
\item \hyperlink{md_src_plugins_syslog_README_src_plugins_syslog_README_md}{syslog} logs key database changes to syslog
\item \hyperlink{md_src_plugins_journald_README_src_plugins_journald_README_md}{journald} logs key database changes to journald
\item \hyperlink{md_src_plugins_logchange_README_src_plugins_logchange_README_md}{logchange} prints the change of every key on the console
\end{DoxyItemize}

Notification of key changes\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_internalnotification_README_src_plugins_internalnotification_README_md}{internalnotification} get updates automatically when registered keys were changed
\end{DoxyItemize}

\subsubsection*{Debug}

Trace everything that happens within K\+DB\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_timeofday_README_src_plugins_timeofday_README_md}{timeofday} prints timestamps
\item \hyperlink{md_src_plugins_tracer_README_src_plugins_tracer_README_md}{tracer} traces all calls
\item \hyperlink{md_src_plugins_counter_README_src_plugins_counter_README_md}{counter} count and print how often a plugin is used
\end{DoxyItemize}

\subsubsection*{Checker}

Copies metadata to keys\+:


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_spec_README_src_plugins_spec_README_md}{spec} copies metadata from spec namespace (the standard way)
\item \hyperlink{md_src_plugins_glob_README_src_plugins_glob_README_md}{glob} using globbing techniques (needed by some plugins)
\item \hyperlink{md_src_plugins_struct_README_src_plugins_struct_README_md}{struct} using a defined structure (may also reject configuration not conforming to that structure)
\end{DoxyItemize}

Plugins that check if values are valid based on metadata (typically copied by the {\ttfamily spec} plugin just before)\+:

{\bfseries Value Validation}


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_validation_README_src_plugins_validation_README_md}{validation} by using regex
\item \hyperlink{md_src_plugins_network_README_src_plugins_network_README_md}{network} by using network A\+P\+Is
\item \hyperlink{md_src_plugins_ipaddr_README_src_plugins_ipaddr_README_md}{ipaddr} checks IP addresses using regular expressions
\item \hyperlink{md_src_plugins_path_README_src_plugins_path_README_md}{path} by checking files on file system
\item \hyperlink{md_src_plugins_type_README_src_plugins_type_README_md}{type} using run-\/time type checking (C\+O\+R\+BA types/)
\item \hyperlink{md_src_plugins_enum_README_src_plugins_enum_README_md}{enum} compares the keyvalue against a list of valid values
\item \hyperlink{md_src_plugins_mathcheck_README_src_plugins_mathcheck_README_md}{mathcheck} by mathematical expressions using key values as operands
\item \hyperlink{md_src_plugins_conditionals_README_src_plugins_conditionals_README_md}{conditionals} by using if-\/then-\/else like statements
\item \hyperlink{md_src_plugins_required_README_src_plugins_required_README_md}{required} rejects non-\/required keys
\item \hyperlink{md_src_plugins_date_README_src_plugins_date_README_md}{date} validates date and time data
\item \hyperlink{md_src_plugins_range_README_src_plugins_range_README_md}{range} checks if a value is within a given range
\end{DoxyItemize}

{\bfseries Other Validation}


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_filecheck_README_src_plugins_filecheck_README_md}{filecheck} does sanity checks on a file
\item \hyperlink{md_src_plugins_lineendings_README_src_plugins_lineendings_README_md}{lineendings} tests file for consistent line endings
\end{DoxyItemize}

\subsubsection*{Interpreter}

These plugins start an interpreter and allow you to execute a script in an interpreted language whenever Elektra’s key database gets accessed. Note that they depend on the presence of the respective binding during run-\/time.


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_jni_README_src_plugins_jni_README_md}{jni} java plugins started by jni, works with jna plugins
\item \hyperlink{md_src_plugins_python_README_src_plugins_python_README_md}{python} Python 3 plugins
\item \hyperlink{md_src_plugins_python2_README_src_plugins_python2_README_md}{python2} Python 2 plugins (deprecated)
\item \hyperlink{md_src_plugins_ruby_README_src_plugins_ruby_README_md}{ruby} Ruby plugins
\item \hyperlink{md_src_plugins_lua_README_src_plugins_lua_README_md}{lua} Lua plugins
\item \hyperlink{md_src_plugins_shell_README_src_plugins_shell_README_md}{shell} executes shell commandos
\item \hyperlink{md_src_plugins_haskell_README_src_plugins_haskell_README_md}{haskell} used for linking haskell plugins and is a small example for such plugins itself
\end{DoxyItemize}

\subsubsection*{Others}


\begin{DoxyItemize}
\item \hyperlink{md_src_plugins_doc_README_src_plugins_doc_README_md}{doc} contains the documentation of the plugin interface
\item \hyperlink{md_src_plugins_error_README_src_plugins_error_README_md}{error} yields errors as described in metadata (handy for test purposes)
\item \hyperlink{md_src_plugins_template_README_src_plugins_template_README_md}{template} to be copied for new plugins
\item \hyperlink{md_src_plugins_list_README_src_plugins_list_README_md}{list} loads other plugins
\item \hyperlink{md_src_plugins_iterate_README_src_plugins_iterate_README_md}{iterate} iterate over all keys and run exported functions on tagged keys
\item \hyperlink{md_src_plugins_semlock_README_src_plugins_semlock_README_md}{semlock} a semaphore based global locking logic
\item \hyperlink{md_src_plugins_profile_README_src_plugins_profile_README_md}{profile} links profile keys
\item \hyperlink{md_src_plugins_simplespeclang_README_src_plugins_simplespeclang_README_md}{simplespeclang} simple configuration specification language 
\end{DoxyItemize}