.TH ck 1 "2018-10-27" Linux "ck - the config keeper"
.SH NAME
ck \- manage configuration across the system
.SH SYNOPSIS
.SY ck
.OP \-v\fR|\fB\-\-verbose
.OP \-c\fR|\fB\-\-config DIR
.IR action \ [.\|.\|.]
.YS
.ns
.SY ck
.OP version\fR|\fB\-\-version
.YS
\" Init
.SY ck
.B init
.I VERSION_CONTROL_DIR SECRET_DIR
.YS
\" Add
.SY ck
.B add
.I PROGRAM_NAME CONFIG_PATH
.OP \-p
.OP \-s
.YS
\" Delete
.SY ck
.BI delete \ PROGRAM_NAME
.YS
.ns
.SY ck
.B delete \-c
.I CONFIG_PATH
.YS
\" List
.SY ck
.B list tree
.OP \-a
.OP \-b
.YS
.ns
.SY ck
.B list
.BI \-p \ PROGRAM_NAME
.OP \-t list-type
.OP \-a
.OP \-b
.YS
.ns
.SY ck
.B list
.B programs
.OP \-t list-type
.OP \-a
.OP \-b
.YS
.ns
.SY ck
.B list
.B paths
.OP \-t list-type
.OP \-a
.OP \-b
.YS
.ns
.SY ck
.B list ckconf
.YS
\" Edit
.SY ck
.B edit
.I PROGRAM_NAME
.RI [ CONFIG_BASENAME ]
.YS
\" Search
.SY ck
.B search
.I SEARCH_TERM
.YS
\" Restore
.SY ck
.B restore \-p
.I PROGRAM_NAME
.YS
.ns
.SY ck
.B restore all
.YS
\" Help
.SY ck
.BI help \ action
.YS
.SH DESCRIPTION
.B ck
manages configuration files in a Linux system. To that end it provides an
.B action
based command line interface.
.P
.B ck
needs a database and an rc file to run. It also needs two
directories (stored in the rc file), the
.I VERSION_CONRTOL_DIR
and the
.IR SECRET_DIR .
This is where the configurations will end up after they are added to
.BR ck .
The
.B init
action takes care of them. For more details see the
.BR ACTIONS \ and \ FILES
sections below.
.P
In
.B ck
terms a
.I program
is an entity that has one or more
.I configs
attached to it. Each
.I program
can have exactly one
.BI primary \ config \fR.
Upon adding a
.I config
to
.BR ck ,
it is moved to the appropriate directory, and then symbolically linked
back to it's original place (\fIln -s\fR).
.P
In a later time you can sync the
.I VERSION_CONRTOL_DIR
and
.IR SECRET_DIR .
You can also
.B restore
the links given these two directories and the correspondig rc file and database.
.SH CONFIGURATION
.B ck
uses
.B sqlite
to index the configuration files. The
.B init action
by default creates a directory named
.I .ck
under
.I $HOME
in witch the
.I ckrc
and
.I ckdb
files reside. See the
.B FILES
section for more details.
.P
One can have multiple
.B config directories
with different configurations each.
Using the
.BR config \ or \ \-c
option one can set the path
in which ck will search for
.I ckrc
and
.IR ckdb .
See the
.B OPTIONS
section for more details.
.P
.SH OPTIONS
Change
.B ck
behaviour using the following options. They must be present before any
.B action.
.TP
.B \-\-verbose\fR, \fB\-v
[WIP]
.br
Currently prints the log. Must be the first argument in order to work.
.TP
.B \-\-config \fIDIR\fR, \fB\-c \fIDIR
Use
.BR ckdb \ and \ ckrc
residing in
.I DIR
instead of the default
.IR ~/.ck/ .
.TP
.B \-\-version\fR, \fBversion
Print version and licence information, and quit.
.SH ACTIONS
Each
.B action
has several aliases. The selected
.B action
must be after the
.B OPTIONS
if any. All available
.B actions
can be seen in the
.B SYNOPSIS
section above.
.P
Each
.B action
takes a number of arguments and flags.
.SS "INITIALIZE"
Create the
.B ck
database
.RI ( ckdb )
and initialize it. Create the ck config file
.RI ( ckrc )
and add the directory paths to it.
.TP 2
.B USAGE
.ns
.RS 2
.SY ck
.B init
.I VERSION_CONTROL_DIR SECRET_DIR
.YS
.RE
.TP 2
.B ALIASES
.BR init , \ i , \ \-i
.TP 2
.B ARGUMENTS
.ns
.RS 2
.TP 21
.I VERSION_CONTROL_DIR
The directory where
.B configs
will be stored by default.
.B File must exist\fR.
.TP 21
.I SECRET_DIR
The directory where
.B configs
will be stored when using the
.B \-s
flag in
.B add\fR. \fBFile must exist\fR.
.RE
.TP 2
.B EXAMPLES
.EX
$ ck init /home/ckuser/configs/vc home/ckuser/configs/sec
$ ck i configs/vc configs/sec
.EE
.SS "ADD CONFIG"
Add a
.B config
to the database
.RI ( ckdb )\fR.
Each
.B config
belongs to a
.BR program .
Every \fBprogram\fR can have
multiple
.B configs
under it and one of them can be
.BR primary .
The
.B edit action
will open the
.B primary config
by default.
.TP 2
.B USAGE
.ns
.RS 2
.SY ck
.B add
.I PROGRAM_NAME CONFIG_PATH
.OP \-p
.OP \-s
.YS
.RE
.TP 2
.B ALIASES
.BR add , \ a , \ \-a
.TP 2
.B ARGUMENTS
.ns
.RS 2
.TP 21
.I PROGRAM_NAME
The name of the
.B program
the
.B config
belongs at.
.TP 21
.I CONFIG_PATH
Path to the
.BR config .
Can be relative.
.RE
.TP 2
.B FLAGS
.ns
.RS 2
.TP 21
.B \-s
Mark the
.B config
as secret. It will be stored
on the
.IR SECRET_DIR .
.TP 21
.B \-p
Mark the
.B config
as primary. The
.B edit action
will open this by default.
.RE
.TP 2
.B EXAMPLES
.EX
# add emacs configs
## primary config
$ ck add emacs ~/.emacs.d/orgconf.org -p
## secret config, with passwords
$ ck add emacs ~/.emacs.d/accounts.org -s
## another one for emacs
$ ck add emacs ~/.emacs.d/init.el
.EE
.SS "DELETE CONFIG"
Delete a
.B config
or a
.B program
from the database
.RI ( ckdb )\fR.
This will not touch the actual file and link. It is up to the user
to handle it.
.TP 2
.B USAGE
.ns
.RS 2
.SY ck
.BI delete \ PROGRAM_NAME
.YS
.ns
.SY ck
.B delete \-c
.I CONFIG_PATH
.YS
.RE
.TP 2
.B ALIASES
.BR delete , \ del , \ d , \ \-d
.TP 2
.B ARGUMENTS
.ns
.RS 2
.TP 21
.I PROGRAM_NAME
Delete the
.B program
and all it's
.BR configs .
.TP 21
.BI \-c \ CONFIG_PATH
Delete the
.BR config .
This has to be the full path of the link as shown by the
.B list action\fR.
.RE
.TP 2
.B EXAMPLES
.EX
$ ck delete emacs
$ ck del -c /home/ckuser/.emacs.d/init.el
.EE
.SS "LIST VALUES"
List programs, configs and ck configuration values.
.TP 2
.B USAGE
.ns
.RS 2
.SY ck
.B list tree
.OP \-a
.OP \-b
.YS
.ns
.SY ck
.B list
.BI \-p \ PROGRAM_NAME
.OP \-t list-type
.OP \-a
.OP \-b
.YS
.ns
.SY ck
.B list
.B programs
.OP \-t list-type
.OP \-a
.OP \-b
.YS
.ns
.SY ck
.B list
.B paths
.OP \-t list-type
.OP \-a
.OP \-b
.YS
.ns
.SY ck
.B list ckconf
.YS
.RE
.TP 2
.B ALIASES
.BR list , \ ls , \ l , \ -ls , \ \-l
.TP 2
.B ARGUMENTS
.ns
.RS 2
.TP 21
.B tree
List
.B programs
with their
.B configs
in a tree like structure.
.TP 21
.B paths
List all the
.B config
paths
.B ck
keeps track of.
.TP 21
.B programs
List all the
.B programs ck
keeps track of.
.TP 21
.BI \-c \ PROGRAM_NAME
List all the
.B configs
of
.IR PROGRAM_NAME .
.TP 21
.BI ckconf
List the
.B ck
configuration values, like the
.IR VERSION_CONTROL_DIR \ and \ SECRET_DIR .
.RE
.TP 2
.B FLAGS
.ns
.RS 2
.TP 21
.BI \-t \ type
Set the type of the
.BR list .
Can be either
.B plain
(the default) a simple list,
.B python
to print it like a python array or
.B lisp
to print it like a lisp list.
.TP 21
.B \-a
Show attributes to the listing (when aplicable).
These are
.B [s]
for
.BR secret ,
.B [p]
for
.B primary
and
.B [root]
if the file is owned by the root user.
.TP 21
.B \-b
Print the
.B config
basename instead of the full path.
.RE
.TP 2
.B EXAMPLES
.EX
$ ck list tree -a
$ ck list paths -t lisp
$ ck list programs -t python
$ ck list -p emacs
.EE
.SS "EDIT CONFIGS"
Edit a
.B config
stored in
.B ck
with the
.IR $EDITOR .
.B Edit
will open the
.B primary config
of the
.BR program .
If there is no
.B primary config
but the
.B program
only has one
.BR config ,
.B edit
will open that.
Whenever there is ambiguity, a list
of possible
.B configs
will be shown.
.TP 2
.B USAGE
.ns
.RS 2
.SY ck
.B edit
.I PROGRAM_NAME
.RI [ CONFIG_BASENAME ]
.YS
.RE
.TP 2
.B ALIASES
.BR edit , \ e , \ \-e
.TP 2
.B ARGUMENTS
.ns
.RS 2
.TP 21
.I PROGRAM_NAME
The name of the
.B program
to be edited. If the
.B program
has only one
.B config
or you want to edit the
.B primary
one, no further action is required.
.TP 21
.I CONFIG_BASENAME
The basename of the
.B config
to be edited. This has to follow the
.B program
name. It is only needed when editing a
.B config
other than the
.B primary
one.
.RE
.TP 2
.B EXAMPLES
.EX
$ ck edit emacs
$ ck e tmux .tmux.conf
.EE
.SS "SEARCH CONFIGS"
Grep through the configs. This
.B action
is equivalent to this:
.br
.RS 2
$ ck ls paths | xargs grep -H -n "search term"
.RE
.br
Thus for more advanced search through the
.B configs
one can use other programs and replace grep in the command above.
.TP 2
.B USAGE
.ns
.RS 2
.SY ck
.B search
.I SEARCH_TERM
.YS
.RE
.TP 2
.B ALIASES
.BR search , \ grep , \ s , \ \-s
.TP 2
.B ARGUMENTS
.ns
.RS 2
.TP 21
.I SEARCH_TERM
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).
.RE
.TP 2
.B EXAMPLES
.EX
$ ck search "search term"
$ ck search "\\(require"
.EE
.SS "RESTORE CONFIGS"
Given a working
.B ck
instance (\fIckdb \fR+ \fIckrc\fR + directories in \fIckrc\fR with
.BR configs ), \ restore
shall recreate the links from the
.B config
directories in
.I ckrc
back to their corresponding position when added to
.BR ck .
It is useful for copying
.B configs
to a new linux installation or
.B restoring
deleted links. It can either
.B restore
a specific
.B program
or all of them.
.P
.BR NOTE :
If
.B ck
tracks
.B configs
that are owned by root, simply running
.br
.RS 2
$ ck restore \.\.\.
.RE
.br
will fail due to permissions. To remedy this,
.B ck
will alter the
.BR owner \ and \ group
of a link to match the one in the original
.B config
file.
Thus, running
.RS 2
$ sudo ck -c /home/ckuser/.ck restore \.\.\.
.RE
will
.B restore
the root user's links as it should and the user links will have
the user as the owner instead of the root.
.P
.B ck
checks that the
.B configs
exist and that the location for the link
is avaliable before making any links. However, in the even that
.B symlink
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.
.TP 2
.B USAGE
.ns
.RS 2
.SY ck
.B restore \-p
.I PROGRAM_NAME
.YS
.ns
.SY ck
.B restore all
.YS
.RE
.TP 2
.B ALIASES
.BR restore , \ r , \ \-r
.TP 2
.B ARGUMENTS
.ns
.RS 2
.TP 21
.I PROGRAM_NAME
The name of the
.B program
to be restored.
.TP 21
.B all
Restore all
.B programs ck
keeps track of.
.RE
.TP 2
.B EXAMPLES
.EX
$ ck restore all
$ ck restore -p emacs
.EE
.SS "GET HELP"
Get help for any given
.B action
from the command line.
.TP 2
.B USAGE
.ns
.RS 2
.SY ck
.BI help \ action
.YS
.RE
.TP 2
.B ALIASES
.BR help , \ h , \ \-\-help , \ -h , \ \-?
.TP 2
.B ARGUMENTS
.ns
.RS 2
.TP 21
.I action
Any
.B action alias
you wish to get help for.
.RE
.TP 2
.B EXAMPLES
.EX
$ ck help add
$ ck h d
$ ck --help ls
.EE
.SH EXIT STATUS
.B ck
shall return 0 if the action was completed without an error, -1 otherwise
.SH FILES
By default
.B ck
will store it's files in
.IR ~/.ck/ .
Using the
.BR \-c | \-\-config
one can change this.
.SS "ck generated files"
.TP
.I ~/.ck/ckrc
Store the configuration values (\fIVERSION_CONTROL_DIR\fR and \fISECRET_DIR\fR).
.TP
.I ~/.ck/ckdb
SQLite3 database.
.SS "User files"
.TP
.I VERSION_CONTROL_DIR
This is where the configuration files will end up by default. It's value is set with the
.B init
action, but can be changed by editing
.IR ckrc .
.TP
.I SECRET_DIR
This is where the configuration files will end up when adding them with the
.B -s
flag. It's value is set with the
.B init
action, but can be changed by editing
.IR ckrc .
.SH BUILD VALUES
.BR compiler :
@CMAKE_C_COMPILER@
.br
.BR flags :
@CMAKE_C_FLAGS@
.SH VERSION
ck version @ck_MAJOR_VERSION@.@ck_MINOR_VERSION@.@ck_PATCH_VERSION@
.SH AUTHOR
gramanas