<?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>