Initial commit
This commit is contained in:
parent
dfa10731da
commit
6691b62891
2 changed files with 139 additions and 0 deletions
33
README.md
Normal file
33
README.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
# Lincon - Link config files into a repository
|
||||
|
||||
Lincon is a script that helps you to manage configuration files of linux machines using a versioning system (like git).
|
||||
|
||||
Its two main functions are adding existing config files to your repository structure and deploying files from your repository to the system.
|
||||
|
||||
Lincon does NOT handle versioning for you. You could use git for example.
|
||||
|
||||
## Usage
|
||||
|
||||
To get started, create your config repository and copy the lincon script into it. In the following examples we assume that your repo is located in `/home/user/configs`.
|
||||
|
||||
Whenever you want to execute an operation with lincon, make sure that you are in your repositories root.
|
||||
|
||||
In order to add an existing config file to your repo, just call
|
||||
|
||||
```bash
|
||||
$ ./lincon add /etc/someprogram/whatever.conf
|
||||
```
|
||||
|
||||
Note that you always have to pass the absolute path to the script.
|
||||
|
||||
lincon now moves the config file to `/home/user/configs/etc/someprogram/whatever.conf` and creates a hardlink at `/etc/someprogram/whatever.conf`.
|
||||
|
||||
If you want to deploy a config file from your repo to the system, just call
|
||||
|
||||
```bash
|
||||
$ ./lincon deploy /etc/otherprogram/settings.conf
|
||||
```
|
||||
|
||||
The command will create a hardlink at `/etc/otherprogram/settings.conf`, which points to the file in your repository (in this case `/home/user/configs/etc/otherprogram/settings.conf`.
|
||||
|
||||
In case there is already a config file with the same name, the file will get backed up to `/etc/otherprogram/settings.conf.bak`.
|
106
lincon
Executable file
106
lincon
Executable file
|
@ -0,0 +1,106 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Check if two hardlinks point to same file
|
||||
aresame()
|
||||
{
|
||||
[ "$(ls -i $1 | awk '{print $1;}')" == "$(ls -i $2 | awk '{print $1;}')" ]
|
||||
}
|
||||
|
||||
hardlink()
|
||||
{
|
||||
ln $(readlink -f $1) $2;
|
||||
}
|
||||
|
||||
# Move $1 to $2
|
||||
pull()
|
||||
{
|
||||
mkdir -p $(dirname $2);
|
||||
mv $1 $2;
|
||||
}
|
||||
|
||||
# Pull $1 to $2 and link $2 into $1
|
||||
pulllink()
|
||||
{
|
||||
pull $1 $2
|
||||
hardlink $2 $1
|
||||
}
|
||||
|
||||
# Ask a question and return the answer
|
||||
y()
|
||||
{
|
||||
local yn;
|
||||
read -p "$1" yn;
|
||||
case "$yn" in
|
||||
y|Y ) return 0;;
|
||||
n|N ) return 1;;
|
||||
* ) return $(y "$1");;
|
||||
esac
|
||||
}
|
||||
|
||||
# Start of the script
|
||||
|
||||
if (( $# != 2 )); then
|
||||
echo "Usage: lincon <add|deploy> <path/to/file>"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
OPERATION=$1
|
||||
ORIG=$2
|
||||
BAK=$ORIG.orig
|
||||
TARGET=$(dirname "$0")$ORIG
|
||||
|
||||
case $OPERATION in
|
||||
|
||||
# Add a file to versioning
|
||||
add)
|
||||
# Error if original does not exist
|
||||
if [ ! -e $ORIG ]; then
|
||||
echo "Error: File $ORIG does not exist.";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
# There is already a file in the repo
|
||||
if [ -e $TARGET ]; then
|
||||
# File is already linked
|
||||
if aresame $ORIG $TARGET; then
|
||||
echo "File $ORIG is already versioned.";
|
||||
exit;
|
||||
fi
|
||||
# Repo contains different copy
|
||||
echo "Versioned copy of $ORIG already exists.";
|
||||
if ! y "Overwrite it (y/n)?"; then
|
||||
exit;
|
||||
fi
|
||||
fi
|
||||
pulllink $ORIG $TARGET
|
||||
echo "File $ORIG versioned."
|
||||
;;
|
||||
|
||||
# Link a file from repo
|
||||
deploy)
|
||||
# Check if versioned copy exists
|
||||
if [ ! -e $TARGET ]; then
|
||||
echo "Error: No versioned copy of $ORIG found.";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
# Backup any original files
|
||||
if [ -e $ORIG ]; then
|
||||
if aresame $ORIG $TARGET; then
|
||||
echo "File $ORIG is already versioned.";
|
||||
exit;
|
||||
else
|
||||
echo "Backup original file to $BAK.";
|
||||
mv $ORIG $BAK
|
||||
fi
|
||||
fi
|
||||
# Link it, baby!
|
||||
hardlink $TARGET $ORIG
|
||||
echo "File $ORIG deployed."
|
||||
;;
|
||||
*)
|
||||
echo "Usage: repoconf <add|deploy> <path/to/file>";
|
||||
exit 0;
|
||||
;;
|
||||
esac
|
||||
|
Loading…
Reference in a new issue