.\" Automatically generated by Podwrapper::Man 1.32.5 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "nbdkit-probing 1" .TH nbdkit-probing 1 "2023-01-04" "nbdkit-1.32.5" "NBDKIT" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" nbdkit\-probing \- how to probe for nbdkit configuration and plugins .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& nbdkit \-\-dump\-config .Ve .PP .Vb 1 \& nbdkit PLUGIN \-\-dump\-plugin .Ve .PP .Vb 1 \& nbdkit \-\-version .Ve .PP .Vb 1 \& nbdkit PLUGIN \-\-version .Ve .PP .Vb 1 \& nbdkit \-\-filter=FILTER null \-\-version .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" You can query information about nbdkit and available plugins and filters using the nbdkit binary. This can include whether nbdkit is installed, and whether plugins or filters are installed. .SS "Query if nbdkit is installed" .IX Subsection "Query if nbdkit is installed" Use this command to see if the nbdkit program is installed: .PP .Vb 1 \& nbdkit \-\-version .Ve .PP This will fail with an error and non-zero exit code if nbdkit is not installed or not working. .SS "Query basic configuration" .IX Subsection "Query basic configuration" .Vb 1 \& nbdkit \-\-dump\-config .Ve .PP lists information about how nbdkit was configured. The most important fields in the output are the name of the directory where nbdkit looks for plugins and the version of nbdkit, eg: .PP .Vb 4 \& plugindir=/usr/lib64/nbdkit/plugins \& version=1.20.1 \& version_major=1 \& version_minor=20 .Ve .SS "Test nbdkit ≥ version" .IX Subsection "Test nbdkit ≥ version" To test if nbdkit ≥ a particular version is installed, use the \&\fI\-\-dump\-config\fR option and look for the \f(CW\*(C`version_major\*(C'\fR and \&\f(CW\*(C`version_minor\*(C'\fR fields: .PP .Vb 6 \& $ nbdkit \-\-dump\-config | grep ^version_minor \& version_minor=20 \& $ major=$( nbdkit \-\-dump\-config | grep ^version_major | cut \-d= \-f2 ) \& $ minor=$( nbdkit \-\-dump\-config | grep ^version_minor | cut \-d= \-f2 ) \& $ if [ $major \-eq 1 ] && [ $minor \-lt 12 ] \& then echo \*(Aqnbdkit >= 1.12 is required\*(Aq; exit 1; fi .Ve .PP These fields were first added in nbdkit 1.16.5 and were not present in earlier versions. .PP You can also probe the minimum version using \fBpkg\-config\fR\|(1). See \&\*(L"\s-1PKG\-CONFIG/PKGCONF\*(R"\s0 in \fBnbdkit\-plugin\fR\|(3). .SS "Query information about a particular plugin" .IX Subsection "Query information about a particular plugin" .Vb 1 \& nbdkit pluginname \-\-dump\-plugin .Ve .PP (where \fIpluginname\fR is the name or full path of a plugin) will dump information about that plugin, eg: .PP .Vb 8 \& $ nbdkit file \-\-dump\-plugin \& path=/usr/lib64/nbdkit/plugins/nbdkit\-file\-plugin.so \& name=file \& version=1.20.1 \& api_version=1 \& struct_size=176 \& thread_model=serialize_requests \& [etc] .Ve .PP Plugins which ship with nbdkit usually have the same version as the corresponding nbdkit binary. The nbdkit binary will always be able to utilize plugins compiled against an older version of the header; however, newer plugins may not be fully supported by an older nbdkit binary (for example, a plugin compiled with \f(CW\*(C`NBDKIT_API_VERSION\*(C'\fR of 2 fails to load with an older nbdkit that only knows \&\f(CW\*(C`NBDKIT_API_VERSION\*(C'\fR 1). .SS "Detect if a plugin is installed" .IX Subsection "Detect if a plugin is installed" To find out if a plugin is installed (and working) in the plugin directory, use: .PP .Vb 3 \& $ nbdkit foo \-\-version \& nbdkit: error: cannot open plugin \*(Aqfoo\*(Aq: /usr/lib64/nbdkit/plugins/nbdkit\-foo\-plugin.so: cannot open shared object file: No such file or directory \& Use \*(Aqnbdkit \-\-help\*(Aq or read the nbdkit(1) manual page for documentation. .Ve .PP This will fail with an error and non-zero exit code if the \f(CW\*(C`foo\*(C'\fR plugin cannot be loaded. .PP Note it is better to test for the existence of plugins this way rather than just seeing if the \fI.so\fR file exists, because nbdkit will load the plugin and check that all its dependencies can be satisfied, and also that plugin registration works. .SS "List all plugins in the plugin directory" .IX Subsection "List all plugins in the plugin directory" You could simply get the plugin directory (from \fI\-\-dump\-config\fR) and list all files in this directory called \fInbdkit\-*\-plugin.so\fR. .PP However a better test is to run \fI\-\-dump\-plugin\fR (see above) on each one to check that it is working and all of its dependencies are installed. A complete shell script which does this is: .PP .Vb 8 \& #!/bin/sh \- \& plugindir=\`nbdkit \-\-dump\-config | grep ^plugindir= | sed \*(Aqs/[^=]*=//\*(Aq\` \& for f in $plugindir/nbdkit\-*\-plugin.so; do \& if nbdkit "$f" \-\-version >/dev/null 2>&1; then \& b=\`echo "$f" | sed \*(Aqs,.*/nbdkit\-\e(.*\e)\-plugin.so$,\e1,\*(Aq\` \& echo "$b ($f)" \& fi \& done .Ve .SS "Detect if a filter is installed" .IX Subsection "Detect if a filter is installed" To find out if a filter is installed (and working) use \fI\-\-version\fR with the \f(CW\*(C`null\*(C'\fR plugin and the name of the filter to test: .PP .Vb 1 \& nbdkit \-\-version \-\-filter=foo null .Ve .PP This will fail with an error and non-zero exit code if the \f(CW\*(C`foo\*(C'\fR filter cannot be loaded. .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBnbdkit\fR\|(1). .SH "AUTHORS" .IX Header "AUTHORS" Eric Blake .PP Richard W.M. Jones .PP Pino Toscano .SH "COPYRIGHT" .IX Header "COPYRIGHT" Copyright (C) 2013\-2020 Red Hat Inc. .SH "LICENSE" .IX Header "LICENSE" Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: .IP "\(bu" 4 Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. .IP "\(bu" 4 Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. .IP "\(bu" 4 Neither the name of Red Hat nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. .PP \&\s-1THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS\s0 ''\s-1AS IS\s0'' \s-1AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\s0 (\s-1INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES\s0; \s-1LOSS OF USE, DATA, OR PROFITS\s0; \s-1OR BUSINESS INTERRUPTION\s0) \s-1HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\s0 (\s-1INCLUDING NEGLIGENCE OR OTHERWISE\s0) \s-1ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\s0