[![Tests](https://img.shields.io/github/workflow/status/guumaster/hostctl/Test)](https://github.com/guumaster/hostctl/actions?query=workflow%3ATest)
[![GitHub Release](https://img.shields.io/github/release/guumaster/hostctl.svg?logo=github&labelColor=262b30)](https://github.com/guumaster/hostctl/releases)
[![Go Report Card](https://goreportcard.com/badge/github.com/guumaster/hostctl)](https://goreportcard.com/report/github.com/guumaster/hostctl)
[![License](https://img.shields.io/github/license/guumaster/hostctl)](https://github.com/guumaster/hostctl/LICENSE)
# hostctl
> Manage your /etc/hosts like a pro!
This tool gives you more control over the use of your `hosts` file. You can have multiple profiles and enable/disable as you need.
## Why?
It is a tedious task to handle the `hosts` file by editing manually. With this tool you can automate some aspects to do it cleaner and quick.
## Installation
### Pre-built binary
Go to [release page](https://github.com/guumaster/hostctl/releases) and download the binary you need.
### Arch Linux
`hostctl` has an AUR package: .
You can install it using your [AUR helper](https://wiki.archlinux.org/index.php/AUR_helpers) of choice.
## Features
* Manage groups of host names by profile.
* Enable/disable complete profiles.
* add/remove groups of host names.
* add profiles directly from a `.etchosts` file that you can add to your vcs.
## Sample Usage
![sample usage](docs/hostctl.gif)
## Linux/Mac/Windows and permissions
The tool recognize your system and use the right hosts file, it will use `/etc/hosts` on Linux/Mac and `C:/Windows/System32/Drivers/etc/hosts` on Windows.
**SUDO/ADMIN**: You will need permissions for any action that modify hosts file, add `sudo` to the commands below when needed. If you are on windows, make sure you run it as administrator.
**WARNING**: it should work on any system. It's tested on Ubuntu and Windows 10. If you can confirm it works on other system, please let me know [here](https://github.com/guumaster/hostctl/issues/new).
## Usage
```
_ _ _____ _______ _______ _______ _______
|_____| | | |______ | | | |
| | |_____| ______| | |_____ | |_____
hostctl is a CLI tool to manage your hosts file with ease.
You can have multiple profiles, enable/disable exactly what
you need each time with a simple interface.
Usage:
hostctl [command]
Available Commands:
add Add content to a profile in your hosts file.
backup Creates a backup copy of your hosts file
disable Disable a profile from your hosts file.
enable Enable a profile on your hosts file.
help Help about any command
list Shows a detailed list of profiles on your hosts file.
remove Remove a profile from your hosts file.
restore Restore hosts file content from a backup file.
set Set content to a profile in your hosts file.
Flags:
-h, --help help for hostctl
--host-file string Hosts file path (default "/etc/hosts")
-p, --profile string Choose a profile
Use "hostctl [command] --help" for more information about a command.
```
### List profiles
`$> hostctl list`
```
// Output:
+---------+--------+----------------+----------------------------+
| PROFILE | STATUS | IP | DOMAIN |
+---------+--------+----------------+----------------------------+
| default | on | 127.0.0.1 | localhost |
| default | on | 127.0.1.1 | some-existing.local |
| default | on | ::1 | ip6-localhost |
+---------+--------+----------------+----------------------------+
| lite | on | 192.168.1.51 | jupyter.toolkit-lite.local |
+---------+--------+----------------+----------------------------+
| toolkit | on | 192.168.99.119 | app.toolkit.local |
| toolkit | on | 192.168.99.119 | gitea.toolkit.local |
| toolkit | on | 192.168.99.119 | jupyter.toolkit.local |
+---------+--------+----------------+----------------------------+
```
### Add new profile
You can store routing as a separate file and add it to the global hosts file when you need.
Say you have this routing file on any of your projects:
```
# File stored in /path/to/some/project/.etchosts
127.0.0.1 web.my-awesome-project.local
127.0.0.1 api.my-awesome-project.local
```
You can add that content as a profile with this command:
`$>hostctl set -p awesome --from /path/to/some/project/.etchosts `
```
// Output:
+---------+--------+----------------+------------------------------+
| PROFILE | STATUS | IP | DOMAIN |
+---------+--------+----------------+------------------------------+
| default | on | 127.0.0.1 | localhost |
| default | on | 127.0.1.1 | some-existing.local |
| default | on | ::1 | ip6-localhost |
+---------+--------+----------------+------------------------------+
| another | on | 192.168.1.51 | jupyter.toolkit-lite.local |
+---------+--------+----------------+------------------------------+
| awesome | on | 127.0.0.1 | web.my-awesome-project.local |
| awesome | on | 127.0.0.1 | api.my-awesome-project.local |
+---------+--------+----------------+------------------------------+
```
### Enable/Disable profile
You can enable/disable any profile, the routing will react to it state.
Disabling a profile does not remove the content from the hosts file, this way you can re-enable it later on.
`$> hostctl disable -p awesome`
```
// Output:
+---------+--------+----------------+------------------------------+
| PROFILE | STATUS | IP | DOMAIN |
+---------+--------+----------------+------------------------------+
...
+---------+--------+----------------+------------------------------+
| awesome | off | 127.0.0.1 | web.my-awesome-project.local |
| awesome | off | 127.0.0.1 | api.my-awesome-project.local |
+---------+--------+----------------+------------------------------+
```
`$> hostctl enable -p awesome`
```
// Output:
+---------+--------+----------------+------------------------------+
| PROFILE | STATUS | IP | DOMAIN |
+---------+--------+----------------+------------------------------+
...
+---------+--------+----------------+------------------------------+
| awesome | on | 127.0.0.1 | web.my-awesome-project.local |
| awesome | on | 127.0.0.1 | api.my-awesome-project.local |
+---------+--------+----------------+------------------------------+
```
### Remove a profile
If you want to completely remove a profile from the hosts file you can run:
`$> hostctl remove -p awesome`
```
// Output:
+---------+--------+----------------+------------------------------+
| PROFILE | STATUS | IP | DOMAIN |
+---------+--------+----------------+------------------------------+
| default | on | 127.0.0.1 | localhost |
| default | on | 127.0.1.1 | some-existing.local |
| default | on | ::1 | ip6-localhost |
+---------+--------+----------------+------------------------------+
| another | off | 192.168.1.51 | jupyter.toolkit-lite.local |
+---------+--------+----------------+------------------------------+
```
### Backup hosts file
You can save a copy of your hosts file with this command:
`hostctl backup --path /tmp/`
It would create a file `/tmp/hosts.20200314` with the content of your hosts file.
### Restore a hosts file
You can restore a previous backup of your hosts file with this command:
`hostctl restore --from /tmp/hosts.20200314`
It would **overwrite** your hosts file with the content of your backup.
### TODO
Features that I'd like to add:
* [ ] `hostctl from-k8s -n namespace`
* [ ] `hostctl from-minikube -n namespace`
* [ ] `hostctl set ip` IP [-p profile]
* [ ] `hostctl set domains` dom1,dom2,etc [-p profile]
* [ ] `hostctl add domains` dom1,dom2 [-p profile]
* [ ] `hostctl rm domains` dom1,dom2 [-p profile]
### References
* Dependencies:
* [spf13/cobra](https://github.com/spf13/cobra)
* [guumaster/tablewriter](https://github.com/guumaster/tablewriter)
* Inspiration:
* [txn2/txeh: CLI for /etc/hosts management](https://github.com/txn2/txeh)
### LICENSE
[MIT license](LICENSE)
### Author(s)
* [guumaster](https://github.com/guumaster)
## Contributors ✨
[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-)
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!