<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <!-- 2018-10-29 Mon 17:20 --> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>‎</title> <meta name="generator" content="Org mode" /> <style type="text/css"> <!--/*--><![CDATA[/*><!--*/ .title { text-align: center; margin-bottom: .2em; } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top:0; } .todo { font-family: monospace; color: red; } .done { font-family: monospace; color: green; } .priority { font-family: monospace; color: orange; } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal; } .timestamp { color: #bebebe; } .timestamp-kwd { color: #5f9ea0; } .org-right { margin-left: auto; margin-right: 0px; text-align: right; } .org-left { margin-left: 0px; margin-right: auto; text-align: left; } .org-center { margin-left: auto; margin-right: auto; text-align: center; } .underline { text-decoration: underline; } #postamble p, #preamble p { font-size: 90%; margin: .2em; } p.verse { margin-left: 3%; } pre { border: 1px solid #ccc; box-shadow: 3px 3px 3px #eee; padding: 8pt; font-family: monospace; overflow: auto; margin: 1.2em; } pre.src { position: relative; overflow: visible; padding-top: 1.2em; } pre.src:before { display: none; position: absolute; background-color: white; top: -10px; right: 10px; padding: 3px; border: 1px solid black; } pre.src:hover:before { display: inline;} /* Languages per Org manual */ pre.src-asymptote:before { content: 'Asymptote'; } pre.src-awk:before { content: 'Awk'; } pre.src-C:before { content: 'C'; } /* pre.src-C++ doesn't work in CSS */ pre.src-clojure:before { content: 'Clojure'; } pre.src-css:before { content: 'CSS'; } pre.src-D:before { content: 'D'; } pre.src-ditaa:before { content: 'ditaa'; } pre.src-dot:before { content: 'Graphviz'; } pre.src-calc:before { content: 'Emacs Calc'; } pre.src-emacs-lisp:before { content: 'Emacs Lisp'; } pre.src-fortran:before { content: 'Fortran'; } pre.src-gnuplot:before { content: 'gnuplot'; } pre.src-haskell:before { content: 'Haskell'; } pre.src-hledger:before { content: 'hledger'; } pre.src-java:before { content: 'Java'; } pre.src-js:before { content: 'Javascript'; } pre.src-latex:before { content: 'LaTeX'; } pre.src-ledger:before { content: 'Ledger'; } pre.src-lisp:before { content: 'Lisp'; } pre.src-lilypond:before { content: 'Lilypond'; } pre.src-lua:before { content: 'Lua'; } pre.src-matlab:before { content: 'MATLAB'; } pre.src-mscgen:before { content: 'Mscgen'; } pre.src-ocaml:before { content: 'Objective Caml'; } pre.src-octave:before { content: 'Octave'; } pre.src-org:before { content: 'Org mode'; } pre.src-oz:before { content: 'OZ'; } pre.src-plantuml:before { content: 'Plantuml'; } pre.src-processing:before { content: 'Processing.js'; } pre.src-python:before { content: 'Python'; } pre.src-R:before { content: 'R'; } pre.src-ruby:before { content: 'Ruby'; } pre.src-sass:before { content: 'Sass'; } pre.src-scheme:before { content: 'Scheme'; } pre.src-screen:before { content: 'Gnu Screen'; } pre.src-sed:before { content: 'Sed'; } pre.src-sh:before { content: 'shell'; } pre.src-sql:before { content: 'SQL'; } pre.src-sqlite:before { content: 'SQLite'; } /* additional languages in org.el's org-babel-load-languages alist */ pre.src-forth:before { content: 'Forth'; } pre.src-io:before { content: 'IO'; } pre.src-J:before { content: 'J'; } pre.src-makefile:before { content: 'Makefile'; } pre.src-maxima:before { content: 'Maxima'; } pre.src-perl:before { content: 'Perl'; } pre.src-picolisp:before { content: 'Pico Lisp'; } pre.src-scala:before { content: 'Scala'; } pre.src-shell:before { content: 'Shell Script'; } pre.src-ebnf2ps:before { content: 'ebfn2ps'; } /* additional language identifiers per "defun org-babel-execute" in ob-*.el */ pre.src-cpp:before { content: 'C++'; } pre.src-abc:before { content: 'ABC'; } pre.src-coq:before { content: 'Coq'; } pre.src-groovy:before { content: 'Groovy'; } /* additional language identifiers from org-babel-shell-names in ob-shell.el: ob-shell is the only babel language using a lambda to put the execution function name together. */ pre.src-bash:before { content: 'bash'; } pre.src-csh:before { content: 'csh'; } pre.src-ash:before { content: 'ash'; } pre.src-dash:before { content: 'dash'; } pre.src-ksh:before { content: 'ksh'; } pre.src-mksh:before { content: 'mksh'; } pre.src-posh:before { content: 'posh'; } /* Additional Emacs modes also supported by the LaTeX listings package */ pre.src-ada:before { content: 'Ada'; } pre.src-asm:before { content: 'Assembler'; } pre.src-caml:before { content: 'Caml'; } pre.src-delphi:before { content: 'Delphi'; } pre.src-html:before { content: 'HTML'; } pre.src-idl:before { content: 'IDL'; } pre.src-mercury:before { content: 'Mercury'; } pre.src-metapost:before { content: 'MetaPost'; } pre.src-modula-2:before { content: 'Modula-2'; } pre.src-pascal:before { content: 'Pascal'; } pre.src-ps:before { content: 'PostScript'; } pre.src-prolog:before { content: 'Prolog'; } pre.src-simula:before { content: 'Simula'; } pre.src-tcl:before { content: 'tcl'; } pre.src-tex:before { content: 'TeX'; } pre.src-plain-tex:before { content: 'Plain TeX'; } pre.src-verilog:before { content: 'Verilog'; } pre.src-vhdl:before { content: 'VHDL'; } pre.src-xml:before { content: 'XML'; } pre.src-nxml:before { content: 'XML'; } /* add a generic configuration mode; LaTeX export needs an additional (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */ pre.src-conf:before { content: 'Configuration File'; } table { border-collapse:collapse; } caption.t-above { caption-side: top; } caption.t-bottom { caption-side: bottom; } td, th { vertical-align:top; } th.org-right { text-align: center; } th.org-left { text-align: center; } th.org-center { text-align: center; } td.org-right { text-align: right; } td.org-left { text-align: left; } td.org-center { text-align: center; } dt { font-weight: bold; } .footpara { display: inline; } .footdef { margin-bottom: 1em; } .figure { padding: 1em; } .figure p { text-align: center; } .inlinetask { padding: 10px; border: 2px solid gray; margin: 10px; background: #ffffcc; } #org-div-home-and-up { text-align: right; font-size: 70%; white-space: nowrap; } textarea { overflow-x: auto; } .linenr { font-size: smaller } .code-highlighted { background-color: #ffff00; } .org-info-js_info-navigation { border-style: none; } #org-info-js_console-label { font-size: 10px; font-weight: bold; white-space: nowrap; } .org-info-js_search-highlight { background-color: #ffff00; color: #000000; font-weight: bold; } .org-svg { width: 90%; } /*]]>*/--> </style> <script type="text/javascript"> /* @licstart The following is the entire license notice for the JavaScript code in this tag. Copyright (C) 2012-2018 Free Software Foundation, Inc. The JavaScript code in this tag is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License (GNU GPL) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The code is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. As additional permission under GNU GPL version 3 section 7, you may distribute non-source (e.g., minimized or compacted) forms of that code without the copy of the GNU GPL normally required by section 4, provided you include this license notice and a URL through which recipients can access the Corresponding Source. @licend The above is the entire license notice for the JavaScript code in this tag. */ <!--/*--><![CDATA[/*><!--*/ function CodeHighlightOn(elem, id) { var target = document.getElementById(id); if(null != target) { elem.cacheClassElem = elem.className; elem.cacheClassTarget = target.className; target.className = "code-highlighted"; elem.className = "code-highlighted"; } } function CodeHighlightOff(elem, id) { var target = document.getElementById(id); if(elem.cacheClassElem) elem.className = elem.cacheClassElem; if(elem.cacheClassTarget) target.className = elem.cacheClassTarget; } /*]]>*///--> </script> </head> <body> <div id="content"> <div id="table-of-contents"> <h2>Table of Contents</h2> <div id="text-table-of-contents"> <ul> <li><a href="#org00fe9a3">ck</a> <ul> <li><a href="#orgddefd39">Technicalities</a></li> <li><a href="#org52a8ede">Download</a></li> </ul> </li> <li><a href="#build-instructions">build it</a> <ul> <li><a href="#orge924f4c">requirements</a></li> <li><a href="#orga1d810a">make && install</a></li> </ul> </li> <li><a href="#org421fdfb">for devs</a> <ul> <li><a href="#org98bcc06">CMake options</a></li> <li><a href="#org945fa72">compiler</a></li> <li><a href="#orge94d2b6">tests</a> <ul> <li><a href="#org6d98a70">run tests</a></li> <li><a href="#orgdf6a992">test suite</a></li> </ul> </li> </ul> </li> <li><a href="#org5444b91">ck configuration</a></li> <li><a href="#usage">Usage</a> <ul> <li><a href="#orgd2e5354">Initialize</a></li> <li><a href="#orgfc9d01c">Add configs</a></li> <li><a href="#orga6dee7d">Using the ck actions</a></li> </ul> </li> <li><a href="#manpage">manpage</a></li> </ul> </div> </div> <p align="center"><img src="res/logo.png"></p> <div id="outline-container-org00fe9a3" class="outline-2"> <h2 id="org00fe9a3">ck</h2> <div class="outline-text-2" id="text-org00fe9a3"> <p> <b>The Config Keeper</b> </p> <p> Have you ever wondered: </p> <blockquote> <p> "Jeez Luiz, how can I manage all my configs across my desktop and server?" </p> <p> – You </p> </blockquote> <p> or maybe: </p> <blockquote> <p> "How can I possibly keep all my configs in sync across computers?" </p> <p> – You again </p> </blockquote> <p> <b>ck</b> is the solution you've been looking for all your life. </p> <p> With it you can keep track of all the configs you cherish and love, and store them neat and tidy in a folder you can later sync using your favorite sync solution (git, nextcloud, rsync). You can even gift your precious data to Google and use GDrive (<i><i>not recommended!!</i></i>). </p> <p> After you create your local config db you can list them, edit them and even search in them, all within the comforting hands of <b>ck</b>, your faithful companion. </p> <p> You can also use <b>ck</b> to store sensitive configurations (with passwords, etc) and instruct it to save them in a different folder, so they won't be in the same place with the normal ones (in the event you want to share your configs with the rest of us). </p> </div> <div id="outline-container-orgddefd39" class="outline-3"> <h3 id="orgddefd39">Technicalities</h3> <div class="outline-text-3" id="text-orgddefd39"> <p> Upon adding a config to <b>ck</b>, it moves it to the specified folder and adds a symbolic link back where it came from (<code>ln -s</code>). </p> <p> Make sure that the target program can read it's configuration from a symlink (the vast majority should). </p> </div> </div> <div id="outline-container-org52a8ede" class="outline-3"> <h3 id="org52a8ede">Download</h3> <div class="outline-text-3" id="text-org52a8ede"> <p> Go ahead and download <b>ck</b> and give it a try. It comes with a help sub-command that explains any inquires you might have. </p> <p> Grab the latest zip/tarball from the tag section in the <a href="https://ubuntos.dynu.net/git/ck">repo</a> and proceed to the <a href="#build-instructions">build</a> section. </p> <p> You can also read the manpage <a href="#manpage">down below</a>. </p> </div> </div> </div> <div id="outline-container-orgde5aa18" class="outline-2"> <h2 id="build-instructions"><a id="orgde5aa18"></a>build it</h2> <div class="outline-text-2" id="text-build-instructions"> </div> <div id="outline-container-orge924f4c" class="outline-3"> <h3 id="orge924f4c">requirements</h3> <div class="outline-text-3" id="text-orge924f4c"> <ul class="org-ul"> <li>cmake</li> <li>sqlite3-dev</li> <li>build tools (gcc/llvm, make…)</li> </ul> </div> </div> <div id="outline-container-orga1d810a" class="outline-3"> <h3 id="orga1d810a">make && install</h3> <div class="outline-text-3" id="text-orga1d810a"> <p> Use <code>-DCMAKE_INSTALL_PREFIX</code> when running cmake to change the install path. </p> <div class="org-src-container"> <pre class="src src-sh"><span class="org-comment-delimiter"># </span><span class="org-comment">clone the repo</span> > cd ~/code; git clone https://gitlab.com/grm-grm/ck <span class="org-comment-delimiter"># </span><span class="org-comment">make a build directory and enter it</span> > mkdir ~/ck_build; <span class="org-builtin">cd</span> ~/ck_build; <span class="org-comment-delimiter"># </span><span class="org-comment">run cmake</span> > cmake ~/code/ck <span class="org-comment-delimiter"># </span><span class="org-comment">run make</span> > make <span class="org-comment-delimiter"># </span><span class="org-comment">install it</span> > make install <span class="org-comment-delimiter"># </span><span class="org-comment">run ck</span> > ck </pre> </div> </div> </div> </div> <div id="outline-container-org421fdfb" class="outline-2"> <h2 id="org421fdfb">for devs</h2> <div class="outline-text-2" id="text-org421fdfb"> <p> Please be <a href="https://www.gnu.org/philosophy/kind-communication.html">kind</a> to each other. </p> </div> <div id="outline-container-org98bcc06" class="outline-3"> <h3 id="org98bcc06">CMake options</h3> <div class="outline-text-3" id="text-org98bcc06"> <p> cmake accepts the following options: </p> <div class="org-src-container"> <pre class="src src-cmake"><span class="org-function-name">option</span>(CK_DEBUG <span class="org-string">"Build with debug symbols, asan and warnings"</span>) <span class="org-function-name">option</span>(CK_TESTS <span class="org-string">"Make the tests"</span>) <span class="org-function-name">option</span>(CK_SHARED <span class="org-string">"Build with shared lib"</span>) </pre> </div> <p> To use any one of them append it after the cmake command like so: </p> <div class="org-src-container"> <pre class="src src-sh">cmake -DCK_DEBUG=1 -DCK_TESTS=1 ~/code/ck </pre> </div> </div> </div> <div id="outline-container-org945fa72" class="outline-3"> <h3 id="org945fa72">compiler</h3> <div class="outline-text-3" id="text-org945fa72"> <p> Pick your favorite </p> <div class="org-src-container"> <pre class="src src-sh">> export <span class="org-variable-name">CC</span>=clang <span class="org-comment-delimiter"># </span><span class="org-comment">or</span> > export <span class="org-variable-name">CC</span>=gcc </pre> </div> <div class="org-src-container"> <pre class="src src-sh"><span class="org-comment-delimiter"># </span><span class="org-comment">clone the repo</span> > cd ~/code; git clone https://gitlab.com/grm-grm/ck <span class="org-comment-delimiter"># </span><span class="org-comment">make a build directory and enter it</span> > mkdir ~/ck_build; <span class="org-builtin">cd</span> ~/ck_build; <span class="org-comment-delimiter"># </span><span class="org-comment">run cmake</span> > cmake -DCK_DEBUG=1 -DCK_TESTS=1 ~/code/ck <span class="org-comment-delimiter"># </span><span class="org-comment">run make</span> > make <span class="org-comment-delimiter"># </span><span class="org-comment">check ck</span> > ./test-ck <span class="org-comment-delimiter"># </span><span class="org-comment">run ck</span> > ./ck </pre> </div> </div> </div> <div id="outline-container-orge94d2b6" class="outline-3"> <h3 id="orge94d2b6">tests</h3> <div class="outline-text-3" id="text-orge94d2b6"> <p> The testing "suite" is a bash script that runs regression and unit tests. Regression tests are under the <code>tests/</code> directory and are bash scripts that test <code>ck</code> functionality. Unit tests reside under <code>unit/</code> directory and test the code. </p> </div> <div id="outline-container-org6d98a70" class="outline-4"> <h4 id="org6d98a70">run tests</h4> <div class="outline-text-4" id="text-org6d98a70"> <p> First make sure you build ck with the <code>-DCK_TESTS=1</code> option. Then go to the build directory and type: </p> <div class="org-src-container"> <pre class="src src-sh">$ ./test-ck </pre> </div> </div> </div> <div id="outline-container-orgdf6a992" class="outline-4"> <h4 id="orgdf6a992">test suite</h4> <div class="outline-text-4" id="text-orgdf6a992"> <div class="org-src-container"> <pre class="src src-sh">$ ./test-ck -h ck test suite use without flags to run all tests flags: -u, --unit run only the unit tests -r, --regression run only the regression tests -c, --clear remove test files use if the tests crush unexpectedly -h, --help, * print this </pre> </div> </div> </div> </div> </div> <div id="outline-container-org5444b91" class="outline-2"> <h2 id="org5444b91">ck configuration</h2> <div class="outline-text-2" id="text-org5444b91"> <p> See the <a href="#manpage">manpage</a> below. </p> </div> </div> <div id="outline-container-org5727b06" class="outline-2"> <h2 id="usage"><a id="org5727b06"></a>Usage</h2> <div class="outline-text-2" id="text-usage"> <p> ck's goal is to assist with the configuration file management. </p> <p> This section is an example usage. </p> </div> <div id="outline-container-orgd2e5354" class="outline-3"> <h3 id="orgd2e5354">Initialize</h3> <div class="outline-text-3" id="text-orgd2e5354"> <div class="org-src-container"> <pre class="src src-sh"><span class="org-builtin">cd</span> ~ <span class="org-comment-delimiter"># </span><span class="org-comment">make the directories for the configs</span> $ mkdir -p configs/vc configs/sec <span class="org-comment-delimiter"># </span><span class="org-comment">initialize new ck</span> $ ck init configs/vc configs/sec </pre> </div> </div> </div> <div id="outline-container-orgfc9d01c" class="outline-3"> <h3 id="orgfc9d01c">Add configs</h3> <div class="outline-text-3" id="text-orgfc9d01c"> <div class="org-src-container"> <pre class="src src-sh"><span class="org-comment-delimiter"># </span><span class="org-comment">add emacs configs</span> <span class="org-comment-delimiter">## </span><span class="org-comment">primary config</span> $ ck add emacs .emacs.d/orgconf.org -p <span class="org-comment-delimiter">## </span><span class="org-comment">secret config, with passwords and naughty words</span> $ ck add emacs .emacs.d/accounts.org -s <span class="org-comment-delimiter">## </span><span class="org-comment">and another one for emacs</span> $ ck add emacs .emacs.d/init.el <span class="org-comment-delimiter"># </span><span class="org-comment">add tmux config</span> $ ck add tmux .tmux.conf -p <span class="org-comment-delimiter"># </span><span class="org-comment">add X configs</span> $ ck add X .xinitrc $ ck add X .Xresources <span class="org-comment-delimiter"># </span><span class="org-comment">add ssh configs (secret)</span> $ ck add ssh .ssh/config -s -p $ ck add ssh .ssh/authorized_keys -s <span class="org-comment-delimiter"># </span><span class="org-comment">When running with sudo, we need to specify the ck config</span> <span class="org-comment-delimiter"># </span><span class="org-comment">location.</span> $ sudo ck -c /home/ckuser add ssh /etc/ssh/sshd_config -s </pre> </div> </div> </div> <div id="outline-container-orga6dee7d" class="outline-3"> <h3 id="orga6dee7d">Using the ck actions</h3> <div class="outline-text-3" id="text-orga6dee7d"> <div class="org-src-container"> <pre class="src src-sh"><span class="org-comment-delimiter"># </span><span class="org-comment">list the configs in a treelike structure with basename only</span> $ ck list tree -b <span class="org-comment-delimiter"># </span><span class="org-comment">or with the full path & attributes</span> $ ck list tree -a <span class="org-comment-delimiter"># </span><span class="org-comment">list only the paths in python or lisp like lists</span> $ ck list paths -t lisp $ ck list programs -t python -b -a <span class="org-comment-delimiter"># </span><span class="org-comment">list emacs configs</span> $ ck list -p emacs <span class="org-comment-delimiter"># </span><span class="org-comment">search the configs</span> $ ck search Hostname $ ck search <span class="org-string">"search term with spaces"</span> <span class="org-comment-delimiter"># </span><span class="org-comment">escape symbols</span> $ ck search <span class="org-string">\(</span> <span class="org-comment-delimiter"># </span><span class="org-comment">edit the primary config of emacs</span> $ ck edit emacs <span class="org-comment-delimiter"># </span><span class="org-comment">edit a non-primary config of ssh</span> $ ck e ssh authorized_keys <span class="org-comment-delimiter"># </span><span class="org-comment">edit a root config</span> $ sudo ck -c /home/ckuser e ssh sshd_config <span class="org-comment-delimiter"># </span><span class="org-comment">delete a program with all the configs</span> $ ck delete emacs <span class="org-comment-delimiter"># </span><span class="org-comment">or a specific config</span> $ ck del -c /home/ckuser/.emacs.d/init.el <span class="org-comment-delimiter"># </span><span class="org-comment">restore all links (on a new instalation)</span> $ ck restore all <span class="org-comment-delimiter"># </span><span class="org-comment">restore a program's links</span> $ ck r -p emacs <span class="org-comment-delimiter"># </span><span class="org-comment">get help for an action</span> $ ck h add $ ck --help e </pre> </div> </div> </div> </div> <div id="outline-container-org9df6fcc" class="outline-2"> <h2 id="manpage"><a id="org9df6fcc"></a>manpage</h2> <div class="outline-text-2" id="text-manpage"> <!-- Creator : groff version 1.22.3 --> <!-- CreationDate: Mon Oct 29 17:20:18 2018 --> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta name="generator" content="groff -Thtml, see www.gnu.org"> <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <meta name="Content-Style" content="text/css"> <style type="text/css"> p { margin-top: 0; margin-bottom: 0; vertical-align: top } pre { margin-top: 0; margin-bottom: 0; vertical-align: top } table { margin-top: 0; margin-bottom: 0; vertical-align: top } h1 { text-align: center } </style> <title>ck</title> </head> <body> <h1 align="center">ck</h1> <a href="#NAME">NAME</a><br> <a href="#SYNOPSIS">SYNOPSIS</a><br> <a href="#DESCRIPTION">DESCRIPTION</a><br> <a href="#CONFIGURATION">CONFIGURATION</a><br> <a href="#OPTIONS">OPTIONS</a><br> <a href="#ACTIONS">ACTIONS</a><br> <a href="#EXIT STATUS">EXIT STATUS</a><br> <a href="#FILES">FILES</a><br> <a href="#BUILD VALUES">BUILD VALUES</a><br> <a href="#VERSION">VERSION</a><br> <a href="#AUTHOR">AUTHOR</a><br> <hr> <h2>NAME <a name="NAME"></a> </h2> <p style="margin-left:11%; margin-top: 1em">ck − manage configuration across the system</p> <h2>SYNOPSIS <a name="SYNOPSIS"></a> </h2> <p style="margin-left:11%; margin-top: 1em"><b>ck</b> [<b>−v</b>|<b>−−verbose</b>] [<b>−c</b>|<b>−−config</b> <i>DIR</i>] <i>action </i>[...] <b><br> ck</b> [<b>version</b>|<b>−−version</b>] <b><br> ck init</b> <i>VERSION_CONTROL_DIR SECRET_DIR</i> <b><br> ck add</b> <i>PROGRAM_NAME CONFIG_PATH</i> [<b>−p</b>] [<b>−s</b>] <b><br> ck delete</b> <i>PROGRAM_NAME</i>|{<b>−c </b><i>CONFIG_PATH</i>} <b><br> ck list tree </b>[<b>−a</b>] [<b>−b</b>] <b><br> ck list</b> {<b>-p </b><i>PROGRAM_NAME</i>}|<b>programs</b>|<b>paths </b>[<b>−t</b> {<b>plain</b>|<b>python</b>|<b>lisp</b>}] [<b>−a</b>] [<b>−b</b>] <b><br> ck list ckconf <br> ck edit</b> <i>PROGRAM_NAME </i>[<i>CONFIG_BASENAME</i>] <b><br> ck search</b> <i>SEARCH_TERM</i> <b><br> ck restore</b> <i>PROGRAM_NAME</i>|<b>all <br> ck help</b> <i>action</i></p> <h2>DESCRIPTION <a name="DESCRIPTION"></a> </h2> <p style="margin-left:11%; margin-top: 1em"><i><b>ck</b></i> manages configuration files in a Linux system. To that end it provides an <b>action</b> based command line interface.</p> <p style="margin-left:11%; margin-top: 1em"><b>ck</b> needs a database and an rc file to run. It also needs two directories (stored in the rc file), the <i>VERSION_CONRTOL_DIR</i> and the <i>SECRET_DIR</i>. This is where the configurations will end up after they are added to <b>ck</b>. The <b>init</b> action takes care of them. For more details see the <b>ACTIONS </b>and <b>FILES</b> sections below.</p> <p style="margin-left:11%; margin-top: 1em">In <b>ck</b> terms a <i>program</i> is an entity that has one or more <i>configs</i> attached to it. Each <i>program</i> can have exactly one <b>primary </b><i>config</i>. Upon adding a <i>config</i> to <b>ck</b>, it is moved to the appropriate directory, and then symbolically linked back to it’s original place (<i>ln -s</i>).</p> <p style="margin-left:11%; margin-top: 1em">In a later time you can sync the <i>VERSION_CONRTOL_DIR</i> and <i>SECRET_DIR</i>. You can also <b>restore</b> the links given these two directories and the correspondig rc file and database.</p> <h2>CONFIGURATION <a name="CONFIGURATION"></a> </h2> <p style="margin-left:11%; margin-top: 1em"><b>ck</b> uses <b>sqlite</b> to index the configuration files. The <b>init action</b> by default creates a directory named <i>.ck</i> under <i>$HOME</i> in witch the <i>ckrc</i> and <i>ckdb</i> files reside. See the <b>FILES</b> section for more details.</p> <p style="margin-left:11%; margin-top: 1em">One can have multiple <b>config directories</b> with different configurations each. Using the <b>config </b>or <b>−c</b> option one can set the path in which ck will search for <i>ckrc</i> and <i>ckdb</i>. See the <b>OPTIONS</b> section for more details.</p> <h2>OPTIONS <a name="OPTIONS"></a> </h2> <p style="margin-left:11%; margin-top: 1em">Change <b>ck</b> behaviour using the following options. They must be present before any <b>action. <br> −−verbose</b>, <b>−v</b></p> <p style="margin-left:22%;">[WIP] <br> Currently prints the log. Must be the first argument in order to work.</p> <p style="margin-left:11%;"><b>−−config</b> <i>DIR</i>, <b>−c</b> <i>DIR</i></p> <p style="margin-left:22%;">Use <b>ckdb </b>and <b>ckrc</b> residing in <i>DIR</i> instead of the default <i>~/.ck/</i>.</p> <p style="margin-left:11%;"><b>−−version</b>, <b>version</b></p> <p style="margin-left:22%;">Print version and licence information, and quit.</p> <h2>ACTIONS <a name="ACTIONS"></a> </h2> <p style="margin-left:11%; margin-top: 1em">Each <b>action</b> has several aliases. The selected <b>action</b> must be after the <b>OPTIONS</b> if any. All available <b>actions</b> can be seen in the <b>SYNOPSIS</b> section above.</p> <p style="margin-left:11%; margin-top: 1em">Each <b>action</b> takes a number of arguments and flags.</p> <p style="margin-left:11%; margin-top: 1em"><b>Initialize ck</b> <br> Create the <b>ck</b> database (<i>ckdb</i>) and initialize it. Create the ck config file (<i>ckrc</i>) and add the directory paths to it.</p> <p style="margin-left:11%; margin-top: 1em"><b>USAGE</b></p> <p style="margin-left:14%;"><b>ck init</b> <i>VERSION_CONTROL_DIR SECRET_DIR</i></p> <p style="margin-left:11%; margin-top: 1em"><b>ALIASES</b></p> <p style="margin-left:14%;"><b>init</b>, <b>i</b>, <b>−i</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ARGUMENTS</b></p> <p style="margin-left:14%;"><i>VERSION_CONTROL_DIR</i></p> <p style="margin-left:17%;">The directory where <b>configs</b> will be stored by default. <b>File must exist</b>.</p> <p style="margin-left:14%; margin-top: 1em"><i>SECRET_DIR</i></p> <p style="margin-left:17%;">The directory where <b>configs</b> will be stored when using the <b>−s</b> flag in <b>add</b>. <b>File must exist</b>.</p> <p style="margin-left:11%; margin-top: 1em"><b>EXAMPLES</b></p> <p style="margin-left:14%;">$ ck init /home/ckuser/configs/vc home/ckuser/configs/sec <br> $ ck i configs/vc configs/sec</p> <p style="margin-left:11%; margin-top: 1em"><b>Add config</b> <br> Add a <b>config</b> to the database (<i>ckdb</i>). Each <b>config</b> belongs to a <b>program</b>. Every <b>program</b> can have multiple <b>configs</b> under it and one of them can be <b>primary</b>. The <b>edit action</b> will open the <b>primary config</b> by default.</p> <p style="margin-left:11%; margin-top: 1em"><b>USAGE</b></p> <p style="margin-left:14%;"><b>ck add</b> <i>PROGRAM_NAME CONFIG_PATH</i> [<b>−p</b>] [<b>−s</b>]</p> <p style="margin-left:11%; margin-top: 1em"><b>ALIASES</b></p> <p style="margin-left:14%;"><b>add</b>, <b>a</b>, <b>−a</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ARGUMENTS</b></p> <p style="margin-left:14%;"><i>PROGRAM_NAME</i></p> <p style="margin-left:17%;">The name of the <b>program</b> the <b>config</b> belongs at.</p> <p style="margin-left:14%; margin-top: 1em"><i>CONFIG_PATH</i></p> <p style="margin-left:17%;">Path to the <b>config</b>. Can be relative.</p> <p style="margin-left:11%; margin-top: 1em"><b>FLAGS</b></p> <p style="margin-left:14%;"><b>−s</b></p> <p style="margin-left:17%;">Mark the <b>config</b> as secret. It will be stored on the <i>SECRET_DIR</i>.</p> <p style="margin-left:14%; margin-top: 1em"><b>−p</b></p> <p style="margin-left:17%;">Mark the <b>config</b> as primary. The <b>edit action</b> will open this by default.</p> <p style="margin-left:11%; margin-top: 1em"><b>EXAMPLES</b></p> <p style="margin-left:14%;"># add emacs configs <br> ## primary config <br> $ ck add emacs ~/.emacs.d/orgconf.org -p <br> ## secret config, with passwords <br> $ ck add emacs ~/.emacs.d/accounts.org -s <br> ## another one for emacs <br> $ ck add emacs ~/.emacs.d/init.el</p> <p style="margin-left:11%; margin-top: 1em"><b>Delete config</b> <br> Delete a <b>config</b> or a <b>program</b> from the database (<i>ckdb</i>). This will not touch the actual file and link. It is up to the user to handle it.</p> <p style="margin-left:11%; margin-top: 1em"><b>USAGE</b></p> <p style="margin-left:14%;"><b>ck delete</b> <i>PROGRAM_NAME</i>|{<b>−c </b><i>CONFIG_PATH</i>}</p> <p style="margin-left:11%; margin-top: 1em"><b>ALIASES</b></p> <p style="margin-left:14%;"><b>delete</b>, <b>del</b>, <b>d</b>, <b>−d</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ARGUMENTS</b></p> <p style="margin-left:14%;"><i>PROGRAM_NAME</i></p> <p style="margin-left:17%;">Delete the <b>program</b> and all it’s <b>configs</b>.</p> <p style="margin-left:14%; margin-top: 1em"><b>−c </b><i>CONFIG_PATH</i></p> <p style="margin-left:17%;">Delete the <b>config</b>. This has to be the full path of the link as shown by the <b>list action</b>.</p> <p style="margin-left:11%; margin-top: 1em"><b>EXAMPLES</b> <br> $ ck delete emacs <br> $ ck del -c /home/ckuser/.emacs.d/init.el</p> <p style="margin-left:11%; margin-top: 1em"><b>List</b> <br> List programs, configs and ck configuration values.</p> <p style="margin-left:11%; margin-top: 1em"><b>USAGE</b></p> <p style="margin-left:14%;"><b>ck list tree </b>[<b>−a</b>] [<b>−b</b>] <b><br> ck list</b> {<b>-p </b><i>PROGRAM_NAME</i>}|<b>programs</b>|<b>paths </b>[<b>−t</b> {<b>plain</b>|<b>python</b>|<b>lisp</b>}] [<b>−a</b>] [<b>−b</b>] <b><br> ck list ckconf</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ALIASES</b></p> <p style="margin-left:14%;"><b>list</b>, <b>ls</b>, <b>l</b>, <b>-ls</b>, <b>−l</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ARGUMENTS</b></p> <p style="margin-left:14%;"><b>tree</b></p> <p style="margin-left:17%;">List <b>programs</b> with their <b>configs</b> in a tree like structure.</p> <p style="margin-left:14%; margin-top: 1em"><b>paths</b></p> <p style="margin-left:17%;">List all the <b>config</b> paths <b>ck</b> keeps track of.</p> <p style="margin-left:14%; margin-top: 1em"><b>programs</b></p> <p style="margin-left:17%;">List all the <b>programs ck</b> keeps track of.</p> <p style="margin-left:14%; margin-top: 1em"><b>−c </b><i>PROGRAM_NAME</i></p> <p style="margin-left:17%;">List all the <b>configs</b> of <i>PROGRAM_NAME</i>.</p> <p style="margin-left:14%; margin-top: 1em"><b>ckconf</b></p> <p style="margin-left:17%;">List the <b>ck</b> configuration values, like the <i>VERSION_CONTROL_DIR </i>and <i>SECRET_DIR</i>.</p> <p style="margin-left:11%; margin-top: 1em"><b>FLAGS</b></p> <p style="margin-left:14%;"><b>−t</b></p> <p style="margin-left:17%;">Set the type of the <b>list</b>. Can be either <b>plain</b> (the default) a simple list, <b>python</b> to print it like a python array or <b>lisp</b> to print it like a lisp list.</p> <p style="margin-left:14%; margin-top: 1em"><b>−a</b></p> <p style="margin-left:17%;">Add attributes to the listing (when aplicable). The attributes are <b>[s]</b> for <b>secret</b>, <b>[p]</b> for <b>primary</b> and <b>[root]</b> if the file is owned by the root user.</p> <p style="margin-left:14%; margin-top: 1em"><b>−b</b></p> <p style="margin-left:17%;">Print the <b>config</b> basename instead of the full path.</p> <p style="margin-left:11%; margin-top: 1em"><b>EXAMPLES</b></p> <p style="margin-left:14%;">$ ck list tree -a <br> $ ck list paths -t lisp <br> $ ck list programs -t python <br> $ ck list -p emacs</p> <p style="margin-left:11%; margin-top: 1em"><b>Edit configs</b> <br> Edit a <b>config</b> stored in <b>ck</b> with the <i>$EDITOR</i>. <b>Edit</b> will open the <b>primary config</b> of the <b>program</b>. If there is no <b>primary config</b> but the <b>program</b> only has one <b>config</b>, <b>edit</b> will open that. Whenever there is ambiguity, a list of possible <b>configs</b> will be shown.</p> <p style="margin-left:11%; margin-top: 1em"><b>USAGE</b></p> <p style="margin-left:14%;"><b>ck edit</b> <i>PROGRAM_NAME </i>[<i>CONFIG_BASENAME</i>]</p> <p style="margin-left:11%; margin-top: 1em"><b>ALIASES</b></p> <p style="margin-left:14%;"><b>edit</b>, <b>e</b>, <b>−e</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ARGUMENTS</b></p> <p style="margin-left:14%;"><i>PROGRAM_NAME</i></p> <p style="margin-left:17%;">The name of the <b>program</b> to be edited. If the <b>program</b> has only one <b>config</b> or you want to edit the <b>primary</b> one, no further action is required.</p> <p style="margin-left:14%; margin-top: 1em"><i>CONFIG_BASENAME</i></p> <p style="margin-left:17%;">The basename of the <b>config</b> to be edited. This has to follow the <b>program</b> name. It is only needed when editing a <b>config</b> other than the <b>primary</b> one.</p> <p style="margin-left:11%; margin-top: 1em"><b>EXAMPLES</b></p> <p style="margin-left:14%;">$ ck edit emacs <br> $ ck e tmux .tmux.conf</p> <p style="margin-left:11%; margin-top: 1em"><b>Search configs</b> <br> Grep through the configs. This <b>action</b> is equivalent to this:</p> <p style="margin-left:11%; margin-top: 1em">$ ck ls paths | xargs grep -H -n "search term"</p> <p style="margin-left:11%; margin-top: 1em">Thus for more advanced search through the <b>configs</b> one can use other programs and replace grep in the command above.</p> <p style="margin-left:11%; margin-top: 1em"><b>USAGE</b></p> <p style="margin-left:14%;"><b>ck search</b> <i>SEARCH_TERM</i></p> <p style="margin-left:11%; margin-top: 1em"><b>ALIASES</b></p> <p style="margin-left:14%;"><b>search</b>, <b>grep</b>, <b>s</b>, <b>−s</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ARGUMENTS</b></p> <p style="margin-left:14%;"><i>SEARCH_TERM</i></p> <p style="margin-left:17%;">The term you wish to search for. If it’s a phrase enclose it in "". If it’s a special character you can escape it with \ (backslash).</p> <p style="margin-left:11%; margin-top: 1em"><b>EXAMPLES</b></p> <p style="margin-left:14%;">$ ck search "search term" $ ck search "quire"</p> <p style="margin-left:11%; margin-top: 1em"><b>Restore configs</b> <br> Given a working <b>ck</b> instance (<i>ckdb</i> + <i>ckrc</i> + directories in <i>ckrc</i> with <b>configs</b>), <b>restore</b> shall recreate the links from the <b>config</b> directories in <i>ckrc</i> back to their corresponding position when added to <b>ck</b>. It is useful for copying <b>configs</b> to a new linux installation or <b>restoring</b> deleted links. It can either <b>restore</b> a specific <b>program</b> or all of them.</p> <p style="margin-left:11%; margin-top: 1em"><b>NOTE</b>: If <b>ck</b> tracks <b>configs</b> that are owned by root, simply running</p> <p style="margin-left:14%;">$ ck restore ...</p> <p style="margin-left:11%;">will fail due to permissions. To remedy this, <b>ck</b> will alter the <b>owner </b>and <b>group</b> of a link to match the one in the original <b>config</b> file. Thus, running</p> <p style="margin-left:14%;">$ sudo ck -c /home/ckuser/.ck restore ...</p> <p style="margin-left:11%;">will <b>restore</b> the root user’s links as it should and the user links will have the user as the owner instead of the root.</p> <p style="margin-left:11%; margin-top: 1em"><b>ck</b> checks that the <b>configs</b> exist and that the location for the link is avaliable before making any links. However, in the even that <b>symlink</b> fails for some other reason, the process will stop as is. The user will have to take care of the already created links, if that’s the case.</p> <p style="margin-left:11%; margin-top: 1em"><b>USAGE</b></p> <p style="margin-left:14%;"><b>ck restore</b> <i>PROGRAM_NAME</i>|<b>all</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ALIASES</b></p> <p style="margin-left:14%;"><b>restore</b>, <b>r</b>, <b>−r</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ARGUMENTS</b></p> <p style="margin-left:14%;"><i>PROGRAM_NAME</i></p> <p style="margin-left:17%;">The name of the <b>program</b> to be restored.</p> <p style="margin-left:14%; margin-top: 1em"><b>all</b></p> <p style="margin-left:17%;">Restore all <b>programs ck</b> keeps track of.</p> <p style="margin-left:11%; margin-top: 1em"><b>EXAMPLES</b></p> <p style="margin-left:14%;">$ ck restore all <br> $ ck restore -p emacs</p> <p style="margin-left:11%; margin-top: 1em"><b>Get help</b> <br> Get help for any given <b>action</b> from the command line.</p> <p style="margin-left:11%; margin-top: 1em"><b>USAGE</b></p> <p style="margin-left:14%;"><b>ck help</b> <i>action</i></p> <p style="margin-left:11%; margin-top: 1em"><b>ALIASES</b></p> <p style="margin-left:14%;"><b>help</b>, <b>h</b>, <b>−−help</b>, <b>-h</b>, <b>−?</b></p> <p style="margin-left:11%; margin-top: 1em"><b>ARGUMENTS</b></p> <p style="margin-left:14%;"><i>action</i></p> <p style="margin-left:17%;">Any <b>action alias</b> you wish to get help for.</p> <p style="margin-left:11%; margin-top: 1em"><b>EXAMPLES</b></p> <p style="margin-left:14%;">$ ck help add <br> $ ck h d <br> $ ck --help ls</p> <h2>EXIT STATUS <a name="EXIT STATUS"></a> </h2> <p style="margin-left:11%; margin-top: 1em"><b>ck</b> shall return 0 if the action was completed without an error, -1 otherwise</p> <h2>FILES <a name="FILES"></a> </h2> <p style="margin-left:11%; margin-top: 1em">By default <b>ck</b> will store it’s files in <i>~/.ck/</i>. Using the <b>−c</b>|<b>−−config</b> one can change this.</p> <p style="margin-left:11%; margin-top: 1em"><b>ck generated files</b> <i><br> ~/.ck/ckrc</i></p> <p style="margin-left:22%;">Store the configuration values (<i>VERSION_CONTROL_DIR</i> and <i>SECRET_DIR</i>).</p> <p style="margin-left:11%;"><i>~/.ck/ckdb</i></p> <p style="margin-left:22%;">SQLite3 database.</p> <p style="margin-left:11%; margin-top: 1em"><b>User files</b> <i><br> VERSION_CONTROL_DIR</i></p> <p style="margin-left:22%;">This is where the configuration files will end up by default. It’s value is set with the <b>init</b> action, but can be changed by editing <i>ckrc</i>.</p> <p style="margin-left:11%;"><i>SECRET_DIR</i></p> <p style="margin-left:22%;">This is where the configuration files will end up when adding them with the <b>-s</b> flag. It’s value is set with the <b>init</b> action, but can be changed by editing <i>ckrc</i>.</p> <h2>BUILD VALUES <a name="BUILD VALUES"></a> </h2> <p style="margin-left:11%; margin-top: 1em"><b>compiler</b>: @CMAKE_C_COMPILER@ <b><br> flags</b>: @CMAKE_C_FLAGS@</p> <h2>VERSION <a name="VERSION"></a> </h2> <p style="margin-left:11%; margin-top: 1em">ck version @ck_MAJOR_VERSION@.@ck_MINOR_VERSION@.@ck_PATCH_VERSION@</p> <h2>AUTHOR <a name="AUTHOR"></a> </h2> <p style="margin-left:11%; margin-top: 1em">gramanas</p> <hr> </body> </html> </div> </div> </div> <div id="postamble" class="status"> <p class="date">Created: 2018-10-29 Mon 17:20</p> <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p> </div> </body> </html>