You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.8 KiB
135 lines
2.8 KiB
#!/usr/bin/env bash |
|
|
|
function print_help(){ |
|
echo -e "hosts\t\tManages hosts in the yaml file" |
|
echo -e "\tlist\tLists hosts in the project" |
|
echo -e "\thosts_file\tUpdates the hosts file to reflect the hosts on this project" |
|
echo -e "\tip\tUses fzf to select an IP from the project" |
|
echo -e "\tadd\tAdd an IP address" |
|
} |
|
|
|
function listhosts(){ |
|
local current="$(project current --path)" |
|
index="$current/index.yaml" |
|
if [ ! -f "$index" ]; then |
|
echo "No index file" |
|
exit 1 |
|
fi |
|
if [ $(yq -r '.hosts | length ' "$index" ) -gt 0 ]; then |
|
yq -r '.hosts[] | [ |
|
.ip, |
|
(if ( .domain | type == "array") then .domain | join(",") else .domain end), |
|
.description |
|
] | join(",")' "$index" |
|
else |
|
echo "No hosts in index file" |
|
exit 1 |
|
fi |
|
} |
|
|
|
function get_hosts(){ |
|
local current="$(project current --path)" |
|
index="$current/index.yaml" |
|
if [ ! -f "$index" ]; then |
|
echo "" |
|
exit 0 |
|
fi |
|
if [ $(yq -r '.hosts | length ' "$index" ) -gt 0 ]; then |
|
yq -r '.hosts[]| select(.domain) | [ |
|
.ip, |
|
(if ( .domain | type == "array") then .domain | join(",") else .domain end) |
|
] | join(",,")' "$index" | tr ',' '\t' |
|
else |
|
echo "" |
|
exit 0 |
|
fi |
|
} |
|
|
|
function host_file(){ |
|
sed '/# Project specific hosts/,$ d' /etc/hosts > /tmp/newhosts |
|
cat /tmp/newhosts > /etc/hosts |
|
rm /tmp/newhosts |
|
|
|
local current="$(project current --path)" |
|
if [ -n "$current" ]; then |
|
( |
|
echo "# Project specific hosts - Everything after this line will be deleted when the project is changed" |
|
get_hosts |
|
) >> /etc/hosts |
|
fi |
|
} |
|
|
|
function getip(){ |
|
local current="$(project current --path)" |
|
index="$current/index.yaml" |
|
case "$1" in |
|
--fzf) |
|
ip=$( listhosts | fzf -1 --no-preview | cut -d',' -f1) |
|
;; |
|
--dmenu) |
|
ip=$( listhosts | dmenu | cut -d',' -f1) |
|
echo "$ip" | xclip -selection primary |
|
echo "$ip" | xclip -selection clipboard |
|
;; |
|
--rofi) |
|
ip=$( listhosts | rofi -dmenu | cut -d',' -f1) |
|
echo "$ip" | xclip -selection primary |
|
echo "$ip" | xclip -selection clipboard |
|
;; |
|
*) |
|
ip=$( listhosts | fzf -1 --no-preview | cut -d',' -f1) |
|
;; |
|
esac |
|
echo $ip |
|
} |
|
|
|
function addip(){ |
|
local current="$(project current --path)" |
|
index="$current/index.yaml" |
|
echo -n "Domain: " |
|
read domain < /dev/tty |
|
echo -n "IP: " |
|
read ip < /dev/tty |
|
echo -n "Description: " |
|
read description < /dev/tty |
|
local host='{}' |
|
if [ -n "$domain" ]; then |
|
host="$(echo $host | jq ".domain=\"$domain\"" )" |
|
fi |
|
if [ -n "$ip" ]; then |
|
host="$(echo $host | jq ".ip=\"$ip\"" )" |
|
fi |
|
if [ -n "$description" ]; then |
|
host="$(echo $host | jq ".description=\"$description\"" )" |
|
fi |
|
echo $host |
|
yq --yaml-output ".hosts |= .+ [$host]" "$index" > newindex |
|
rm "$index" |
|
mv newindex "$index" |
|
host_file |
|
} |
|
|
|
case "$1" in |
|
-h|--help) |
|
print_help | column -t -s" " |
|
exit 0 |
|
;; |
|
--parent-help) |
|
print_help |
|
exit 0 |
|
;; |
|
list) |
|
listhosts |
|
;; |
|
hosts_file) |
|
shift |
|
host_file "$@" |
|
;; |
|
ip) |
|
getip |
|
;; |
|
add) |
|
addip |
|
;; |
|
esac |
|
|
|
|