Compare commits

...

135 Commits

Author SHA1 Message Date
William Melody 8916c43efa Add `.github` configuration. 2023-06-27 16:59:08 -07:00
William Melody 9ea716f861
Use two-step homebrew install in README. 2020-10-06 23:13:23 -07:00
William Melody 9a929dc70f Update to version 3.6.4 2020-09-11 18:22:23 -07:00
William Melody 80699292a4 Use 'entries' terminology consistently. 2020-09-11 17:46:18 -07:00
William Melody 06ad3e8deb Add exit status to `list` and associated subcommands. 2020-09-11 17:40:47 -07:00
William Melody c74671613b Improve exit status documentation. 2020-09-11 17:22:02 -07:00
William Melody 0201480ffb Group helper variables and functions in Helpers section. 2020-09-11 17:01:29 -07:00
William Melody 0ce875c210 Use `sed -i` via a `_sed_i()` wrapper. 2020-09-11 17:01:29 -07:00
William Melody 6a58eb693d
Update README 2020-08-23 13:34:58 -07:00
William Melody 245188025a Improve `realpath` / `readlink` handling. 2020-08-16 10:14:48 -07:00
William Melody 39a182b47e Update Usage: ordering in `backups`. 2020-06-08 09:49:36 -07:00
William Melody bd7edba09b Improve spacing and comments in subcommands. 2020-06-08 09:42:58 -07:00
William Melody 5049abe817 Use alpha ordering for subcommand handling in `backup`. 2020-06-08 09:36:16 -07:00
William Melody 5c87ad62b0 Update version to 3.6.3 2020-06-07 18:07:12 -07:00
William Melody ca51f3f742 Remove extra newline. 2020-06-07 18:05:18 -07:00
William Melody ade1109cba Add missing `_warn` statements. 2020-06-07 17:22:20 -07:00
William Melody 3c383581c5 Update version to 3.6.2 2020-06-07 17:17:00 -07:00
William Melody 2346f6f814 Add missing `_download_from()` function. 2020-06-07 17:15:51 -07:00
William Melody 0715b9ec66 Update version to 3.6.1 2020-06-07 15:42:50 -07:00
William Melody 42a2a9f3d4 Use `__` prefix for variables in loops. 2020-06-07 15:42:11 -07:00
William Melody c11f22e558 Update error message in `_main()`. 2020-06-07 15:38:29 -07:00
William Melody 0d5f41537d Fix spacing in option parsing. 2020-06-07 15:13:23 -07:00
William Melody 0a98202f84 Remove additional `_debug()` statement. 2020-06-07 15:06:29 -07:00
William Melody 040593bd51 Improve `_load_subcommands()`. 2020-06-07 15:04:45 -07:00
William Melody 0b79763874 Update Make install instructions. 2020-06-07 14:59:31 -07:00
William Melody d6e3a8a128 Update version to 3.6.0 2020-06-07 14:57:43 -07:00
William Melody 0fa9b240c6 Remove extra space in `_load_subcommands()`. 2020-06-07 14:51:12 -07:00
William Melody 83bb517312 Update help and README.md for `subcommands`. 2020-06-07 14:49:59 -07:00
William Melody d396c5eefb Fix order in `$_SUBCOMMANDS`. 2020-06-07 14:44:57 -07:00
William Melody 8ab47640f0 Rename `commands` to `subcommands`. 2020-06-07 14:44:10 -07:00
William Melody c3be802faf Fix function name in `_debug` statement. 2020-06-07 14:41:35 -07:00
William Melody 768acb5d80 Rename `$_DEFINED_COMMANDS` to `$_DEFINED_SUBCOMMANDS`. 2020-06-07 14:41:05 -07:00
William Melody 379f99f4e1 Rename `_load_commands()` to `_load_subcommands()`. 2020-06-07 14:40:03 -07:00
William Melody 28fea3a599 Rename global variable to `$HOSTS_DEFAULT_SUBCOMMAND`. 2020-06-07 14:39:18 -07:00
William Melody bf65fbcad8 Replace `$_CMD` with `$_SUBCOMMAND`. 2020-06-07 14:37:10 -07:00
William Melody 5d4a9dfb28 Remove extra comments in `_main()`. 2020-06-07 14:36:21 -07:00
William Melody 0bd86e533d Move program functions to bottom of script. 2020-06-07 14:29:41 -07:00
William Melody a39c60aafa Use curly braces for all `$_ME` variable references. 2020-06-07 14:18:20 -07:00
William Melody 1da838faeb Remove extra comment. 2020-06-07 14:17:02 -07:00
William Melody 6e1d408ad5 Improve header formatting. 2020-06-07 14:14:13 -07:00
William Melody c381c8bd98 Add MIT license text to header.
resolves gh-10
2020-06-07 14:11:15 -07:00
William Melody 426f2ed602 Improve global variable comments. 2020-06-07 14:04:37 -07:00
William Melody 7596a2901f Improve variable names in `_print_entries()`. 2020-06-07 14:00:28 -07:00
William Melody 4e9ad74697 Improve alignment. 2020-06-07 13:57:07 -07:00
William Melody 051e8b3840 Don't use quotes when assigning empty strings. 2020-06-07 13:54:21 -07:00
William Melody f585447612 Improve variable handling in `_print_entries()`. 2020-06-07 13:51:00 -07:00
William Melody 4238e8bd81 Add `completions` help to README.md 2020-06-07 13:45:14 -07:00
William Melody a64c20bdd8 Rearrange commands in script. 2020-06-07 13:43:04 -07:00
William Melody 5865f92977 Remove version from default help output. 2020-06-07 13:40:11 -07:00
William Melody 2b81ea530f Remove unused utility functions. 2020-06-07 13:39:01 -07:00
William Melody 1e6af9b309 Improve comment in `$_SED_I_COMMAND` assignment. 2020-06-07 13:38:17 -07:00
William Melody 47b5d51fa3 Remove unused helper functions. 2020-06-07 13:36:33 -07:00
William Melody d775353c9a Use quotes when assigning function name. 2020-06-07 13:35:21 -07:00
William Melody 73ecc3119e Clean up program option parsing section. 2020-06-07 13:34:00 -07:00
William Melody d242aed463 Remove obsolete `$_COMMAND_ARGV` variable. 2020-06-07 13:31:46 -07:00
William Melody 9bf7f782c9 Use improved `_contains()`. 2020-06-07 13:26:27 -07:00
William Melody f0ebb08cd4 Use improved `_join()`. 2020-06-07 13:25:03 -07:00
William Melody 4aeab14d2d Remove obsolete `_command_argv_includes()`. 2020-06-07 13:23:54 -07:00
William Melody 952e2465b3 Add `_warn()` and use in `completions`. 2020-06-07 13:20:33 -07:00
William Melody 23d6a1c653 Move completion installation into the main script. 2020-06-07 13:20:12 -07:00
William Melody 17b2615820 Improve header, with note about LICENSE.
gh-10
2020-06-07 13:19:43 -07:00
William Melody 68b421f95a Combine Environment and Globals. 2020-06-07 12:45:07 -07:00
William Melody a09e7b2468 Improve section dividers. 2020-06-07 12:40:44 -07:00
William Melody dfbc83e12c Improve `_debug()`. 2020-06-07 12:34:55 -07:00
William Melody fff87648d4 Update version to 3.5.1 2020-05-17 11:39:26 -07:00
William Melody 8f6a700909 Improve formatting in tests. 2020-05-17 11:33:57 -07:00
William Melody 1d948837d0 Use `_exit_1` with non-help error messages. 2020-05-17 11:28:31 -07:00
William Melody 8f2553b5a3 Add $_ERROR_PREFIX to test_helper.bash. 2020-05-17 11:25:28 -07:00
William Melody 2f6290f3d4 Quote arguments to `help`. 2020-05-17 11:24:38 -07:00
William Melody 16a672d52a Improve code formatting. 2020-05-17 11:10:12 -07:00
William Melody 16a95406fe Replace `return 1` with message with `_return_1`. 2020-05-17 11:03:24 -07:00
William Melody 5a7d0cca91 Replace `_die()` with `_exit_1()`. 2020-05-17 11:01:25 -07:00
William Melody 40be65b7da `_verify_write_permissions()` doesn't accept arguments. 2020-05-17 10:57:33 -07:00
William Melody affd8d8657 Use brackets in `_verify_write_permissions()`. 2020-05-17 10:55:36 -07:00
William Melody 6e751065de Improve `backups` argument handling. 2020-05-17 10:54:03 -07:00
William Melody 3e326dad13 Unenable shellcheck SC2183 for printf format string. 2020-05-17 10:37:51 -07:00
William Melody 6bde3438c6 Don't use $/${} with arithmetic variables.
ShellCheck SC2004
https://github.com/koalaman/shellcheck/wiki/SC2004
2020-05-17 10:34:59 -07:00
William Melody ca43d92d85 Remove unused variable. 2020-05-17 10:33:15 -07:00
William Melody bc06de7476 Update version to 3.5.0 2020-04-22 12:15:15 -07:00
William Melody 9dab3606c6 Add exit status documentation to README.md 2020-04-22 12:08:02 -07:00
William Melody 88030b8a51 Return `1` from `show` when entry not found.
GH-9
2020-04-22 12:07:35 -07:00
William Melody 5112c3e6a0 Use consistent terminology in function documentation.
GH-9
2020-04-22 12:07:22 -07:00
William Melody 2f5f610e3c Reformat exit status documentation.
GH-9
2020-04-22 12:07:13 -07:00
William Melody 815def022e Remove .gitignore.
GH-9
2020-04-22 12:06:57 -07:00
William Melody 59bb99ea34 Merge branch 'sleepyghost01-feature/add-exit-codes'
* sleepyghost01-feature/add-exit-codes:
  Add exit code documentation
