Última atividade 1 month ago

Revisão f4bb21624e1f7051a7feb41e612654e4d754ad8e

gistfile1.txt Bruto
1#!/usr/bin/env bash
2
3# ============================================
4# IP Assignment
5# ============================================
6
7function ip::assigned() {
8 grep -h "^Address" "$(ctx::clients)"/*.conf 2>/dev/null \
9 | awk '{print $3}' \
10 | cut -d'/' -f1
11}
12
13function ip::is_assigned() {
14 local candidate="$1"
15 ip::assigned | grep -q "^${candidate}$"
16}
17
18function ip::next_for_type() {
19 local type="$1"
20 local subnet
21 subnet=$(config::subnet_for "$type")
22
23 if [[ -z "$subnet" ]]; then
24 log::error "Unknown device type: ${type}"
25 return 1
26 fi
27
28 for i in $(seq 1 254); do
29 local candidate="${subnet}.${i}"
30 if ! ip::is_assigned "$candidate"; then
31 echo "$candidate"
32 return 0
33 fi
34 done
35
36 log::error "No available IPs in subnet ${subnet}.0/24"
37 return 1
38}
39
40# ============================================
41# Validation
42# ============================================
43
44function ip::is_valid() {
45 local ip="$1"
46 [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}(/([0-9]|[1-2][0-9]|3[0-2]))?$ ]]
47}
48
49function ip::is_cidr() {
50 [[ "$1" == *"/"* ]]
51}
52
53function ip::validate() {
54 local ip="$1"
55 if ! ip::is_valid "$ip"; then
56 log::error "Invalid IP or CIDR: ${ip}"
57 return 1
58 fi
59 return 0
60}
61
62function ip::require_valid() {
63 local ip="$1"
64 ip::validate "$ip" || exit 1
65}
66