mirror of
https://github.com/octoleo/hosts.git
synced 2024-06-02 06:20:52 +00:00
Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8916c43efa | ||
|
9ea716f861 | ||
|
9a929dc70f | ||
|
80699292a4 | ||
|
06ad3e8deb | ||
|
c74671613b | ||
|
0201480ffb | ||
|
0ce875c210 | ||
|
6a58eb693d | ||
|
245188025a | ||
|
39a182b47e | ||
|
bd7edba09b | ||
|
5049abe817 | ||
|
5c87ad62b0 | ||
|
ca51f3f742 | ||
|
ade1109cba |
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
github: xwmx
|
||||||
|
custom: https://paypal.me/WilliamMelody
|
84
.github/workflows/tests.yml
vendored
Normal file
84
.github/workflows/tests.yml
vendored
Normal 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"
|
18
.travis.yml
18
.travis.yml
|
@ -1,18 +0,0 @@
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
- os: linux
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- sourceline: 'ppa:duggan/bats'
|
|
||||||
packages:
|
|
||||||
- bats
|
|
||||||
dist: bionic
|
|
||||||
language: minimal
|
|
||||||
- os: osx
|
|
||||||
before_install:
|
|
||||||
- brew install bats-core
|
|
||||||
osx_image: xcode11.3
|
|
||||||
|
|
||||||
script: bats test
|
|
||||||
|
|
61
README.md
61
README.md
|
@ -1,4 +1,4 @@
|
||||||
[![Build Status](https://travis-ci.org/xwmx/hosts.svg?branch=master)](https://travis-ci.org/xwmx/hosts)
|
[![Build Status](https://img.shields.io/github/actions/workflow/status/xwmx/hosts/tests.yml?branch=master)](https://github.com/xwmx/hosts/actions)
|
||||||
|
|
||||||
__ __
|
__ __
|
||||||
/ /_ ____ _____/ /______
|
/ /_ ____ _____/ /______
|
||||||
|
@ -25,7 +25,8 @@ single, portable script that can be `curl`ed into any environment.
|
||||||
To install with [Homebrew](http://brew.sh/):
|
To install with [Homebrew](http://brew.sh/):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
brew install xwmx/taps/hosts
|
brew tap xwmx/taps
|
||||||
|
brew install hosts
|
||||||
```
|
```
|
||||||
|
|
||||||
### npm
|
### npm
|
||||||
|
@ -159,7 +160,7 @@ address, domain, or regular expression:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
> hosts remove example.com
|
> hosts remove example.com
|
||||||
Removing the following records:
|
Removing the following entries:
|
||||||
127.0.0.1 example.com
|
127.0.0.1 example.com
|
||||||
Are you sure you want to proceed? [y/N] y
|
Are you sure you want to proceed? [y/N] y
|
||||||
Removed:
|
Removed:
|
||||||
|
@ -191,7 +192,7 @@ Removed:
|
||||||
|
|
||||||
### Enabling / Disabling Entries
|
### Enabling / Disabling Entries
|
||||||
|
|
||||||
Add entries are enabled by default. Disabiling an entry comments it out
|
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
|
so it has no effect, but remains in the hosts file ready to be enabled
|
||||||
again.
|
again.
|
||||||
|
|
||||||
|
@ -329,7 +330,7 @@ alias hosts="hosts --auto-sudo"
|
||||||
Usage:
|
Usage:
|
||||||
hosts [<search string>]
|
hosts [<search string>]
|
||||||
hosts add <ip> <hostname> [<comment>]
|
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 block <hostname>...
|
||||||
hosts completions (check | install [-d | --download] | uninstall)
|
hosts completions (check | install [-d | --download] | uninstall)
|
||||||
hosts disable (<ip> | <hostname> | <search string>)
|
hosts disable (<ip> | <hostname> | <search string>)
|
||||||
|
@ -401,7 +402,7 @@ Usage:
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
List the existing IP / hostname pairs, optionally limited to a specified
|
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.
|
be printed.
|
||||||
|
|
||||||
Alias for `hosts list`
|
Alias for `hosts list`
|
||||||
|
@ -417,7 +418,7 @@ Description:
|
||||||
Add a given IP address and hostname pair, along with an optional comment.
|
Add a given IP address and hostname pair, along with an optional comment.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 Entry successfully added.
|
||||||
1 Invalid parameters or entry exists.
|
1 Invalid parameters or entry exists.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -462,7 +463,7 @@ Description:
|
||||||
for IPv4 and both `fe80::1%lo0` and `::1` for IPv6.
|
for IPv4 and both `fe80::1%lo0` and `::1` for IPv6.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 <hostname> successfully blocked.
|
||||||
1 Invalid parameters or entry exists.
|
1 Invalid parameters or entry exists.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -483,6 +484,10 @@ Options:
|
||||||
Description:
|
Description:
|
||||||
Manage completion scripts. For more information, visit:
|
Manage completion scripts. For more information, visit:
|
||||||
https://github.com/xwmx/hosts/blob/master/etc/README.md
|
https://github.com/xwmx/hosts/blob/master/etc/README.md
|
||||||
|
|
||||||
|
Exit status:
|
||||||
|
0 Completions successfully installed.
|
||||||
|
1 Invalid parameters or other error.
|
||||||
```
|
```
|
||||||
|
|
||||||
### `hosts disable`
|
### `hosts disable`
|
||||||
|
@ -492,11 +497,11 @@ Usage:
|
||||||
hosts disable (<ip> | <hostname> | <search string>)
|
hosts disable (<ip> | <hostname> | <search string>)
|
||||||
|
|
||||||
Description:
|
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.
|
search string.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 Entry successfully disabled.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -507,7 +512,11 @@ Usage:
|
||||||
hosts disabled
|
hosts disabled
|
||||||
|
|
||||||
Description:
|
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`
|
### `hosts edit`
|
||||||
|
@ -527,11 +536,11 @@ Usage:
|
||||||
hosts enable (<ip> | <hostname> | <search string>)
|
hosts enable (<ip> | <hostname> | <search string>)
|
||||||
|
|
||||||
Description:
|
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.
|
or search string.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 Entry successfully enabled.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -542,7 +551,11 @@ Usage:
|
||||||
hosts enabled
|
hosts enabled
|
||||||
|
|
||||||
Description:
|
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`
|
### `hosts file`
|
||||||
|
@ -573,8 +586,12 @@ Usage:
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
List the existing IP / hostname pairs, optionally limited to a specified
|
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.
|
be printed.
|
||||||
|
|
||||||
|
Exit status:
|
||||||
|
0 One or more matching entries found.
|
||||||
|
1 Invalid parameters or entry not found.
|
||||||
```
|
```
|
||||||
|
|
||||||
### `hosts remove`
|
### `hosts remove`
|
||||||
|
@ -588,12 +605,12 @@ Options:
|
||||||
--force Skip the confirmation prompt.
|
--force Skip the confirmation prompt.
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
Remove one or more records based on a given IP address, hostname, or search
|
Remove one or more entries based on a given IP address, hostname, or search
|
||||||
string. If an IP and hostname are both provided, only records matching the
|
string. If an IP and hostname are both provided, only entries matching the
|
||||||
IP and hostname pair will be removed.
|
IP and hostname pair will be removed.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 Entry successfully removed.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -605,6 +622,10 @@ Usage:
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
Search entries for <search string>.
|
Search entries for <search string>.
|
||||||
|
|
||||||
|
Exit status:
|
||||||
|
0 One or more matching entries found.
|
||||||
|
1 Invalid parameters or entry not found.
|
||||||
```
|
```
|
||||||
|
|
||||||
### `hosts show`
|
### `hosts show`
|
||||||
|
@ -617,7 +638,7 @@ Description:
|
||||||
Print entries matching a given IP address, hostname, or search string.
|
Print entries matching a given IP address, hostname, or search string.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 One or more matching entries found.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -644,7 +665,7 @@ Description:
|
||||||
Unblock one or more hostnames by removing the entries from the hosts file.
|
Unblock one or more hostnames by removing the entries from the hosts file.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 <hostname> successfully unblocked.
|
||||||
1 Invalid parameters or entry not found
|
1 Invalid parameters or entry not found
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
242
hosts
242
hosts
|
@ -52,7 +52,7 @@ IFS=$'\n\t'
|
||||||
# $_VERSION
|
# $_VERSION
|
||||||
#
|
#
|
||||||
# The most recent program version.
|
# The most recent program version.
|
||||||
_VERSION="3.6.2"
|
_VERSION="3.6.4"
|
||||||
|
|
||||||
# $_ME
|
# $_ME
|
||||||
#
|
#
|
||||||
|
@ -71,33 +71,6 @@ HOSTS_DEFAULT_SUBCOMMAND="${HOSTS_DEFAULT_SUBCOMMAND:-list}"
|
||||||
# The path to the hosts file. This will almost always be /etc/hosts
|
# The path to the hosts file. This will almost always be /etc/hosts
|
||||||
HOSTS_PATH="${HOSTS_PATH:-/etc/hosts}"
|
HOSTS_PATH="${HOSTS_PATH:-/etc/hosts}"
|
||||||
|
|
||||||
# Space and tab for regular expressions
|
|
||||||
#
|
|
||||||
# sed regular expressions have slightly different behaviors dependending on
|
|
||||||
# the environment, and POSIX [[:space:]] matches whitespace characters other
|
|
||||||
# than just space and tab. These variables provide an easier, portable way to
|
|
||||||
# test for just these two characters.
|
|
||||||
export _TAB_=$'\t'
|
|
||||||
export _SPACE_=$' '
|
|
||||||
export _TAB_SPACE_="${_TAB_}${_SPACE_}"
|
|
||||||
export _TAB_SPACE_CC_="[${_TAB_SPACE_}]"
|
|
||||||
|
|
||||||
# $_SED_I_COMMAND
|
|
||||||
#
|
|
||||||
# `sed -i` takes an extension on macOS, but that extension can cause errors in
|
|
||||||
# GNU `sed`.
|
|
||||||
#
|
|
||||||
# NOTE: To use this command, call it with `"${_SED_I_COMMAND[@]}"`
|
|
||||||
#
|
|
||||||
# https://stackoverflow.com/q/43171648
|
|
||||||
# http://stackoverflow.com/a/16746032
|
|
||||||
if sed --help >/dev/null 2>&1
|
|
||||||
then # GNU
|
|
||||||
export _SED_I_COMMAND=(sed -i)
|
|
||||||
else # BSD
|
|
||||||
export _SED_I_COMMAND=(sed -i '')
|
|
||||||
fi
|
|
||||||
|
|
||||||
# $_REPO
|
# $_REPO
|
||||||
#
|
#
|
||||||
# The <user>/<repo> identifier for the git repository.
|
# The <user>/<repo> identifier for the git repository.
|
||||||
|
@ -189,9 +162,20 @@ _warn() {
|
||||||
}
|
}
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Utility Functions
|
# Helpers
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
# Space and tab for regular expressions
|
||||||
|
#
|
||||||
|
# sed regular expressions have slightly different behaviors dependending on
|
||||||
|
# the environment, and POSIX [[:space:]] matches whitespace characters other
|
||||||
|
# than just space and tab. These variables provide an easier, portable way to
|
||||||
|
# test for just these two characters.
|
||||||
|
export _TAB_=$'\t'
|
||||||
|
export _SPACE_=$' '
|
||||||
|
export _TAB_SPACE_="${_TAB_}${_SPACE_}"
|
||||||
|
export _TAB_SPACE_CC_="[${_TAB_SPACE_}]"
|
||||||
|
|
||||||
# _contains()
|
# _contains()
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
|
@ -224,8 +208,8 @@ _contains() {
|
||||||
# _download_from <url> [<outfile>]
|
# _download_from <url> [<outfile>]
|
||||||
#
|
#
|
||||||
# Description:
|
# Description:
|
||||||
# Download the file at <url> and print to standard output or <outfile>, if
|
# Download the file at <url> and print to standard output or <outfile>.
|
||||||
# present. Uses `curl` if available, falling back to `wget`.
|
# Uses `curl` if available, falling back to `wget`.
|
||||||
_download_from() {
|
_download_from() {
|
||||||
local _downloaded=0
|
local _downloaded=0
|
||||||
local _target_path="${2:-}"
|
local _target_path="${2:-}"
|
||||||
|
@ -348,8 +332,27 @@ _print_entries() {
|
||||||
done <<< "${_input}"
|
done <<< "${_input}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# _sed_i()
|
||||||
|
#
|
||||||
|
# `sed -i` takes an extension on macOS, but that extension can cause errors in
|
||||||
|
# GNU `sed`.
|
||||||
|
#
|
||||||
|
# https://stackoverflow.com/q/43171648
|
||||||
|
# https://stackoverflow.com/a/16746032
|
||||||
|
_sed_i() {
|
||||||
|
if sed --help >/dev/null 2>&1
|
||||||
|
then # GNU
|
||||||
|
sed -i "${@}"
|
||||||
|
else # BSD
|
||||||
|
sed -i '' "${@}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# _verify_write_permissions
|
# _verify_write_permissions
|
||||||
#
|
#
|
||||||
|
# Usage:
|
||||||
|
# _verify_write_permissions
|
||||||
|
#
|
||||||
# Print a helpful error message when the specified operation can't be
|
# Print a helpful error message when the specified operation can't be
|
||||||
# performed due to the lack of write permissions. If `$_AUTO_SUDO` is enabled,
|
# performed due to the lack of write permissions. If `$_AUTO_SUDO` is enabled,
|
||||||
# then run the command with sudo and exit with the command's exit value.
|
# then run the command with sudo and exit with the command's exit value.
|
||||||
|
@ -470,7 +473,7 @@ A program for managing host file entries.
|
||||||
Usage:
|
Usage:
|
||||||
${_ME} [<search string>]
|
${_ME} [<search string>]
|
||||||
${_ME} add <ip> <hostname> [<comment>]
|
${_ME} add <ip> <hostname> [<comment>]
|
||||||
${_ME} backups [create | [compare | delete | restore | show] <filename>]
|
${_ME} backups [create | (compare | delete | restore | show) <filename>]
|
||||||
${_ME} block <hostname>...
|
${_ME} block <hostname>...
|
||||||
${_ME} completions (check | install [-d | --download] | uninstall)
|
${_ME} completions (check | install [-d | --download] | uninstall)
|
||||||
${_ME} disable (<ip> | <hostname> | <search string>)
|
${_ME} disable (<ip> | <hostname> | <search string>)
|
||||||
|
@ -540,7 +543,7 @@ Description:
|
||||||
Add a given IP address and hostname pair, along with an optional comment.
|
Add a given IP address and hostname pair, along with an optional comment.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 Entry successfully added.
|
||||||
1 Invalid parameters or entry exists.
|
1 Invalid parameters or entry exists.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
add() {
|
add() {
|
||||||
|
@ -647,7 +650,7 @@ backups() {
|
||||||
--skip-backup)
|
--skip-backup)
|
||||||
_skip_backup=1
|
_skip_backup=1
|
||||||
;;
|
;;
|
||||||
create|compare|delete|restore|show)
|
compare|create|delete|restore|show)
|
||||||
_subcommand="${__arg}"
|
_subcommand="${__arg}"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
@ -660,15 +663,6 @@ backups() {
|
||||||
done
|
done
|
||||||
|
|
||||||
case "${_subcommand}" in
|
case "${_subcommand}" in
|
||||||
create)
|
|
||||||
_verify_write_permissions
|
|
||||||
|
|
||||||
local _timestamp
|
|
||||||
_timestamp="$(date +"%Y%m%d%H%M%S")"
|
|
||||||
|
|
||||||
cp "${HOSTS_PATH}" "${HOSTS_PATH}--backup-${_timestamp}" && \
|
|
||||||
printf "Backed up to %s--backup-%s\\n" "${HOSTS_PATH}" "${_timestamp}"
|
|
||||||
;;
|
|
||||||
compare)
|
compare)
|
||||||
if [[ -z "${_filename:-}" ]]
|
if [[ -z "${_filename:-}" ]]
|
||||||
then
|
then
|
||||||
|
@ -681,6 +675,15 @@ backups() {
|
||||||
|
|
||||||
diff -u "${HOSTS_PATH}" "${_hosts_dirname}/${_filename}"
|
diff -u "${HOSTS_PATH}" "${_hosts_dirname}/${_filename}"
|
||||||
;;
|
;;
|
||||||
|
create)
|
||||||
|
_verify_write_permissions
|
||||||
|
|
||||||
|
local _timestamp
|
||||||
|
_timestamp="$(date +"%Y%m%d%H%M%S")"
|
||||||
|
|
||||||
|
cp "${HOSTS_PATH}" "${HOSTS_PATH}--backup-${_timestamp}" && \
|
||||||
|
printf "Backed up to %s--backup-%s\\n" "${HOSTS_PATH}" "${_timestamp}"
|
||||||
|
;;
|
||||||
delete)
|
delete)
|
||||||
if [[ -z "${_filename:-}" ]]
|
if [[ -z "${_filename:-}" ]]
|
||||||
then
|
then
|
||||||
|
@ -771,7 +774,7 @@ Description:
|
||||||
for IPv4 and both \`fe80::1%lo0\` and \`::1\` for IPv6.
|
for IPv4 and both \`fe80::1%lo0\` and \`::1\` for IPv6.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 <hostname> successfully blocked.
|
||||||
1 Invalid parameters or entry exists.
|
1 Invalid parameters or entry exists.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
block() {
|
block() {
|
||||||
|
@ -804,6 +807,10 @@ Options:
|
||||||
Description:
|
Description:
|
||||||
Manage completion scripts. For more information, visit:
|
Manage completion scripts. For more information, visit:
|
||||||
https://github.com/${_REPO}/blob/master/etc/README.md
|
https://github.com/${_REPO}/blob/master/etc/README.md
|
||||||
|
|
||||||
|
Exit status:
|
||||||
|
0 Completions successfully installed.
|
||||||
|
1 Invalid parameters or other error.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
completions() {
|
completions() {
|
||||||
local _BASH_COMP_NAME="hosts"
|
local _BASH_COMP_NAME="hosts"
|
||||||
|
@ -827,7 +834,7 @@ completions() {
|
||||||
printf "Exists: %s\\n" "${_bash_completion_path}/${_BASH_COMP_NAME}"
|
printf "Exists: %s\\n" "${_bash_completion_path}/${_BASH_COMP_NAME}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printf "Permission denied: %s\\n" "${_bash_completion_path}"
|
_warn printf "Permission denied: %s\\n" "${_bash_completion_path}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -843,7 +850,7 @@ completions() {
|
||||||
printf "Exists: %s\\n" "${_zsh_completion_path}/${_ZSH_COMP_NAME}"
|
printf "Exists: %s\\n" "${_zsh_completion_path}/${_ZSH_COMP_NAME}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printf "Permission denied: %s\\n" "${_zsh_completion_path}"
|
_warn printf "Permission denied: %s\\n" "${_zsh_completion_path}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -899,8 +906,20 @@ completions() {
|
||||||
_download=1
|
_download=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local _my_path="${0}"
|
||||||
|
|
||||||
|
if [[ -L "${_my_path}" ]]
|
||||||
|
then
|
||||||
|
if hash "realpath" 2>/dev/null
|
||||||
|
then
|
||||||
|
_my_path="$(realpath "${_my_path}")"
|
||||||
|
else
|
||||||
|
_my_path="$(readlink "${_my_path}")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
local _my_dir=
|
local _my_dir=
|
||||||
_my_dir="$(cd "$(dirname "$(realpath "$0")")"; pwd)"
|
_my_dir="$(cd "$(dirname "${_my_path}")"; pwd)"
|
||||||
if [[ -z "${_my_dir}" ]] || [[ ! -d "${_my_dir}" ]]
|
if [[ -z "${_my_dir}" ]] || [[ ! -d "${_my_dir}" ]]
|
||||||
then
|
then
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -1045,11 +1064,11 @@ Usage:
|
||||||
${_ME} disable (<ip> | <hostname> | <search string>)
|
${_ME} disable (<ip> | <hostname> | <search string>)
|
||||||
|
|
||||||
Description:
|
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.
|
search string.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 Entry successfully disabled.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
disable() {
|
disable() {
|
||||||
|
@ -1064,6 +1083,11 @@ disable() {
|
||||||
else
|
else
|
||||||
_debug printf "disable() \${_search_string}: %s\\n" "${_search_string}"
|
_debug printf "disable() \${_search_string}: %s\\n" "${_search_string}"
|
||||||
|
|
||||||
|
# Regular Expression Notes
|
||||||
|
#
|
||||||
|
# - Note double periods in regular expression in order to emulate /.+/,
|
||||||
|
# which apparently doesn't work properly with all versions of sed.
|
||||||
|
|
||||||
local _regex_ip
|
local _regex_ip
|
||||||
_regex_ip="^\\(${_search_string}[${_TAB_SPACE_}]..*\\)$"
|
_regex_ip="^\\(${_search_string}[${_TAB_SPACE_}]..*\\)$"
|
||||||
|
|
||||||
|
@ -1073,10 +1097,6 @@ disable() {
|
||||||
local _regex_hostname
|
local _regex_hostname
|
||||||
_regex_hostname="^\\([^#]..*[${_TAB_SPACE_}]${_search_string}\\)$"
|
_regex_hostname="^\\([^#]..*[${_TAB_SPACE_}]${_search_string}\\)$"
|
||||||
|
|
||||||
# Regular Expression Notes
|
|
||||||
#
|
|
||||||
# - Note double periods in regular expression in order to emulate /.+/,
|
|
||||||
# which apparently doesn't work properly with all versions of sed.
|
|
||||||
local _targets
|
local _targets
|
||||||
_targets=$(
|
_targets=$(
|
||||||
sed -n \
|
sed -n \
|
||||||
|
@ -1095,7 +1115,7 @@ disable() {
|
||||||
|
|
||||||
printf "Disabling:\\n%s\\n" "${_targets}"
|
printf "Disabling:\\n%s\\n" "${_targets}"
|
||||||
|
|
||||||
"${_SED_I_COMMAND[@]}" \
|
_sed_i \
|
||||||
-e "s/${_regex_ip}/\\#disabled: \\1/g" \
|
-e "s/${_regex_ip}/\\#disabled: \\1/g" \
|
||||||
-e "s/${_regex_commented_hostname}/\\#disabled: \\1/g" \
|
-e "s/${_regex_commented_hostname}/\\#disabled: \\1/g" \
|
||||||
-e "s/${_regex_hostname}/\\#disabled: \\1/g" \
|
-e "s/${_regex_hostname}/\\#disabled: \\1/g" \
|
||||||
|
@ -1110,7 +1130,11 @@ Usage:
|
||||||
${_ME} disabled
|
${_ME} disabled
|
||||||
|
|
||||||
Description:
|
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.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
disabled() {
|
disabled() {
|
||||||
list disabled
|
list disabled
|
||||||
|
@ -1143,11 +1167,11 @@ Usage:
|
||||||
${_ME} enable (<ip> | <hostname> | <search string>)
|
${_ME} enable (<ip> | <hostname> | <search string>)
|
||||||
|
|
||||||
Description:
|
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.
|
or search string.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 Entry successfully enabled.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
enable() {
|
enable() {
|
||||||
|
@ -1166,6 +1190,7 @@ enable() {
|
||||||
#
|
#
|
||||||
# - Note double periods in regular expression in order to emulate /.+/,
|
# - Note double periods in regular expression in order to emulate /.+/,
|
||||||
# which apparently doesn't work properly with all versions of sed.
|
# which apparently doesn't work properly with all versions of sed.
|
||||||
|
|
||||||
local _regex_ip
|
local _regex_ip
|
||||||
_regex_ip="^\\#disabled: \\(${_search_string}[${_TAB_SPACE_}]..*\\)$"
|
_regex_ip="^\\#disabled: \\(${_search_string}[${_TAB_SPACE_}]..*\\)$"
|
||||||
|
|
||||||
|
@ -1193,7 +1218,7 @@ enable() {
|
||||||
|
|
||||||
printf "Enabling:\\n%s\\n" "${_targets}"
|
printf "Enabling:\\n%s\\n" "${_targets}"
|
||||||
|
|
||||||
"${_SED_I_COMMAND[@]}" \
|
_sed_i \
|
||||||
-e "s/${_regex_ip}/\\1/g" \
|
-e "s/${_regex_ip}/\\1/g" \
|
||||||
-e "s/${_regex_commented_hostname}/\\1/g" \
|
-e "s/${_regex_commented_hostname}/\\1/g" \
|
||||||
-e "s/${_regex_hostname}/\\1/g" \
|
-e "s/${_regex_hostname}/\\1/g" \
|
||||||
|
@ -1208,7 +1233,11 @@ Usage:
|
||||||
${_ME} enabled
|
${_ME} enabled
|
||||||
|
|
||||||
Description:
|
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.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
enabled() {
|
enabled() {
|
||||||
list enabled
|
list enabled
|
||||||
|
@ -1235,40 +1264,52 @@ Usage:
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
List the existing IP / hostname pairs, optionally limited to a specified
|
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.
|
be printed.
|
||||||
|
|
||||||
|
Exit status:
|
||||||
|
0 One or more matching entries found.
|
||||||
|
1 Invalid parameters or entry not found.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
list() {
|
list() {
|
||||||
# Get the disabled records up front for the two cases where they are needed.
|
local _disabled_entries
|
||||||
local _disabled_records
|
_disabled_entries=$(
|
||||||
_disabled_records=$(
|
|
||||||
sed -n "s/^\\#disabled: \\(.*\\)$/\\1/p" "${HOSTS_PATH}"
|
sed -n "s/^\\#disabled: \\(.*\\)$/\\1/p" "${HOSTS_PATH}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# NOTE: use separate expressions since using `|` for the 'or' results in
|
||||||
|
# inconsistent behavior.
|
||||||
|
local _enabled_entries
|
||||||
|
_enabled_entries="$(
|
||||||
|
grep -v -e '^$' -e '^\s*\#' "${HOSTS_PATH}"
|
||||||
|
)"
|
||||||
|
|
||||||
if [[ -n "${1:-}" ]]
|
if [[ -n "${1:-}" ]]
|
||||||
then
|
then
|
||||||
if [[ "${1}" == "disabled" ]]
|
if [[ "${1}" == "disabled" ]]
|
||||||
then
|
then
|
||||||
_print_entries "${_disabled_records}"
|
[[ -z "${_disabled_entries}" ]] && return 1
|
||||||
|
_print_entries "${_disabled_entries}"
|
||||||
elif [[ "${1}" == "enabled" ]]
|
elif [[ "${1}" == "enabled" ]]
|
||||||
then
|
then
|
||||||
_print_entries "$(grep -v -e '^$' -e '^\s*\#' "${HOSTS_PATH}")"
|
[[ -z "${_enabled_entries}" ]] && return 1
|
||||||
|
_print_entries "${_enabled_entries}"
|
||||||
else
|
else
|
||||||
show "${1}"
|
show "${1}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# NOTE: use separate expressions since using a | for the or results in
|
[[ -z "${_enabled_entries}" ]] &&
|
||||||
# inconsistent behavior.
|
[[ -z "${_enabled_entries}" ]] &&
|
||||||
local _enabled_records
|
return 1
|
||||||
_enabled_records="$(grep -v -e '^$' -e '^\s*\#' "${HOSTS_PATH}")"
|
|
||||||
_print_entries "${_enabled_records:-}"
|
|
||||||
|
|
||||||
if [[ -n "${_disabled_records:-}" ]]
|
_print_entries "${_enabled_entries:-}"
|
||||||
|
|
||||||
|
if [[ -n "${_disabled_entries:-}" ]]
|
||||||
then
|
then
|
||||||
[[ -n "${_enabled_records:-}" ]] && printf "\\n"
|
[[ -n "${_enabled_entries:-}" ]] && printf "\\n"
|
||||||
printf "Disabled:\\n"
|
printf "Disabled:\\n"
|
||||||
printf "%s\\n" "---------"
|
printf "%s\\n" "---------"
|
||||||
_print_entries "${_disabled_records}"
|
_print_entries "${_disabled_entries}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -1284,12 +1325,12 @@ Options:
|
||||||
--force Skip the confirmation prompt.
|
--force Skip the confirmation prompt.
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
Remove one or more records based on a given IP address, hostname, or search
|
Remove one or more entries based on a given IP address, hostname, or search
|
||||||
string. If an IP and hostname are both provided, only records matching the
|
string. If an IP and hostname are both provided, only entries matching the
|
||||||
IP and hostname pair will be removed.
|
IP and hostname pair will be removed.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 Entry successfully removed.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
remove() {
|
remove() {
|
||||||
|
@ -1341,7 +1382,7 @@ remove() {
|
||||||
#
|
#
|
||||||
# Note double periods in regular expression in order to emulate /.+/,
|
# Note double periods in regular expression in order to emulate /.+/,
|
||||||
# which apparently doesn't work properly with all versions of sed.
|
# which apparently doesn't work properly with all versions of sed.
|
||||||
#
|
|
||||||
# IP / Hostname pair regular expressions:
|
# IP / Hostname pair regular expressions:
|
||||||
local _regex_ip_hostname_commented
|
local _regex_ip_hostname_commented
|
||||||
_regex_ip_hostname_commented="^\\(${_search_ip}[${_TAB_SPACE_}]*${_search_hostname}[${_TAB_SPACE_}]..*\\)$"
|
_regex_ip_hostname_commented="^\\(${_search_ip}[${_TAB_SPACE_}]*${_search_hostname}[${_TAB_SPACE_}]..*\\)$"
|
||||||
|
@ -1359,18 +1400,18 @@ remove() {
|
||||||
local _regex_hostname
|
local _regex_hostname
|
||||||
_regex_hostname="^\\(..*[${_TAB_SPACE_}]${_search_string}\\)$"
|
_regex_hostname="^\\(..*[${_TAB_SPACE_}]${_search_string}\\)$"
|
||||||
|
|
||||||
local _target_records
|
local _target_entries
|
||||||
|
|
||||||
if ((_is_search_pair))
|
if ((_is_search_pair))
|
||||||
then
|
then
|
||||||
_target_records=$(
|
_target_entries=$(
|
||||||
sed -n \
|
sed -n \
|
||||||
-e "s/${_regex_ip_hostname_commented}/\\1/p" \
|
-e "s/${_regex_ip_hostname_commented}/\\1/p" \
|
||||||
-e "s/${_regex_ip_hostname}/\\1/p" \
|
-e "s/${_regex_ip_hostname}/\\1/p" \
|
||||||
"${HOSTS_PATH}"
|
"${HOSTS_PATH}"
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
_target_records=$(
|
_target_entries=$(
|
||||||
sed -n \
|
sed -n \
|
||||||
-e "s/${_regex_ip}/\\1/p" \
|
-e "s/${_regex_ip}/\\1/p" \
|
||||||
-e "s/${_regex_commented_hostname}/\\1/p" \
|
-e "s/${_regex_commented_hostname}/\\1/p" \
|
||||||
|
@ -1379,14 +1420,14 @@ remove() {
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z "${_target_records:-}" ]]
|
if [[ -z "${_target_entries:-}" ]]
|
||||||
then
|
then
|
||||||
_exit_1 printf "No matching records found.\\n"
|
_exit_1 printf "No matching entries found.\\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! ((_force_skip_prompt))
|
if ! ((_force_skip_prompt))
|
||||||
then
|
then
|
||||||
printf "Removing the following records:\\n%s\\n" "${_target_records}"
|
printf "Removing the following entries:\\n%s\\n" "${_target_entries}"
|
||||||
|
|
||||||
while true
|
while true
|
||||||
do
|
do
|
||||||
|
@ -1406,19 +1447,19 @@ remove() {
|
||||||
|
|
||||||
if ((_is_search_pair))
|
if ((_is_search_pair))
|
||||||
then
|
then
|
||||||
"${_SED_I_COMMAND[@]}" \
|
_sed_i \
|
||||||
-e "/${_regex_ip_hostname_commented}/d" \
|
-e "/${_regex_ip_hostname_commented}/d" \
|
||||||
-e "/${_regex_ip_hostname}/d" \
|
-e "/${_regex_ip_hostname}/d" \
|
||||||
"${HOSTS_PATH}"
|
"${HOSTS_PATH}"
|
||||||
else
|
else
|
||||||
"${_SED_I_COMMAND[@]}" \
|
_sed_i \
|
||||||
-e "/${_regex_ip}/d" \
|
-e "/${_regex_ip}/d" \
|
||||||
-e "/${_regex_commented_hostname}/d" \
|
-e "/${_regex_commented_hostname}/d" \
|
||||||
-e "/${_regex_hostname}/d" \
|
-e "/${_regex_hostname}/d" \
|
||||||
"${HOSTS_PATH}"
|
"${HOSTS_PATH}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf "Removed:\\n%s\\n" "${_target_records}"
|
printf "Removed:\\n%s\\n" "${_target_entries}"
|
||||||
}
|
}
|
||||||
desc "delete" "$(desc --get 'remove')"
|
desc "delete" "$(desc --get 'remove')"
|
||||||
delete() { remove "${@}"; }
|
delete() { remove "${@}"; }
|
||||||
|
@ -1431,6 +1472,10 @@ Usage:
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
Search entries for <search string>.
|
Search entries for <search string>.
|
||||||
|
|
||||||
|
Exit status:
|
||||||
|
0 One or more matching entries found.
|
||||||
|
1 Invalid parameters or entry not found.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
search() {
|
search() {
|
||||||
if [[ -z "${1:-}" ]]
|
if [[ -z "${1:-}" ]]
|
||||||
|
@ -1452,38 +1497,37 @@ Description:
|
||||||
Print entries matching a given IP address, hostname, or search string.
|
Print entries matching a given IP address, hostname, or search string.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 One or more matching entries found.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
show() {
|
show() {
|
||||||
if [[ -n "${1:-}" ]]
|
if [[ -n "${1:-}" ]]
|
||||||
then
|
then
|
||||||
# Run `sed` before `grep` to avoid conflict that supresses `sed` output.
|
# Run `sed` before `grep` to avoid conflict that supresses `sed` output.
|
||||||
local _disabled_records
|
local _disabled_entries
|
||||||
_disabled_records="$(
|
_disabled_entries="$(
|
||||||
sed -n "s/^\\#disabled: \\(.*${1}.*\\)$/\\1/p" "${HOSTS_PATH}"
|
sed -n "s/^\\#disabled: \\(.*${1}.*\\)$/\\1/p" "${HOSTS_PATH}"
|
||||||
)"
|
)"
|
||||||
|
|
||||||
local _enabled_records
|
local _enabled_entries
|
||||||
_enabled_records="$(
|
_enabled_entries="$(
|
||||||
grep --invert-match "^#" "${HOSTS_PATH}" | grep "${1}" || true
|
grep --invert-match "^#" "${HOSTS_PATH}" | grep "${1}" || true
|
||||||
)"
|
)"
|
||||||
|
|
||||||
if [[ -z "${_disabled_records}" ]] &&
|
if [[ -z "${_disabled_entries}" ]] &&
|
||||||
[[ -z "${_enabled_records}" ]]
|
[[ -z "${_enabled_entries}" ]]
|
||||||
then
|
then
|
||||||
_return_1 printf "No matching entries.\\n"
|
_return_1 printf "No matching entries.\\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
_print_entries "${_enabled_records}"
|
_print_entries "${_enabled_entries}"
|
||||||
|
|
||||||
|
if [[ -n "${_disabled_entries}" ]]
|
||||||
if [[ -n "${_disabled_records}" ]]
|
|
||||||
then
|
then
|
||||||
[[ -n "${_enabled_records}" ]] && printf "\\n"
|
[[ -n "${_enabled_entries}" ]] && printf "\\n"
|
||||||
printf "Disabled:\\n"
|
printf "Disabled:\\n"
|
||||||
printf "%s\\n" "---------"
|
printf "%s\\n" "---------"
|
||||||
_print_entries "${_disabled_records}"
|
_print_entries "${_disabled_entries}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
help show
|
help show
|
||||||
|
@ -1525,7 +1569,7 @@ Description:
|
||||||
Unblock one or more hostnames by removing the entries from the hosts file.
|
Unblock one or more hostnames by removing the entries from the hosts file.
|
||||||
|
|
||||||
Exit status:
|
Exit status:
|
||||||
0 Success.
|
0 <hostname> successfully unblocked.
|
||||||
1 Invalid parameters or entry not found.
|
1 Invalid parameters or entry not found.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
unblock() {
|
unblock() {
|
||||||
|
|
2
package-lock.json
generated
2
package-lock.json
generated
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "hosts.sh",
|
"name": "hosts.sh",
|
||||||
"version": "3.6.2",
|
"version": "3.6.4",
|
||||||
"lockfileVersion": 1
|
"lockfileVersion": 1
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "hosts.sh",
|
"name": "hosts.sh",
|
||||||
"version": "3.6.2",
|
"version": "3.6.4",
|
||||||
"description": "A command line tool for managing hosts file entries.",
|
"description": "A command line tool for managing hosts file entries.",
|
||||||
"global": true,
|
"global": true,
|
||||||
"install": "make install",
|
"install": "make install",
|
||||||
|
|
|
@ -18,7 +18,7 @@ load test_helper
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -34,6 +34,13 @@ load test_helper
|
||||||
[[ "${lines[2]}" == "" ]]
|
[[ "${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 ########################################################################
|
# help ########################################################################
|
||||||
|
|
||||||
@test "\`help disabled\` exits with status 0." {
|
@test "\`help disabled\` exits with status 0." {
|
||||||
|
|
|
@ -18,7 +18,7 @@ load test_helper
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -36,6 +36,18 @@ load test_helper
|
||||||
[[ "${lines[4]}" =~ 127.0.0.2[[:space:]]+example.com ]]
|
[[ "${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 ########################################################################
|
# help ########################################################################
|
||||||
|
|
||||||
@test "\`help enabled\` exits with status 0." {
|
@test "\`help enabled\` exits with status 0." {
|
||||||
|
|
|
@ -18,7 +18,7 @@ load test_helper
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -60,7 +60,7 @@ Disabled:
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -78,6 +78,18 @@ Disabled:
|
||||||
[[ "${lines[4]}" =~ 127\.0\.0\.2[[:space:]]+example.com ]]
|
[[ "${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` #######################################################
|
# `hosts list disabled` #######################################################
|
||||||
|
|
||||||
@test "\`list disabled\` exits with status 0." {
|
@test "\`list disabled\` exits with status 0." {
|
||||||
|
@ -94,7 +106,7 @@ Disabled:
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -110,6 +122,13 @@ Disabled:
|
||||||
[[ "${lines[2]}" == "" ]]
|
[[ "${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>` ################################################
|
# `hosts list <search string>` ################################################
|
||||||
|
|
||||||
@test "\`list <search string>\` exits with status 0." {
|
@test "\`list <search string>\` exits with status 0." {
|
||||||
|
@ -125,7 +144,7 @@ Disabled:
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -140,7 +159,7 @@ Disabled:
|
||||||
[[ "${lines[2]}" == "" ]]
|
[[ "${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
||||||
|
@ -155,7 +174,7 @@ Disabled:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
||||||
|
@ -172,6 +191,13 @@ Disabled:
|
||||||
[[ "${lines[4]}" == "" ]]
|
[[ "${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 ########################################################################
|
# help ########################################################################
|
||||||
|
|
||||||
@test "\`help list\` exits with status 0." {
|
@test "\`help list\` exits with status 0." {
|
||||||
|
|
|
@ -53,7 +53,7 @@ load test_helper
|
||||||
run "${_HOSTS}" remove 127.0.0.3 --force
|
run "${_HOSTS}" remove 127.0.0.3 --force
|
||||||
printf "\${status}: %s\\n" "${status}"
|
printf "\${status}: %s\\n" "${status}"
|
||||||
printf "\${output}: '%s'\\n" "${output}"
|
printf "\${output}: '%s'\\n" "${output}"
|
||||||
[[ ${output} == "${_ERROR_PREFIX}No matching records found." ]]
|
[[ ${output} == "${_ERROR_PREFIX}No matching entries found." ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
# `hosts remove <ip> --force` #################################################
|
# `hosts remove <ip> --force` #################################################
|
||||||
|
|
|
@ -29,14 +29,8 @@ load test_helper
|
||||||
run "${_HOSTS}" search
|
run "${_HOSTS}" search
|
||||||
printf "\${status}: %s\\n" "${status}"
|
printf "\${status}: %s\\n" "${status}"
|
||||||
printf "\${output}: '%s'\\n" "${output}"
|
printf "\${output}: '%s'\\n" "${output}"
|
||||||
_expected="\
|
[[ "${lines[0]}" == "Usage:" ]]
|
||||||
Usage:
|
[[ "${lines[1]}" == " hosts search <search string>" ]]
|
||||||
hosts search <search string>
|
|
||||||
|
|
||||||
Description:
|
|
||||||
Search entries for <search string>."
|
|
||||||
_compare "'${_expected}'" "'${output}'"
|
|
||||||
[[ "${output}" == "${_expected}" ]]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# `hosts search enabled` ######################################################
|
# `hosts search enabled` ######################################################
|
||||||
|
@ -55,7 +49,7 @@ Description:
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -73,6 +67,18 @@ Description:
|
||||||
[[ "${lines[4]}" =~ 127.0.0.2[[:space:]]+example.com ]]
|
[[ "${lines[4]}" =~ 127.0.0.2[[:space:]]+example.com ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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` #####################################################
|
# `hosts search disabled` #####################################################
|
||||||
|
|
||||||
@test "\`search disabled\` exits with status 0." {
|
@test "\`search disabled\` exits with status 0." {
|
||||||
|
@ -89,7 +95,7 @@ Description:
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -105,6 +111,13 @@ Description:
|
||||||
[[ "${lines[2]}" == "" ]]
|
[[ "${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>` ################################################
|
# `hosts search <search string>` ################################################
|
||||||
|
|
||||||
@test "\`search <search string>\` exits with status 0." {
|
@test "\`search <search string>\` exits with status 0." {
|
||||||
|
@ -120,7 +133,7 @@ Description:
|
||||||
[[ ${status} -eq 0 ]]
|
[[ ${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -135,7 +148,7 @@ Description:
|
||||||
[[ "${lines[2]}" == "" ]]
|
[[ "${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
||||||
|
@ -149,7 +162,7 @@ Description:
|
||||||
[[ "${lines[2]}" == "" ]]
|
[[ "${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
||||||
|
@ -166,6 +179,13 @@ Description:
|
||||||
[[ "${lines[4]}" == "" ]]
|
[[ "${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 ########################################################################
|
# help ########################################################################
|
||||||
|
|
||||||
@test "\`help search\` exits with status 0." {
|
@test "\`help search\` exits with status 0." {
|
||||||
|
|
|
@ -21,7 +21,7 @@ load test_helper
|
||||||
|
|
||||||
# `hosts show <no matching>` ##################################################
|
# `hosts show <no matching>` ##################################################
|
||||||
|
|
||||||
@test "\`show <query>\` with no matching records with status 1." {
|
@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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -77,7 +77,7 @@ load test_helper
|
||||||
|
|
||||||
# `hosts show <search string>` ################################################
|
# `hosts show <search string>` ################################################
|
||||||
|
|
||||||
@test "\`show <search string>\` exits with status 0 and shows matching records." {
|
@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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net
|
run "${_HOSTS}" add 0.0.0.0 example.net
|
||||||
|
@ -94,7 +94,7 @@ load test_helper
|
||||||
[[ "${lines[2]}" == "" ]]
|
[[ "${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
||||||
|
@ -109,7 +109,7 @@ load test_helper
|
||||||
[[ "${lines[2]}" == "" ]]
|
[[ "${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.com
|
||||||
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
run "${_HOSTS}" add 0.0.0.0 example.net "Example Comment"
|
||||||
|
|
|
@ -49,7 +49,7 @@ load test_helper
|
||||||
run "${_HOSTS}" unblock example.net
|
run "${_HOSTS}" unblock example.net
|
||||||
printf "\${status}: %s\\n" "${status}"
|
printf "\${status}: %s\\n" "${status}"
|
||||||
printf "\${output}: '%s'\\n" "${output}"
|
printf "\${output}: '%s'\\n" "${output}"
|
||||||
[[ ${output} == "${_ERROR_PREFIX}No matching records found." ]]
|
[[ ${output} == "${_ERROR_PREFIX}No matching entries found." ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
# `hosts unblock <hostname>` ##################################################
|
# `hosts unblock <hostname>` ##################################################
|
||||||
|
|
Loading…
Reference in New Issue
Block a user