2020-04-22 12:05:37 -07:00
William Melody 40b76d2e26 Update version to 3.4.3 2020-04-16 11:48:00 -07:00
William Melody bc6b16c014 Improve `hosts-completion` script locations. 2020-04-16 11:46:45 -07:00
Amin Mousavi a67e4c997b Add exit code documentation
Problem:
It's not clear in documentation which exit code will return for each command specially commands that might return 1 when there's no action to do.

Solution:
- All possible documentation has been added.
- .ignorefile has been missed which could cause problem for other contribution so I add one by help of https://www.gitignore.io
2020-04-16 12:11:40 +02:00
William Melody 4088591bb2 Update version to 3.4.2 2020-04-14 13:21:03 -07:00
William Melody 972dc9a752 Improve README.md 2020-04-14 13:17:18 -07:00
William Melody 95807387a1 Improve README.md 2020-04-14 13:16:29 -07:00
William Melody 952d848157 Update version to 3.4.1 2020-04-14 13:06:40 -07:00
William Melody 89b016999d Remove duplicate heading in README.md 2020-04-14 13:05:47 -07:00
William Melody 91946962a6 Fix heading level in README.md 2020-04-14 13:03:37 -07:00
William Melody 886599394e Update version to 3.4.0 2020-04-14 10:13:31 -07:00
William Melody 45b39d1bc7 Update README.md 2020-04-14 10:10:20 -07:00
William Melody 6159d3e35a Update etc/README.md title. 2020-04-14 10:05:59 -07:00
William Melody 3d65bccdb5 Manage completion with `scripts/hosts-completion`. 2020-04-14 09:26:53 -07:00
William Melody 8cbbdc3550 Add scripts, update README.md and package.json. 2020-04-13 21:39:39 -07:00
William Melody 9cbc6ddafb Update version to 3.3.3 2020-04-13 16:49:08 -07:00
William Melody 809bb45121 Update heading in README.md 2020-04-13 16:37:45 -07:00
William Melody 638da3200e Reconfigure completion setup. 2020-04-13 16:36:58 -07:00
William Melody cd3d9ef2b5 Update version to 3.3.2 2020-04-13 15:07:41 -07:00
William Melody b7394fe2d5 Update completions. 2020-04-13 15:01:13 -07:00
William Melody b9a257f5d5 Add Travis status image to README.md 2020-04-12 19:09:30 -07:00
William Melody ace77c9926 Modify temp handling for better portability. 2020-04-12 19:04:39 -07:00
William Melody 56a27a040e Remove executable permissions from backups.bats. 2020-04-12 18:49:52 -07:00
William Melody e88cd0b16a Match variable space in duplicate detection. 2020-04-12 16:52:47 -07:00
William Melody 7b8b4db54b Escape newlines consistently. 2020-04-12 16:50:30 -07:00
William Melody 16c7484c17 Improve test failure messages. 2020-04-12 16:09:12 -07:00
William Melody c41b0ada74 Move documentation comment to more logical position. 2020-04-12 15:39:18 -07:00
William Melody b8c4ec06b9 Add .travis.yml 2020-04-12 15:34:56 -07:00
William Melody 5bb8add6de Update version to 3.3.1 2020-04-08 21:42:38 -07:00
William Melody 33c5aa1c3c Modify example in README.md 2020-04-08 21:36:52 -07:00
William Melody c14c1a5213 Avoid `less` in `backups show`. 2020-04-08 21:29:57 -07:00
William Melody c23a00bc49 Add walkthrough to README.md 2020-04-08 21:26:21 -07:00
William Melody fb67d7b510 Just use `diff` in `backups compare`. 2020-04-08 21:25:01 -07:00
William Melody 7fc3b994b4 Update version to 3.3.0 2020-04-08 18:01:24 -07:00
William Melody ce605e8c0c Add `delete` alias for `remove`. 2020-04-08 17:58:05 -07:00
William Melody d772e7c13e Avoid long lines in README.md 2020-04-08 17:47:53 -07:00
William Melody 7301dc38f1 Improve option parsing and command detection. 2020-04-08 17:44:51 -07:00
William Melody 5d9f876b13 Improve `add` formatting. 2020-04-08 17:27:11 -07:00
William Melody 902c996b3b Improve output formatting. 2020-04-08 16:43:07 -07:00
William Melody 3a810cf384 Update version to 3.2.5 2020-03-30 17:44:14 -07:00
William Melody 5916a18908 Avoid relying on `hosts` being in `$PATH`.
gh-8
2020-03-30 17:41:51 -07:00
William Melody b44b69f83d Use simpler homebrew install command in README.md. 2020-03-24 15:03:40 -07:00
William Melody 3ccfbb5bc1 Update version to 3.2.4 2020-03-23 17:54:20 -07:00
William Melody f67a88af94 Add URL to help text. 2020-03-23 17:52:58 -07:00
William Melody c864eff0ec Update version to 3.2.3 2020-03-18 12:04:42 -07:00
William Melody 925de9dca5 Update GitHub username.
alphabetum -> xwmx
2020-03-18 12:02:45 -07:00
William Melody 9f0c3d1773 Update keywords in package.json. 2020-03-17 11:01:11 -07:00
William Melody e9a7ecd6a7 Update version to 3.2.2 2020-03-16 22:36:18 -07:00
William Melody 85c1b7d436 Tweak keyword in package.json. 2020-03-16 22:35:43 -07:00
William Melody 0f3c59bd86 Rename `SED_COMMAND` variable to `_SED_I_COMMAND`. 2020-03-16 20:46:34 -07:00
William Melody 0a39dfe693 Add keywords to package.json. 2020-03-16 15:28:26 -07:00
26 changed files with 1918 additions and 897 deletions

2
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,2 @@
github: xwmx
custom: https://paypal.me/WilliamMelody

84
.github/workflows/tests.yml vendored Normal file
View File

@ -0,0 +1,84 @@
###############################################################################
# .github/workflows/tests.yml
#
# NOTE: GitHub Actions does not allocate a TTY, preventing detection of
# piped input using `[[ -t 0 ]]`.
#
# More information:
#
# https://github.com/actions/runner/issues/241
#
# faketty is a GitHub action that uses work-arounds to provide a tty:
#
# https://github.com/marketplace/actions/faketty
#
# Scripts used by faketty for each platform:
#
# linux: `faketty`
#
# ```bash
# #!/bin/bash
#
# script -q -e -c "$*"
# ```
#
# win32: `faketty.ps1`
#
# ```posh
# Invoke-Expression "$args"
# ```
#
# darwin: `faketty`
#
# requires: `brew install expect`
#
# ```bash
# #!/bin/bash
#
# unbuffer $*
# ```
###############################################################################
name: "hosts · Test Suite"
on:
pull_request:
branches: [ master ]
push:
branches: [ master ]
workflow_dispatch:
jobs:
test-macos-11:
name: "Test: macOS Big Sur 11.0"
runs-on: macos-11.0
steps:
- uses: actions/checkout@v3
- name: "Setup"
run: |
brew update
brew install bats-core
brew install expect
- name: "Set $TERM=xterm"
run: printf "TERM=xterm\\n" >> $GITHUB_ENV
- name: "Run bats tests"
run: unbuffer bats test
test-ubuntu-latest:
name: "Test: Ubuntu Latest"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: "Setup"
run: |
sudo apt-get update
sudo apt-get install bats -y
- name: "Install bats-core"
run: |
git clone https://github.com/bats-core/bats-core.git "${HOME}/bats-core" &&
cd "${HOME}/bats-core"
git checkout 2e2e5df6adf0b846b411b6b2f7bb654cbc3e2c4e
sudo ./install.sh /usr/local
- name: "Set $TERM=xterm"
run: printf "TERM=xterm\\n" >> $GITHUB_ENV
- name: "Run bats tests"
run: script -q -e -c "bats test"

View File

@ -5,6 +5,14 @@
# https://github.com/koalaman/shellcheck/wiki/Ignore
###############################################################################
# Disable SC2183
#
# Running into this: https://github.com/koalaman/shellcheck/issues/1310
# TODO: Check if resolved.
#
#https://github.com/koalaman/shellcheck/wiki/SC2183
disable=SC2183
# Disable SC2206 and SC2207
#
# `IFS` and `noglob` are set.

View File

@ -3,6 +3,8 @@ PREFIX ?= /usr/local
install:
install $(BIN) $(PREFIX)/bin
./$(BIN) completions install
uninstall:
rm -f $(PREFIX)/bin/$(BIN)
./$(BIN) completions uninstall

454
README.md
View File

