ip2cidr

Small and simple program for converting a netmask into a CIDR
git clone git://git.noxz.tech/ip2cidr
Log | Files | Refs | README | LICENSE

commit 33eb256fea09d4113b6b9dffa2752b6abf997324
parent 62d5518179e42ea5970401b41efcbb8fc33e6bd0
Author: z0noxz <chris@noxz.tech>
Date:   Tue,  7 Aug 2018 08:28:39 +0200

make POSIX compliant

Diffstat:
Mip2cidr | 101++++++++++++++++++++++++++++++++++++++++++-------------------------------------
1 file changed, 54 insertions(+), 47 deletions(-)

diff --git a/ip2cidr b/ip2cidr @@ -1,6 +1,6 @@ #!/bin/sh -read -d '' license << EOF -Converts IPADDRESS to CIDR, or return CIDR if already a valid one +license=' +Converts IPADDRESS to CIDR, or returns CIDR if already a valid one Copyright (C) 2018 z0noxz, <chris@noxz.tech> This program is free software: you can redistribute it and/or modify @@ -15,66 +15,73 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. -EOF +' -function ip2cidr { +count_ones() { - local ip=$1 - local OIFS=$IFS - local D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}) - local binary="" - local ones="" + dec=$1 + base=2 + result=0 - IFS=\. read -ra ip <<< "$ip" - IFS=$OIFS - - binary="${D2B[ip[0]]}${D2B[ip[1]]}${D2B[ip[2]]}${D2B[ip[3]]}" - ones="${binary//0}" + while [ "$dec" -ne 0 ]; do + if [ $((dec % base)) -eq 1 ]; then + result=$((result+1)) + fi + dec=$((dec / base)) + done - printf "%d\n" ${#ones} + printf '%d' "$result" } -function isip { - - local ip=$1 - local OIFS=$IFS - - if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then - IFS=\. read -ra ip <<< "$ip" - IFS=$OIFS - if [[ \ - ${ip[0]} -le 255 &&\ - ${ip[1]} -le 255 &&\ - ${ip[2]} -le 255 &&\ - ${ip[3]} -le 255 \ - ]]; then - return 0 +do_ip2cidr() { + + ip=$1 + OIFS=$IFS + result=0 + i=0 + + IFS=\. + for item in $ip; do + if [ "$item" -eq "$item" ] 2> /dev/null && \ + [ "$item" -le 256 ] && [ "$item" -ge 0 ]; then + i=$((i+1)) + case $i in + 1) + result=$((result+item*16777216)) + ;; + 2) + result=$((result+item*65536)) + ;; + 3) + result=$((result+item*256)) + ;; + 4) + result=$((result+item)) + ;; + esac + else + return 1 fi - fi - return 1 + done + IFS=$OIFS + + printf '%d\n' "$(count_ones "$result")" } -# check if input already is a CIDR -if [[ $1 =~ ^[0-9]{1,2}$ && $1 -le 32 && $1 -gt 0 ]]; then - echo "$1" - exit 0 +# check if input already is a CIDR, and if not process it +if [ "$1" -eq "$1" ] 2> /dev/null && [ "$1" -le 32 ] && [ "$1" -gt 0 ]; then + printf '%d\n' "$1" && exit 0 +else + do_ip2cidr "$1" && exit 0 fi -# check if input is a valid IP, then return CIDR from IP -if isip $1; then - ip2cidr $1 - exit 0 -fi # if all fails print usage program_name="${0##*/}" -read -d '' usage << EOF -Usage: $program_name IPADDRESS +printf 'Usage: %s IPADDRESS LICENSE NOTICE - -$license -EOF -printf "%s\n\n" "$usage" >&2 +%s +' "$program_name" "$license" >&2 exit 1