This repository has been archived on 2024-02-15. You can view files and clone it, but cannot push or open issues or pull requests.
config-mapper/README.md

151 lines
5.7 KiB
Markdown
Raw Normal View History

2022-02-26 01:33:44 +01:00
# config-mapper
`config-mapper` is CLI utility tool to help you manage your configuration between systems.
It provides a set of tools to load your configuration from a system, save it on a git repository and then save it to a new system. This configuration can be a set of files, folders or even dependencies.
## Usage
Before going any further, you need to create a repository to store your configuration. You can choose any supplier as long it's a git repository :).
When copying a file from your configuration repository to your system, it's performing a copy. If the file exists on the system, it's content will be replaced by your configuration's one.
The system is detected automatically. You just need to specify whether the related field in case of `files` or folders `sections` (fields: `darwin` | `linux`).
You can get a configuration template [here](https://raw.githubusercontent.com/DataHearth/config-mapper/main/.config-mapper.yml.template).
### Setup
Create a file called `.config-mapper.yml` in your `home` directory (it is the default search path for config-mapper).
If you wish to move it to another directory, you can have to choice to inform the tool. By either set an environment like this one: `CONFIG_MAPPER_CFG=/path/to/config/.config-mapper.yml`. Or by providing the `-c /path/to/config/.config-mapper.yml` flag to the tool.
Once the configuratio file created, run this command to initialize the repository localy:
```bash
config-mapper init
```
If the folder is already present and is a git directory, clone instruction will be ignored.
template for storage part:
```yaml
storage:
# Where will be the repository folder located ? [DEFAULT: MacOS($TMPDIR/config-mapper) | Linux(/tmp/config-mapper)]
location: /path/to/folder
git:
# * by default, if ssh dict is set with its keys filled, I'll try to clone with SSH
repository: git@github.com:DataHearth/my-config.git
basic-auth:
username: USERNAME
# * NOTE: if you're having trouble with error "authentication required", you should maybe use a token access
# * In some cases, it's due to 2FA authentication enabled on the git hosting provided
password: TOKEN
ssh:
# path can be relative and can contain environment variables
private-key: /path/to/private/key
passphrase: PASSPHRASE
```
### Save your configuration into your repository
Now that your repository is setup localy, you can sync your configuration into it by simply running this command:
```bash
config-mapper save
```
All defined files and folders will be copied inside your repository.
2022-06-02 18:02:33 +02:00
If you want to exclude one part of your configuration file (files, folders), you can use these flags to ignore them `--disable-files` `--disable-folders`. Note, package managers are disable by default. You can enable this option using the `--pkgs` flag.
2022-06-01 20:30:27 +02:00
You can also exclude files and folders from a given directory with a `.gitignore` like file named `.ignore`. Put it in the root directory of an included folder and add relative path to exclude (does not support glob for now). E.g:
```bash
Permissions Size User Date Modified Name
drwxr-xr-x - antoine 1 Jun 20:28 ../demo
.rw-r--r-- 12 antoine 1 Jun 20:28 ├── .ignore
drwxr-xr-x - antoine 1 Jun 20:28 ├── egg
.rw-r--r-- 0 antoine 1 Jun 20:28 │ └── bar.py
.rw-r--r-- 0 antoine 1 Jun 20:26 ├── example.py
drwxr-xr-x - antoine 1 Jun 20:27 └── foo
.rw-r--r-- 0 antoine 1 Jun 20:24 ├── bar
.rw-r--r-- 0 antoine 1 Jun 20:27 └── demo.py
```
`.ignore` content:
2022-06-02 18:02:33 +02:00
2022-06-01 20:30:27 +02:00
```
# bar file will be ignored
foo/bar
# egg folder will be ignore
egg
```
If `homebrew` is provided in the `installation-order` (default: `["apt", "homebrew"]`), it will override the `homebrew` field with all user installed packages (`brew leaves --installed-on-request`). The same principle will be implemented with `aptitude`.
template for your configuration:
```yaml
# NOTE: the $LOCATION if refering to the "storage.location" path. It'll be replaced automatically
# The left part of ":" is your repository location and right part when it should be on your system
files:
- darwin: "$LOCATION/macos/.zshrc:~/.zshrc"
linux: "$LOCATION/linux/.zshrc:~/.zshrc"
folders:
- darwin: "$LOCATION/macos/.config:~/.config"
linux: "$LOCATION/macos/.config:~/.config"
package-managers:
installation-order: ["homebrew"]
homebrew:
- bat
- hexyl
- fd
- hyperfine
- diskus
- jq
- k9s
- go
- starship
- exa
- httpie
- neovim
- nmap
- pinentry
- zsh
apt-get: []
```
### Load your configuration onto the system
Once your repository is populated with your configurations, you can now load them onto a new system by using:
```bash
config-mapper load
```
The same ignore flags are used in the `save` command.
2022-02-27 19:25:18 +01:00
## TO-DO
2022-06-02 18:02:33 +02:00
- [x] add `.ignore` file to ignore content inside directory
2022-06-02 19:53:41 +02:00
- [x] use remote configuration: SSH
2022-06-01 20:30:27 +02:00
- [ ] optimisation over speed and memory
2022-02-27 19:25:18 +01:00
- add more storage options
2022-04-07 21:49:56 +02:00
- [ ] smb storage
- [ ] nfs storage
- [ ] zip
2022-02-27 19:25:18 +01:00
2022-02-26 01:33:44 +01:00
## Known issues
- GitHub SSH repository url: `ssh: handshake failed: knownhosts: key mismatch`
Resolved by create a new primary key based on GitHub new GIT SSH standards ([issue](https://github.com/go-git/go-git/issues/411))
- Cloning from GitHub with `https BasicAuth` and 2FA activated: `authentication required`
Resolved by creating an access token and set it as password in configuration
2022-06-02 18:02:33 +02:00
- WSL might have a rough time with opened files by `homebrew` and throwing `Error: too many open files`.
[This thread](https://github.com/Homebrew/linuxbrew-core/issues/21139) discuss about this issue.
The workaround seems to be settings the filesystem limit (`ulimit -Hn && ulimit -Sn`) to the maximum value (which was 4096 on my machine).