@ -1,3 +1,5 @@
[![Build Status](https://img.shields.io/github/actions/workflow/status/xwmx/hosts/tests.yml?branch=master)](https://github.com/xwmx/hosts/actions)
__ __
/ /_ ____ _____/ /______
/ __ \/ __ \/ ___/ __/ ___/
@ -6,9 +8,15 @@
# Hosts
`hosts` is a command line program for managing [hosts file](https://en.wikipedia.org/wiki/Hosts_\(file\)) entries.
`hosts` is a command line program for managing
[hosts file](https://en.wikipedia.org/wiki/Hosts_\(file\)) entries.
`hosts` works with existing hosts files and entries, making it easier to add, remove, comment, and search hosts file entries using simple, memorable commands.
`hosts` works with existing hosts files and entries, making it easier to add,
remove, comment, and search hosts file entries using simple, memorable
commands.
`hosts` is designed to be lightweight, easy to use, and contained in a
single, portable script that can be `curl`ed into any environment.
## Installation
@ -17,7 +25,8 @@
To install with [Homebrew](http://brew.sh/):
```bash
brew tap alphabetum/taps && brew install alphabetum/taps/hosts
brew tap xwmx/taps
brew install hosts
```
### npm
@ -33,29 +42,297 @@ npm install --global hosts.sh
To install with [bpkg](https://github.com/bpkg/bpkg):
```bash
bpkg install alphabetum/hosts
bpkg install xwmx/hosts
```
### Make
To install with [Make](https://en.wikipedia.org/wiki/Make_(software)),
clone this repository, navigate to the clone's root directory, and run:
```bash
sudo make install
```
### Manual
To install manually, simply add the `hosts` script to your `$PATH`. If
you already have a `~/bin` directory, you can use the following command:
To install as an administrator, copy and paste one of the following multi-line
commands:
```bash
curl -L https://raw.github.com/alphabetum/hosts/master/hosts \
-o ~/bin/hosts && chmod +x ~/bin/hosts
# install using wget
sudo wget https://raw.github.com/xwmx/hosts/master/hosts -O /usr/local/bin/hosts &&
sudo chmod +x /usr/local/bin/hosts &&
sudo hosts completions install
# install using curl
sudo curl -L https://raw.github.com/xwmx/hosts/master/hosts -o /usr/local/bin/hosts &&
sudo chmod +x /usr/local/bin/hosts &&
sudo hosts completions install
```
A package for Arch users is also [available in the AUR](https://aur.archlinux.org/packages/hosts/).
###### User-only Installation
To install with just user permissions, simply add the `hosts` script to your
`$PATH`. If you already have a `~/bin` directory, for example, you can use
one of the following commands:
```bash
# download with wget
wget https://raw.github.com/xwmx/hosts/master/hosts -O ~/bin/hosts && chmod +x ~/bin/hosts
# download with curl
curl -L https://raw.github.com/xwmx/hosts/master/hosts -o ~/bin/hosts && chmod +x ~/bin/hosts
```
Installing with just user permissions doesn't install the completions, but
`hosts` works without them. If you have `sudo` access and want to install the
completion scripts, run the following command:
```bash
sudo hosts completions install
```
### Arch Linux
A package for Arch users is also
[available in the AUR](https://aur.archlinux.org/packages/hosts/).
### Tab Completion
Bash and Zsh tab completion is enabled when `hosts` is installed using
Homebrew, npm, bpkg, or Make. If you are installing `hosts` manually,
[completion can be enabled with a few commands](etc/README.md).
## Usage
### Listing Entries
`hosts` with no arguments lists the entries in the system's hosts file:
```bash
> hosts
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
```
`hosts` called with a string or regular expression will search for entries
that match.
```bash
> hosts localhost
127.0.0.1 localhost
::1 localhost
fe80::1%lo0 localhost
> hosts '\d\d\d'
127.0.0.1 localhost
255.255.255.255 broadcasthost
```
### Adding Entries
To add an entry, use `hosts add`:
```bash
> hosts add 127.0.0.1 example.com
Added:
127.0.0.1 example.com
```
Run `hosts` or `hosts list` to see the new entry in the list:
```bash
> hosts
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
127.0.0.1 example.com
```
### Removing Entries
To remove an entry, use `hosts remove`, which can take an IP
address, domain, or regular expression:
```bash
> hosts remove example.com
Removing the following entries:
127.0.0.1 example.com
Are you sure you want to proceed? [y/N] y
Removed:
127.0.0.1 example.com
```
### Blocking and Unblocking Domains
`hosts` provides easy commands for blocking and unblocking domains with IPv4
and IPv6 entries:
```bash
> hosts block example.com
Added:
127.0.0.1 example.com
Added:
fe80::1%lo0 example.com
Added:
::1 example.com
> hosts unblock example.com
Removed:
127.0.0.1 example.com
Removed:
fe80::1%lo0 example.com
Removed:
::1 example.com
```
### Enabling / Disabling Entries
All entries are enabled by default. Disabiling an entry comments it out
so it has no effect, but remains in the hosts file ready to be enabled
again.
```bash
> hosts
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
127.0.0.1 example.com
> hosts disable example.com
Disabling:
127.0.0.1 example.com
> hosts
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
Disabled:
---------
127.0.0.1 example.com
> hosts enable example.com
Enabling:
127.0.0.1 example.com
> hosts
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
127.0.0.1 example.com
```
### Backups
Create backups of your hosts file with `hosts backups create`:
```bash
> hosts backups create
Backed up to /etc/hosts--backup-20200101000000
```
List your backups with `hosts backups`. If you have existing hosts file
backups, `hosts` will include them:
```bash
> hosts backups
hosts--backup-20200101000000
hosts.bak
```
`hosts backups compare` will open your hosts file with `diff`:
```bash
> hosts backups compare hosts--backup-20200101000000
--- /etc/hosts 2020-01-01 00:00:00.000000000
+++ /etc/hosts--backup-20200101000000 2020-01-01 00:00:00.000000000
@@ -8,3 +8,4 @@
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
+127.0.0.1 example.com
```
View a backup with `hosts backups show`:
```bash
> hosts backups show hosts--backup-20200101000000
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
127.0.0.1 example.com
```
Restore a backup with `hosts backups restore`. Before a backup is
restored, a new one is created to avoid data loss:
```bash
> hosts backups restore hosts--backup-20200101000000
Backed up to /etc/hosts--backup-20200102000001
Restored from backup: hosts--backup-20200101000000
```
### Viewing and Editing `/etc/hosts` Directly
`hosts file` prints the raw contents of `/etc/hosts`:
```bash
> hosts file
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
```
`hosts edit` opens `/etc/hosts` in your editor:
```bash
> hosts edit
```
### `--auto-sudo`
When the `--auto-sudo` flag is used, all write operations that require
`sudo` will automatically rerun the command using `sudo` when the current user
does not have write permissions for the hosts file.
To have this option always enabled, add the following line to your shell
configuration (`.bashrc`, `.zshrc`, or similar):
```bash
alias hosts="hosts --auto-sudo"
```
## Help
```text
Usage:
hosts [<search string>]
hosts add <ip> <hostname> [<comment>]
hosts backups [create | [compare | delete | restore | show] <filename>]
hosts backups [create | (compare | delete | restore | show) <filename>]
hosts block <hostname>...
hosts completions (check | install [-d | --download] | uninstall)
hosts disable (<ip> | <hostname> | <search string>)
hosts disabled
hosts edit
@ -65,6 +342,7 @@ Usage:
hosts list [enabled | disabled | <search string>]
hosts search <search string>
hosts show (<ip> | <hostname> | <search string>)
hosts subcommands [--raw]
hosts remove (<ip> | <hostname> | <search string>) [--force]
hosts unblock <hostname>...
hosts --auto-sudo
@ -92,7 +370,29 @@ For help with a particular command, try:
hosts help <command name>
```
## Commands
## Subcommands
<p align="center">
<a href="#hosts-1">(default)</a>
<a href="#hosts-add">add</a>
<a href="#hosts-backups">backups</a>
<a href="#hosts-block">block</a>
<a href="#hosts-completions">completions</a>
<a href="#hosts-disable">disable</a>
<a href="#hosts-disabled">disabled</a>
<a href="#hosts-edit">edit</a>
<a href="#hosts-enable">enable</a>
<a href="#hosts-enabled">enabled</a>
<a href="#hosts-file">file</a>
<a href="#hosts-help">help</a>
<a href="#hosts-list">list</a>
<a href="#hosts-remove">remove</a>
<a href="#hosts-search">search</a>
<a href="#hosts-show">show</a>
<a href="#hosts-subcommands">subcommands</a>
<a href="#hosts-unblock">unblock</a>
<a href="#hosts-version">version</a>
</p>
### `hosts`
@ -102,7 +402,7 @@ Usage:
Description:
List the existing IP / hostname pairs, optionally limited to a specified
state. When provided with a seach string, all matching enabled records will
state. When provided with a seach string, all matching enabled entries will
be printed.
Alias for `hosts list`
@ -116,6 +416,10 @@ Usage:
Description:
Add a given IP address and hostname pair, along with an optional comment.
Exit status:
0 Entry successfully added.
1 Invalid parameters or entry exists.
```
### `hosts backups`
@ -133,14 +437,19 @@ Subcommands:
backups List available backups.
backups create Create a new backup of the hosts file.
backups compare Compare a backup file with the current hosts file.
The diff tool configured for git will be used if
one is set.
backups delete Delete the specified backup.
backups restore Replace the contents of the hosts file with a
specified backup. The hosts file is automatically
backed up before being overwritten unless the
'--skip-backup' flag is specified.
backups show Show the contents of the specified backup file.
Description:
Manage backups.
Exit status:
0 Success.
1 Invalid parameters or backup not found.
```
### `hosts block`
@ -152,6 +461,10 @@ Usage:
Description:
Block one or more hostnames by adding new entries assigned to `127.0.0.1`
for IPv4 and both `fe80::1%lo0` and `::1` for IPv6.
Exit status:
0 <hostname> successfully blocked.
1 Invalid parameters or entry exists.
```
#### Blocklists
@ -159,17 +472,22 @@ Description:
- [jmdugan/blocklists](https://github.com/jmdugan/blocklists)
- [notracking/hosts-blocklists](https://github.com/notracking/hosts-blocklists)
### `hosts commands`
### `hosts completions`
```text
Usage:
hosts commands [--raw]
hosts completions (check | install [-d | --download] | uninstall)
Options:
--raw Display the command list without formatting.
-d, --download Download the completion scripts and install.
Description:
Display the list of available commands.
Manage completion scripts. For more information, visit:
https://github.com/xwmx/hosts/blob/master/etc/README.md
Exit status:
0 Completions successfully installed.
1 Invalid parameters or other error.
```
### `hosts disable`
@ -179,8 +497,12 @@ Usage:
hosts disable (<ip> | <hostname> | <search string>)
Description:
Disable one or more records based on a given ip address, hostname, or
Disable one or more entries based on a given ip address, hostname, or
search string.
Exit status:
0 Entry successfully disabled.
1 Invalid parameters or entry not found.
```
### `hosts disabled`
@ -190,7 +512,11 @@ Usage:
hosts disabled
Description:
List all disabled records. This is an alias for `hosts list disabled`.
List all disabled entries. This is an alias for `hosts list disabled`.
Exit status:
0 One or more disabled entries found.
1 Invalid parameters or no disabled entries found.
```
### `hosts edit`
@ -210,8 +536,12 @@ Usage:
hosts enable (<ip> | <hostname> | <search string>)
Description:
Enable one or more disabled records based on a given ip address, hostname,
Enable one or more disabled entries based on a given ip address, hostname,
or search string.
Exit status:
0 Entry successfully enabled.
1 Invalid parameters or entry not found.
```
### `hosts enabled`
@ -221,7 +551,11 @@ Usage:
hosts enabled
Description:
List all enabled records. This is an alias for `hosts list enabled`.
List all enabled entries. This is an alias for `hosts list enabled`.
Exit status:
0 One or more enabled entries found.
1 Invalid parameters or no enabled entries found.
```
### `hosts file`
@ -252,8 +586,12 @@ Usage:
Description:
List the existing IP / hostname pairs, optionally limited to a specified
state. When provided with a seach string, all matching enabled records will
state. When provided with a seach string, all matching enabled entries will
be printed.
Exit status:
0 One or more matching entries found.
1 Invalid parameters or entry not found.
```
### `hosts remove`
@ -267,9 +605,13 @@ Options:
--force Skip the confirmation prompt.
Description:
Remove one or more records based on a given IP address, hostname, or search
string. If an IP and hostname are both provided, only records matching the
Remove one or more entries based on a given IP address, hostname, or search
string. If an IP and hostname are both provided, only entries matching the
IP and hostname pair will be removed.
Exit status:
0 Entry successfully removed.
1 Invalid parameters or entry not found.
```
### `hosts search`
@ -280,6 +622,10 @@ Usage:
Description:
Search entries for <search string>.
Exit status:
0 One or more matching entries found.
1 Invalid parameters or entry not found.
```
### `hosts show`
@ -290,6 +636,23 @@ Usage:
Description:
Print entries matching a given IP address, hostname, or search string.
Exit status:
0 One or more matching entries found.
1 Invalid parameters or entry not found.
```
### `hosts subcommands`
```text
Usage:
hosts subcommands [--raw]
Options:
--raw Display the subcommands list without formatting.
Description:
Display the list of available subcommands.
```
### `hosts unblock`
@ -300,6 +663,10 @@ Usage:
Description:
Unblock one or more hostnames by removing the entries from the hosts file.
Exit status:
0 <hostname> successfully unblocked.
1 Invalid parameters or entry not found
```
### `hosts version`
@ -312,37 +679,16 @@ Description:
Display the current program version.
```
## Options
### `--auto-sudo`
When specified, all write operations that require `sudo` will automatically
rerun the command using `sudo` when the current user does not have write
permissions for the hosts file.
To have this option always enabled, add the following line to your shell
configuration (`.bashrc`, `.zshrc`, or similar):
```bash
alias hosts="hosts --auto-sudo"
```
### `-h` `--help`
Display help information.
### `--version`
Display version information.
## Tests
To run the test suite, install [Bats](https://github.com/sstephenson/bats) and
To run the [test suite](test), install [Bats](https://github.com/sstephenson/bats) and
run `bats test` in the project root directory.
## Acknowledgements
- https://gist.github.com/nddrylliog/1368532
- https://gist.github.com/dfeyer/1369760
- https://github.com/macmade/host-manager
---
<p align="center">
Copyright (c) 2015-present William Melody • See LICENSE for details.
</p>
<p align="center">
<a href="https://github.com/xwmx/hosts">github.com/xwmx/hosts</a>
</p>

113
etc/README.md Normal file
View File

@ -0,0 +1,113 @@
# `hosts` Tab Completion
## Homebrew
Installing via Homebrew with `brew install xwmx/taps/hosts` will also
install the completion scripts.
A one-time setup might be needed to [enable completion for all Homebrew
programs](https://docs.brew.sh/Shell-Completion).
## npm, bpkg, Make
When `hosts` is installed with `npm`, `bpkg`, or Make, an install hook will
check the environment and attempt to install completions. If it's successful,
you should see a message similar to:
```bash
Completion installed: /usr/local/etc/bash_completion.d/hosts
Completion installed: /usr/local/share/zsh/site-functions/_hosts
```
If completion is working after installing through any of these methods, then
you don't need to do anything else.
## `hosts completions`
The `hosts completions` subcommand can be used for installing and uninstalling
completion scripts. Depending on your configuration, you might need to use
`sudo` to install completion scripts easily:
```bash
> sudo hosts completions check
Completion scripts not found.
> sudo hosts completions install
Completion script installed: /usr/share/bash-completion/completions/hosts
Completion script installed: /usr/local/share/zsh/site-functions/_hosts
> sudo hosts completions check
Exists: /usr/share/bash-completion/completions/hosts
Exists: /usr/local/share/zsh/site-functions/_hosts
> sudo hosts completions uninstall
Completion script removed: /usr/share/bash-completion/completions/hosts
Completion script removed: /usr/local/share/zsh/site-functions/_hosts
```
If you installed `hosts` manually by downloading just the `hosts` script,
the completion scripts won't be immediately available for
`hosts completions install`. You can try installing the completions with
the `--download` flag, which will get the latest version from GitHub:
```bash
sudo hosts completions install --download
```
`hosts completions` will try to determine the completion script directories
from your environment. If `hosts completions` isn't able to install
the completion scripts, you can try installing them manually.
## Manual Installation
### bash
#### Linux
On a current Linux OS (in a non-minimal installation), bash completion should
be available.
Place the completion script in `/etc/bash_completion.d/`:
```bash
sudo curl -L https://raw.githubusercontent.com/xwmx/hosts/master/hosts-completion.bash -o /etc/bash_completion.d/hosts
```
#### macOS
If you aren't installing with homebrew, source the completion script in
`.bash_profile`:
```sh
if [[ -f /path/to/hosts-completion.bash ]]
then
source /path/to/hosts-completion.bash
fi
```
### zsh
Place the completion script in your `/path/to/zsh/completion` (typically
`~/.zsh/completion/`):
```bash
$ mkdir -p ~/.zsh/completion
$ curl -L https://raw.githubusercontent.com/xwmx/hosts/master/hosts-completion.zsh > ~/.zsh/completion/_hosts
```
Include the directory in your `$fpath` by adding in `~/.zshrc`:
```bash
fpath=(~/.zsh/completion $fpath)
```
Make sure `compinit` is loaded or do it by adding in `~/.zshrc`:
```bash
autoload -Uz compinit && compinit -i
```
Then reload your shell:
```bash
exec $SHELL -l
```

View File

@ -1,3 +1,5 @@
#compdef hosts
__hosts_subcommands() {
local _commands
_commands=($(hosts commands --raw))
@ -21,4 +23,4 @@ __hosts_subcommands() {
fi
}
compdef __hosts_subcommands hosts
__hosts_subcommands "$@"

1610
hosts

File diff suppressed because it is too large Load Diff

2
package-lock.json generated
View File

@ -1,5 +1,5 @@
{
"name": "hosts.sh",
"version": "3.2.1",
"version": "3.6.4",
"lockfileVersion": 1
}

View File

@ -1,6 +1,6 @@
{
"name": "hosts.sh",
"version": "3.2.1",
"version": "3.6.4",
"description": "A command line tool for managing hosts file entries.",
"global": true,
"install": "make install",
@ -11,17 +11,28 @@
"test": "test"
},
"scripts": {
"test": "bats test"
"test": "bats test",
"postinstall": "./hosts completions install",
"preuninstall": "./hosts completions uninstall"
},
"repository": {
"type": "git",
"url": "git+https://github.com/alphabetum/hosts.git"
"url": "git+https://github.com/xwmx/hosts.git"
},
"author": "William Melody",
"license": "MIT",
"bugs": {
"url": "https://github.com/alphabetum/hosts/issues"
"url": "https://github.com/xwmx/hosts/issues"
},
"homepage": "https://github.com/alphabetum/hosts#readme",
"homepage": "https://github.com/xwmx/hosts#readme",
"keywords": [
"hosts",
"shell",
"command-line",
"terminal",
"hostname",
"bash",
"cli"
],
"dependencies": {}
}

View File

@ -73,7 +73,7 @@ load test_helper
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
_compare '0.0.0.0 example.com' "$(sed -n '11p' "${HOSTS_PATH}")"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
}
@test "\`add <ip> <hostname>\` prints feedback." {
@ -81,7 +81,7 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Added:" ]]
[[ "${lines[1]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" == "0.0.0.0 example.com" ]]
}
@test "\`add <ip> <hostname>\` doesn't add duplicate entry." {
@ -95,10 +95,10 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
_compare '0.0.0.0 example.com' "$(sed -n '11p' "${HOSTS_PATH}")"
_compare '0.0.0.0 example.com' "$(sed -n '11p' "${HOSTS_PATH}")"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
[[ "$(cat "${HOSTS_PATH}")" == "${_modified}" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
}
# `hosts add <ip> <hostname> [comment]` #######################################
@ -118,7 +118,7 @@ load test_helper
printf "\${output}: '%s'\\n" "${output}"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == \
"0.0.0.0 example.com # Example multi-word comment." ]]
"0.0.0.0 example.com # Example multi-word comment." ]]
}
@test "\`add <ip> <hostname> [comment]\` doesn't add duplicate entry." {
@ -135,9 +135,9 @@ load test_helper
_compare '0.0.0.0 example.com' "$(sed -n '11p' "${HOSTS_PATH}")"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
[[ "$(cat "${HOSTS_PATH}")" == "${_modified}" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" != \
"0.0.0.0 example.com # Example multi-word comment." ]]
"0.0.0.0 example.com # Example multi-word comment." ]]
}
@test "\`add <ip> <hostname> [comment]\` doesn't add duplicate commented entry." {
@ -151,11 +151,11 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
_compare '0.0.0.0 example.com' "$(sed -n '11p' "${HOSTS_PATH}")"
_compare '0.0.0.0 example.com' "$(sed -n '11p' "${HOSTS_PATH}")"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
[[ "$(cat "${HOSTS_PATH}")" == "${_modified}" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == \
"0.0.0.0 example.com # Example multi-word comment." ]]
"0.0.0.0 example.com # Example multi-word comment." ]]
}
@test "\`add <ip> <hostname> [comment]\` prints feedback." {
@ -163,7 +163,7 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Added:" ]]
[[ "${lines[1]}" == "0.0.0.0 example.com # Example multi-word comment." ]]
[[ "${lines[1]}" == "0.0.0.0 example.com # Example multi-word comment." ]]
}
# help ########################################################################

64
test/backups.bats Executable file → Normal file
View File

@ -26,6 +26,8 @@ load test_helper
run "${_HOSTS}" backups
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
printf "\${_HOSTS_TEMP_PATH}: '%s'\\n" "${_HOSTS_TEMP_PATH}"
printf "\${HOSTS_PATH}: '%s'\\n" "${HOSTS_PATH}"
_expected="\
No backups found. Create a new backup:
hosts backups create"
@ -42,10 +44,10 @@ No backups found. Create a new backup:
run "${_HOSTS}" backups
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" =~ hosts_test ]]
[[ "${lines[0]}" =~ '--backup-' ]]
[[ "${lines[1]}" =~ hosts_test ]]
[[ "${lines[1]}" =~ '--backup-' ]]
printf "\${_HOSTS_TEMP_PATH}: '%s'\\n" "${_HOSTS_TEMP_PATH}"
printf "\${HOSTS_PATH}: '%s'\\n" "${HOSTS_PATH}"
[[ "${lines[0]}" =~ hosts--backup- ]]
[[ "${lines[1]}" =~ hosts--backup- ]]
}
# `hosts backups create` ######################################################
@ -61,7 +63,7 @@ No backups found. Create a new backup:
run "${_HOSTS}" backups create
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
printf "\${_backup_path}: '%s'\\n" "${_backup_path}"
[[ -e "${_backup_path}" ]]
}
@ -75,25 +77,42 @@ No backups found. Create a new backup:
# `hosts backups compare` #####################################################
@test "\`backups compare\` with valid backup exits with status 0 and prints." {
@test "\`backups compare\` with valid backup exits with status 1 and prints." {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
_backup_basename="$(basename "${_backup_path}")"
run "${_HOSTS}" add 0.0.0.0 example.com
}
run "${_HOSTS}" backups show "${_backup_basename}"
run "${_HOSTS}" backups compare "${_backup_basename}"
printf "\${output}: '%s'\\n" "${output}"
printf "\${lines[6]}: '%s'\\n" "${lines[6]}"
[[ ${status} -eq 0 ]]
[[ "${lines[6]}" == '127.0.0.1 localhost' ]]
printf "\${lines[1]}: '%s'\\n" "${lines[1]}"
[[ ${status} -eq 1 ]]
[[ "${lines[2]}" == '@@ -8,4 +8,3 @@' ]]
}
@test "\`backups compare\` with missing backup exits with status 1" {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
_backup_basename="$(basename "${_backup_path}")"
run "${_HOSTS}" add 0.0.0.0 example.com
}
run "${_HOSTS}" backups compare
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
[[ "${lines[0]}" =~ 'Usage' ]]
}
@test "\`backups compare\` with invalid backup exits with status 1" {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
_backup_basename="$(basename "${_backup_path}")"
run "${_HOSTS}" add 0.0.0.0 example.com
}
run "${_HOSTS}" backups compare "invalid-backup-name"
@ -108,7 +127,8 @@ No backups found. Create a new backup:
@test "\`backups delete\` with valid backup exits with status 0 and deletes backup" {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
[[ -e "${_backup_path}" ]]
_backup_basename="$(basename "${_backup_path}")"
}
@ -123,7 +143,7 @@ No backups found. Create a new backup:
@test "\`backups delete\` with invalid backup exits with status 1" {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
_backup_basename="$(basename "${_backup_path}")"
}
@ -140,7 +160,7 @@ No backups found. Create a new backup:
@test "\`backups restore\` with valid backup exits with status 0 and restores" {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
_backup_basename="$(basename "${_backup_path}")"
run "${_HOSTS}" add 0.0.0.0 example.com
sleep 1
@ -154,7 +174,10 @@ No backups found. Create a new backup:
[[ "${lines[0]}" =~ 'Backed up to' ]]
[[ "${lines[1]}" =~ 'Restored from backup' ]]
_new_backup_path="$(echo "${lines[0]}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_new_backup_path="$(echo "${lines[0]}" | sed -e 's/Backed up to \(.*\)/\1/')"
printf "\${_backup_path}: '%s'\\n" "${_backup_path}"
printf "\${_new_backup_path}: '%s'\\n" "${_new_backup_path}"
_new_backup_content="$(cat "${_new_backup_path}")"
_old_backup_content="$(cat "${_backup_path}")"
@ -167,7 +190,7 @@ No backups found. Create a new backup:
@test "\`backups restore --skip-backup\` with valid backup exits with status 0 and restores" {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
_backup_basename="$(basename "${_backup_path}")"
run "${_HOSTS}" add 0.0.0.0 example.com
_replaced_content="$(cat "${HOSTS_PATH}")"
@ -191,7 +214,7 @@ No backups found. Create a new backup:
@test "\`backups restore\` with invalid backup exits with status 1" {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
_backup_basename="$(basename "${_backup_path}")"
}
@ -207,7 +230,8 @@ No backups found. Create a new backup:
@test "\`backups show\` with valid backup exits with status 0 and prints." {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
[[ -e "${_backup_path:-}" ]]
_backup_basename="$(basename "${_backup_path}")"
}
@ -221,7 +245,7 @@ No backups found. Create a new backup:
@test "\`backups show\` with invalid backup exits with status 1" {
{
run "${_HOSTS}" backups create
_backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')"
_backup_path="$(echo "${output}" | sed -e 's/Backed up to \(.*\)/\1/')"
_backup_basename="$(basename "${_backup_path}")"
}

View File

@ -2,7 +2,7 @@
load test_helper
# `hosts block` #################################################################
# `hosts block` ###############################################################
@test "\`block\` with no arguments exits with status 1." {
run "${_HOSTS}" block
@ -28,7 +28,7 @@ load test_helper
[[ "${lines[1]}" == " hosts block <hostname>..." ]]
}
# `hosts block <hostname>` #################################################
# `hosts block <hostname>` ####################################################
@test "\`block <hostname>\` exits with status 0." {
run "${_HOSTS}" block example.com
@ -46,7 +46,7 @@ load test_helper
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
_compare '127.0.0.1 example.com' "$(sed -n '11p' "${HOSTS_PATH}")"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "127.0.0.1 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ 127.0.0.1[[:space:]]+example.com ]]
}
@test "\`block <hostname>\` prints feedback." {
@ -54,11 +54,11 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Added:" ]]
[[ "${lines[1]}" == "127.0.0.1 example.com" ]]
[[ "${lines[1]}" =~ 127.0.0.1[[:space:]]+example.com ]]
[[ "${lines[2]}" == "Added:" ]]
[[ "${lines[3]}" == "fe80::1%lo0 example.com" ]]
[[ "${lines[3]}" =~ fe80\:\:1\%lo0[[:space:]]example.com ]]
[[ "${lines[4]}" == "Added:" ]]
[[ "${lines[5]}" == "::1 example.com" ]]
[[ "${lines[5]}" =~ \:\:1[[:space:]]+example.com ]]
}
# `hosts block <hostname> <hostname2>` ########################################
@ -80,8 +80,8 @@ load test_helper
_compare '127.0.0.1 example.com' "$(sed -n '11p' "${HOSTS_PATH}")"
_compare '127.0.0.1 example2.com' "$(sed -n '11p' "${HOSTS_PATH}")"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "127.0.0.1 example.com" ]]
[[ "$(sed -n '14p' "${HOSTS_PATH}")" == "127.0.0.1 example2.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ 127.0.0.1[[:space:]]+example.com ]]
[[ "$(sed -n '14p' "${HOSTS_PATH}")" =~ 127.0.0.1[[:space:]]+example2.com ]]
}
@test "\`block <hostname> <hostname2>\` prints feedback." {
@ -89,17 +89,17 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Added:" ]]
[[ "${lines[1]}" == "127.0.0.1 example.com" ]]
[[ "${lines[1]}" =~ 127.0.0.1[[:space:]]+example.com ]]
[[ "${lines[2]}" == "Added:" ]]
[[ "${lines[3]}" == "fe80::1%lo0 example.com" ]]
[[ "${lines[3]}" =~ fe80\:\:1\%lo0[[:space:]]+example.com ]]
[[ "${lines[4]}" == "Added:" ]]
[[ "${lines[5]}" == "::1 example.com" ]]
[[ "${lines[5]}" =~ \:\:1[[:space:]]+example.com ]]
[[ "${lines[6]}" == "Added:" ]]
[[ "${lines[7]}" == "127.0.0.1 example2.com" ]]
[[ "${lines[7]}" =~ 127.0.0.1[[:space:]]+example2.com ]]
[[ "${lines[8]}" == "Added:" ]]
[[ "${lines[9]}" == "fe80::1%lo0 example2.com" ]]
[[ "${lines[9]}" =~ fe80\:\:1\%lo0[[:space:]]+example2.com ]]
[[ "${lines[10]}" == "Added:" ]]
[[ "${lines[11]}" == "::1 example2.com" ]]
[[ "${lines[11]}" =~ \:\:1[[:space:]]+example2.com ]]
}
# help ########################################################################

View File

@ -53,8 +53,8 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "127.0.0.1 example.net" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ \#disabled\:\ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ 127.0.0.1[[:space:]]+example.net ]]
}
@test "\`disable <ip>\` disables all matches." {
@ -68,8 +68,8 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.net" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ \#disabled\:\ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ \#disabled\:\ 0.0.0.0[[:space:]]+example.net ]]
}
@test "\`disable <ip>\` prints feedback." {
@ -82,7 +82,7 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Disabling:" ]]
[[ "${lines[1]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" =~ 0.0.0.0[[:space:]]+example.com ]]
}
# `hosts disable <hostname>` ##################################################
@ -110,8 +110,8 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "127.0.0.1 example.net" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ \#disabled\:\ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ 127.0.0.1[[:space:]]+example.net ]]
}
@test "\`disable <hostname>\` disables all matches." {
@ -125,8 +125,8 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "#disabled: 127.0.0.1 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ \#disabled\:\ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ 127.0.0.1[[:space:]]+example.com ]]
}
@test "\`disable <hostname>\` prints feedback." {
@ -139,7 +139,7 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Disabling:" ]]
[[ "${lines[1]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" =~ 0.0.0.0[[:space:]]+example.com ]]
}
# help ########################################################################

View File

@ -2,7 +2,7 @@
load test_helper
# `hosts disabled` #############################################################
# `hosts disabled` ############################################################
@test "\`disabled\` with no arguments exits with status 0." {
{
@ -18,7 +18,7 @@ load test_helper
[[ ${status} -eq 0 ]]
}
@test "\`disabled\` with no arguments prints list of disabled records." {
@test "\`disabled\` with no arguments prints list of disabled entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -29,11 +29,18 @@ load test_helper
run "${_HOSTS}" disabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" == "127.0.0.1 example.com" ]]
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example\.com ]]
[[ "${lines[1]}" =~ 127\.0\.0\.1[[:space:]]+example\.com ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`disabled\` exits with status 1 when no matching entries found." {
run "${_HOSTS}" disabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
}
# help ########################################################################
@test "\`help disabled\` exits with status 0." {

View File

@ -58,9 +58,9 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.net" ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" == "127.0.0.2 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ \#disabled:\ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ \#disabled:\ 0.0.0.0[[:space:]]+example.net ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" =~ 127.0.0.2[[:space:]]+example.com ]]
}
@test "\`enable <ip>\` enables all matches." {
@ -89,9 +89,9 @@ load test_helper
"'#disabled: 127.0.0.2 example.com'" \
"'$(sed -n '13p' "${HOSTS_PATH}")'"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "0.0.0.0 example.net" ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" == "#disabled: 127.0.0.2 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ 0.0.0.0[[:space:]]+example.net ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" =~ \#disabled:\ 127.0.0.2[[:space:]]+example.com ]]
}
@test "\`enable <ip>\` prints feedback." {
@ -106,7 +106,7 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Enabling:" ]]
[[ "${lines[1]}" == "127.0.0.2 example.com" ]]
[[ "${lines[1]}" =~ 127.0.0.2[[:space:]]+example.com ]]
}
# `hosts enable <hostname>` ###################################################
@ -138,9 +138,9 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "0.0.0.0 example.net" ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" == "127.0.0.2 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ \#disabled:\ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ 0.0.0.0[[:space:]]+example.net ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" =~ 127.0.0.2[[:space:]]+example.com ]]
}
@test "\`enable <hostname>\` enables all matches." {
@ -169,9 +169,9 @@ load test_helper
"'127.0.0.2 example.com'" \
"'$(sed -n '13p' "${HOSTS_PATH}")'"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "#disabled: 0.0.0.0 example.net" ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" == "127.0.0.2 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ \#disabled:\ 0.0.0.0[[:space:]]+example.net ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" =~ 127.0.0.2[[:space:]]+example.com ]]
}
@test "\`enable <hostname>\` prints feedback." {
@ -186,7 +186,7 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Enabling:" ]]
[[ "${lines[1]}" == "0.0.0.0 example.net" ]]
[[ "${lines[1]}" =~ 0.0.0.0[[:space:]]+example.net ]]
}
# help ########################################################################

View File

@ -18,7 +18,7 @@ load test_helper
[[ ${status} -eq 0 ]]
}
@test "\`enabled\` with no arguments prints list of enabled records." {
@test "\`enabled\` with no arguments prints list of enabled entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -29,11 +29,23 @@ load test_helper
run "${_HOSTS}" enabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "127.0.0.1 localhost" ]]
[[ "${lines[1]}" == "255.255.255.255 broadcasthost" ]]
[[ "${lines[2]}" == "::1 localhost" ]]
[[ "${lines[3]}" == "fe80::1%lo0 localhost" ]]
[[ "${lines[4]}" == "127.0.0.2 example.com" ]]
[[ "${lines[0]}" =~ 127.0.0.1[[:space:]]+localhost ]]
[[ "${lines[1]}" =~ 255.255.255.255[[:space:]]+broadcasthost ]]
[[ "${lines[2]}" =~ \:\:1[[:space:]]+localhost ]]
[[ "${lines[3]}" =~ fe80\:\:1\%lo0[[:space:]]+localhost ]]
[[ "${lines[4]}" =~ 127.0.0.2[[:space:]]+example.com ]]
}
@test "\`enabled\` exits with status 1 when no matching entries found." {
{
run "${_HOSTS}" disable localhost
run "${_HOSTS}" disable broadcasthost
}
run "${_HOSTS}" enabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
}
# help ########################################################################

1
test/fixtures/bin/hosts vendored Executable file
View File

@ -0,0 +1 @@
#!/usr/bin/env bash

View File

@ -10,9 +10,9 @@ load test_helper
@test "\`hosts\` with no arguments prints enabled rules." {
run "${_HOSTS}"
[[ "${#lines[@]}" -eq 4 ]]
[[ "${lines[0]}" == "127.0.0.1 localhost" ]]
[[ "${lines[1]}" == "255.255.255.255 broadcasthost" ]]
[[ "${lines[2]}" == "::1 localhost" ]]
[[ "${lines[3]}" == "fe80::1%lo0 localhost" ]]
[[ "${lines[0]}" =~ 127.0.0.1[[:space:]]+localhost ]]
[[ "${lines[1]}" =~ 255.255.255.255[[:space:]]+broadcasthost ]]
[[ "${lines[2]}" =~ \:\:1[[:space:]]+localhost ]]
[[ "${lines[3]}" =~ fe80\:\:1\%lo0[[:space:]]+localhost ]]
[[ "${lines[4]}" == "" ]]
}

View File

@ -2,7 +2,7 @@
load test_helper
# `hosts list` #############################################################
# `hosts list` ################################################################
@test "\`list\` exits with status 0." {
{
@ -18,7 +18,7 @@ load test_helper
[[ ${status} -eq 0 ]]
}
@test "\`list\` prints lists of enabled and disabled records." {
@test "\`list\` prints lists of enabled and disabled entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -30,15 +30,16 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_expected="\
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
127.0.0.2 example.com
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
127.0.0.2 example.com
Disabled:
0.0.0.0 example.com
0.0.0.0 example.net"
---------
0.0.0.0 example.com
0.0.0.0 example.net"
_compare "'${_expected}'" "'${output}'"
[[ "${output}" == "${_expected}" ]]
}
@ -59,7 +60,7 @@ Disabled:
[[ ${status} -eq 0 ]]
}
@test "\`list enabled\` prints list of enabled records." {
@test "\`list enabled\` prints list of enabled entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -70,11 +71,23 @@ Disabled:
run "${_HOSTS}" list enabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "127.0.0.1 localhost" ]]
[[ "${lines[1]}" == "255.255.255.255 broadcasthost" ]]
[[ "${lines[2]}" == "::1 localhost" ]]
[[ "${lines[3]}" == "fe80::1%lo0 localhost" ]]
[[ "${lines[4]}" == "127.0.0.2 example.com" ]]
[[ "${lines[0]}" =~ 127\.0\.0\.1[[:space:]]+localhost ]]
[[ "${lines[1]}" =~ 255\.255\.255\.255[[:space:]]+broadcasthost ]]
[[ "${lines[2]}" =~ \:\:1[[:space:]]+localhost ]]
[[ "${lines[3]}" =~ fe80\:\:1\%lo0[[:space:]]+localhost ]]
[[ "${lines[4]}" =~ 127\.0\.0\.2[[:space:]]+example.com ]]
}
@test "\`list enabled\` exits with status 1 when no matching entries found." {
{
run "${_HOSTS}" disable localhost
run "${_HOSTS}" disable broadcasthost
}
run "${_HOSTS}" list enabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
}
# `hosts list disabled` #######################################################
@ -93,7 +106,7 @@ Disabled:
[[ ${status} -eq 0 ]]
}
@test "\`list disabled\` prints list of disabled records." {
@test "\`list disabled\` prints list of disabled entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -104,11 +117,18 @@ Disabled:
run "${_HOSTS}" list disabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" == "127.0.0.1 example.com" ]]
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example\.com ]]
[[ "${lines[1]}" =~ 127\.0\.0\.1[[:space:]]+example\.com ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`list disabled\` exits with status 1 when no matching entries found." {
run "${_HOSTS}" list disabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
}
# `hosts list <search string>` ################################################
@test "\`list <search string>\` exits with status 0." {
@ -124,7 +144,7 @@ Disabled:
[[ ${status} -eq 0 ]]
}
@test "\`list <search string>\` prints list of matching records." {
@test "\`list <search string>\` prints list of matching entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -134,12 +154,12 @@ Disabled:
run "${_HOSTS}" list example.com
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" == "127.0.0.1 example.com" ]]
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example\.com ]]
[[ "${lines[1]}" =~ 127\.0\.0\.1[[:space:]]+example\.com ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`list <search string>\` prints records with matching comments." {
@test "\`list <search string>\` prints entries with matching comments." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
@ -149,12 +169,12 @@ Disabled:
run "${_HOSTS}" list "Comment"
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.net # Example Comment" ]]
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example\.net[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`list <search string>\` prints disabled records with matching comments." {
@test "\`list <search string>\` prints disabled entries with matching comments." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
@ -166,9 +186,16 @@ Disabled:
run "${_HOSTS}" list "Comment"
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.net # Example Comment" ]]
[[ "${lines[1]}" == "disabled: 127.0.0.1 example.biz # Example Comment" ]]
[[ "${lines[2]}" == "" ]]
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example\.net[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[3]}" =~ 127\.0\.0\.1[[:space:]]+example\.biz[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[4]}" == "" ]]
}
@test "\`list <search string>\` exits with status 1 when no matching entries found." {
run "${_HOSTS}" list query-that-matches-no-entries
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
}
# help ########################################################################

View File

@ -2,7 +2,7 @@
load test_helper
# `hosts remove` #################################################################
# `hosts remove` ##############################################################
@test "\`remove\` with no arguments exits with status 1." {
run "${_HOSTS}" remove
@ -53,7 +53,7 @@ load test_helper
run "${_HOSTS}" remove 127.0.0.3 --force
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${output} == "No matching records found." ]]
[[ ${output} == "${_ERROR_PREFIX}No matching entries found." ]]
}
# `hosts remove <ip> --force` #################################################
@ -83,9 +83,9 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "0.0.0.0 example.net" ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" == "" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ 0.0.0.0[[:space:]]+example.com ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" =~ 0.0.0.0[[:space:]]+example.net ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" == "" ]]
}
@test "\`remove <ip>\` removes all matches." {
@ -129,7 +129,7 @@ fe80::1%lo0 localhost
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Removed:" ]]
[[ "${lines[1]}" == "127.0.0.2 example.com" ]]
[[ "${lines[1]}" =~ 127.0.0.2[[:space:]]+example.com ]]
}
# `hosts remove <hostname> --force` ###########################################
@ -159,7 +159,7 @@ fe80::1%lo0 localhost
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.net" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" =~ 0.0.0.0[[:space:]]+example.net ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "" ]]
}
@ -187,8 +187,8 @@ fe80::1%lo0 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
0.0.0.0 example.net
#disabled: 0.0.0.0 example.dev"
0.0.0.0 example.net
#disabled: 0.0.0.0 example.dev"
_compare "'${_expected}'" "'$(cat "${HOSTS_PATH}")'"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
[[ "$(cat "${HOSTS_PATH}")" == "${_expected}" ]]
@ -206,7 +206,7 @@ fe80::1%lo0 localhost
printf "\${output}: '%s'\\n" "${output}"
_expected="\
Removed:
0.0.0.0 example.com
0.0.0.0 example.com
127.0.0.2 example.com"
[[ "${output}" == "${_expected}" ]]
}

View File

@ -2,7 +2,7 @@
load test_helper
# `hosts search` #############################################################
# `hosts search` ##############################################################
@test "\`search\` with no arguments exits with status 1." {
{
@ -29,14 +29,8 @@ load test_helper
run "${_HOSTS}" search
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_expected="\
Usage:
hosts search <search string>
Description:
Search entries for <search string>."
_compare "'${_expected}'" "'${output}'"
[[ "${output}" == "${_expected}" ]]
[[ "${lines[0]}" == "Usage:" ]]
[[ "${lines[1]}" == " hosts search <search string>" ]]
}
# `hosts search enabled` ######################################################
@ -55,7 +49,7 @@ Description:
[[ ${status} -eq 0 ]]
}
@test "\`search enabled\` prints list of enabled records." {
@test "\`search enabled\` prints list of enabled entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -66,14 +60,26 @@ Description:
run "${_HOSTS}" search enabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "127.0.0.1 localhost" ]]
[[ "${lines[1]}" == "255.255.255.255 broadcasthost" ]]
[[ "${lines[2]}" == "::1 localhost" ]]
[[ "${lines[3]}" == "fe80::1%lo0 localhost" ]]
[[ "${lines[4]}" == "127.0.0.2 example.com" ]]
[[ "${lines[0]}" =~ 127.0.0.1[[:space:]]+localhost ]]
[[ "${lines[1]}" =~ 255.255.255.255[[:space:]]+broadcasthost ]]
[[ "${lines[2]}" =~ \:\:1[[:space:]]+localhost ]]
[[ "${lines[3]}" =~ fe80\:\:1\%lo0[[:space:]]+localhost ]]
[[ "${lines[4]}" =~ 127.0.0.2[[:space:]]+example.com ]]
}
# `hosts search disabled` #######################################################
@test "\`search enabled\` exits with status 1 when no matching entries found." {
{
run "${_HOSTS}" disable localhost
run "${_HOSTS}" disable broadcasthost
}
run "${_HOSTS}" search enabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
}
# `hosts search disabled` #####################################################
@test "\`search disabled\` exits with status 0." {
{
@ -89,7 +95,7 @@ Description:
[[ ${status} -eq 0 ]]
}
@test "\`search disabled\` prints list of disabled records." {
@test "\`search disabled\` prints list of disabled entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -100,11 +106,18 @@ Description:
run "${_HOSTS}" search disabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" == "127.0.0.1 example.com" ]]
[[ "${lines[0]}" =~ 0.0.0.0[[:space:]]+example.com ]]
[[ "${lines[1]}" =~ 127.0.0.1[[:space:]]+example.com ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`search disabled\` exits with status 1 when no matching entries found." {
run "${_HOSTS}" search disabled
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
}
# `hosts search <search string>` ################################################
@test "\`search <search string>\` exits with status 0." {
@ -120,7 +133,7 @@ Description:
[[ ${status} -eq 0 ]]
}
@test "\`search <search string>\` prints list of matching records." {
@test "\`search <search string>\` prints list of matching entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -130,12 +143,12 @@ Description:
run "${_HOSTS}" search example.com
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" == "127.0.0.1 example.com" ]]
[[ "${lines[0]}" =~ 0.0.0.0[[:space:]]+example.com ]]
[[ "${lines[1]}" =~ 127.0.0.1[[:space:]]+example.com ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`search <search string>\` prints records with matching comments." {
@test "\`search <search string>\` prints entries with matching comments." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
@ -145,11 +158,11 @@ Description:
run "${_HOSTS}" search "Comment"
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.net # Example Comment" ]]
[[ "${lines[0]}" =~ 0.0.0.0[[:space:]]+example.net[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`search <search string>\` prints disabled records with matching comments." {
@test "\`search <search string>\` prints disabled entries with matching comments." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
@ -161,9 +174,16 @@ Description:
run "${_HOSTS}" search "Comment"
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.net # Example Comment" ]]
[[ "${lines[1]}" == "disabled: 127.0.0.1 example.biz # Example Comment" ]]
[[ "${lines[2]}" == "" ]]
[[ "${lines[0]}" =~ 0.0.0.0[[:space:]]+example.net[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[3]}" =~ 127.0.0.1[[:space:]]+example.biz[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[4]}" == "" ]]
}
@test "\`search <search string>\` exits with status 1 when no matching entries found." {
run "${_HOSTS}" search query-that-matches-no-entries
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
}
# help ########################################################################
@ -177,6 +197,6 @@ Description:
run "${_HOSTS}" help search
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "Usage:" ]]
[[ "${lines[1]}" == " hosts search <search string>" ]]
[[ "${lines[0]}" == "Usage:" ]]
[[ "${lines[1]}" == " hosts search <search string>" ]]
}

View File

@ -2,7 +2,7 @@
load test_helper
# `hosts show` ##############################################################
# `hosts show` ################################################################
@test "\`show\` with no arguments exits with status 1." {
run "${_HOSTS}" show
@ -19,9 +19,27 @@ load test_helper
[[ "${lines[1]}" == " hosts show (<ip> | <hostname> | <search string>)" ]]
}
# `hosts show <ip>` #########################################################
# `hosts show <no matching>` ##################################################
@test "\`show <ip>\` exits with status 0." {
@test "\`show <query>\` with no matching entries with status 1." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
run "${_HOSTS}" add 127.0.0.2 example.com
run "${_HOSTS}" disable example.com
}
run "${_HOSTS}" show bad-query
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 1 ]]
[[ "${lines[0]}" =~ No\ matching\ entries ]]
}
# `hosts show <ip>` ###########################################################
@test "\`show <ip>\` exits with status 0 and shows all matches." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -33,27 +51,14 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 0 ]]
}
@test "\`show <ip>\` shows all matches." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
run "${_HOSTS}" add 127.0.0.2 example.com
run "${_HOSTS}" disable example.com
}
run "${_HOSTS}" show 0.0.0.0
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.net" ]]
[[ "${lines[1]}" == "disabled: 0.0.0.0 example.com" ]]
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example.net ]]
[[ "${lines[3]}" =~ 0\.0\.0\.0[[:space:]]+example.com ]]
}
# `hosts show <hostname>` #####################################################
@test "\`show <hostname>\` exits with status 0." {
@test "\`show <hostname>\` exits with status 0 and shows all matches." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -65,27 +70,14 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 0 ]]
}
@test "\`show <hostname>\` shows all matches." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
run "${_HOSTS}" add 127.0.0.2 example.com
run "${_HOSTS}" disable 0.0.0.0
}
run "${_HOSTS}" show example.com
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "127.0.0.2 example.com" ]]
[[ "${lines[1]}" == "disabled: 0.0.0.0 example.com" ]]
[[ "${lines[0]}" =~ 127\.0\.0\.2[[:space:]]+example.com ]]
[[ "${lines[3]}" =~ 0\.0\.0\.0[[:space:]]+example.com ]]
}
# `hosts show <search string>` ################################################
@test "\`show <search string>\` exits with status 0." {
@test "\`show <search string>\` exits with status 0 and shows matching entries." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
@ -96,24 +88,13 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${status} -eq 0 ]]
}
@test "\`show <search string>\` prints list of matching records." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net
run "${_HOSTS}" add 127.0.0.1 example.com
}
run "${_HOSTS}" show example.com
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.com" ]]
[[ "${lines[1]}" == "127.0.0.1 example.com" ]]
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example.com ]]
[[ "${lines[1]}" =~ 127\.0\.0\.1[[:space:]]+example.com ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`show <search string>\` prints records with matching comments." {
@test "\`show <search string>\` prints entries with matching comments." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
@ -123,11 +104,12 @@ load test_helper
run "${_HOSTS}" show "Comment"
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.net # Example Comment" ]]
printf "\${lines[0]}: '%s'\\n" "${lines[0]}"
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example\.net[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[2]}" == "" ]]
}
@test "\`show <search string>\` prints disabled records with matching comments." {
@test "\`show <search string>\` prints disabled entries with matching comments." {
{
run "${_HOSTS}" add 0.0.0.0 example.com
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
@ -139,9 +121,9 @@ load test_helper
run "${_HOSTS}" show "Comment"
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ "${lines[0]}" == "0.0.0.0 example.net # Example Comment" ]]
[[ "${lines[1]}" == "disabled: 127.0.0.1 example.biz # Example Comment" ]]
[[ "${lines[2]}" == "" ]]
[[ "${lines[0]}" =~ 0\.0\.0\.0[[:space:]]+example\.net[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[3]}" =~ 127\.0\.0\.1[[:space:]]+example\.biz[[:space:]]+\#\ Example\ Comment ]]
[[ "${lines[4]}" == "" ]]
}
# help ########################################################################

View File

@ -12,12 +12,22 @@ setup() {
# The location of the `hosts` script being tested.
export _HOSTS="${BATS_TEST_DIRNAME}/../hosts"
export _HOSTS_TEMP_DIR="/tmp"
export _HOSTS_TEMP_DIR
_HOSTS_TEMP_DIR="$(mktemp -d)"
export _HOSTS_TEMP_PATH
_HOSTS_TEMP_PATH="$(mktemp ${_HOSTS_TEMP_DIR}/hosts_test.XXXXXX)" || exit 1
_HOSTS_TEMP_PATH="${_HOSTS_TEMP_DIR}/hosts"
export _ERROR_PREFIX
_ERROR_PREFIX="$(tput setaf 1)!$(tput sgr0) "
cat "${BATS_TEST_DIRNAME}/fixtures/hosts" > "${_HOSTS_TEMP_PATH}"
export HOSTS_PATH="${_HOSTS_TEMP_PATH}"
# Use empty `hosts` script in environment to avoid depending on `hosts`
# being available in `$PATH`.
export PATH="${BATS_TEST_DIRNAME}/fixtures/bin:${PATH}"
}
teardown() {

View File

@ -2,7 +2,7 @@
load test_helper
# `hosts unblock` #################################################################
# `hosts unblock` #############################################################
@test "\`unblock\` with no arguments exits with status 1." {
run "${_HOSTS}" unblock
@ -28,7 +28,7 @@ load test_helper
[[ "${lines[1]}" == " hosts unblock <hostname>..." ]]
}
# `hosts unblock <invalid>` ############################################
# `hosts unblock <invalid>` ###################################################
@test "\`unblock <invalid> \` exits with status 1." {
{
@ -49,10 +49,10 @@ load test_helper
run "${_HOSTS}" unblock example.net
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
[[ ${output} == "No matching records found." ]]
[[ ${output} == "${_ERROR_PREFIX}No matching entries found." ]]
}
# `hosts unblock <hostname>` ###########################################
# `hosts unblock <hostname>` ##################################################
@test "\`unblock <hostname>\` exits with status 0." {
{
@ -79,7 +79,7 @@ load test_helper
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "127.0.0.1 example.net" ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" == "" ]]
}
@ -106,7 +106,7 @@ load test_helper
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
0.0.0.0 example.com
0.0.0.0 example.com
127.0.0.1 example.net"
_compare "'${_expected}'" "'$(cat "${HOSTS_PATH}")'"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
@ -129,7 +129,7 @@ Removed:
Removed:
fe80::1%lo0 example.com
Removed:
::1 example.com"
::1 example.com"
[[ "${output}" == "${_expected}" ]]
}
@ -162,7 +162,7 @@ Removed:
printf "\${status}: %s\\n" "${status}"
printf "\${output}: '%s'\\n" "${output}"
_compare "${_original}" "$(cat "${HOSTS_PATH}")"
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '11p' "${HOSTS_PATH}")" == "0.0.0.0 example.com" ]]
[[ "$(sed -n '12p' "${HOSTS_PATH}")" == "127.0.0.1 example.net" ]]
[[ "$(sed -n '13p' "${HOSTS_PATH}")" == "" ]]
}
@ -190,7 +190,7 @@ Removed:
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
0.0.0.0 example.com
0.0.0.0 example.com
127.0.0.1 example.net"
_compare "'${_expected}'" "'$(cat "${HOSTS_PATH}")'"
[[ "$(cat "${HOSTS_PATH}")" != "${_original}" ]]
@ -214,13 +214,13 @@ Removed:
Removed:
fe80::1%lo0 example.com
Removed:
::1 example.com
::1 example.com
Removed:
127.0.0.1 example2.com
Removed:
fe80::1%lo0 example2.com
Removed:
::1 example2.com"
::1 example2.com"
_compare "'${output}'" "'${_expected}'"
diff <(echo "${output}" ) <(echo "${_expected}")
[[ "${output}" == "${_expected}" ]]