On Tue, 18 Jun 2013, Matthew Cengia wrote:

> On 2013-06-18 19:04, Tim Connors wrote:
> [...]
> > This seems to be a suitably hacking way of doing it:
> >
> >
> > # build an array of all replacements /0../32 to /0.0.0.0 ->
> > # /255.255.255.255 so that any occurences can quickly be replaced
> > # globally in any required filter
> > cidr2netmaskfilter=
> > for cidr in `seq 0 32` ; do
> >     netmask=`cidr2mask "$cidr"`
> >     cidr2netmaskfilter="$cidr2netmaskfilter; s!/$cidr !/$netmask!g"
> > done
> >
> > function filter_cidr2mask () {
> >     sed "$cidr2netmaskfilter"
> > }
> [...]
>
> Hi Tim,
>
> A couple of pointers: I'd discourage the use of seq[1]. If you're using
> bash, which I assume you are given that's available on all RHEL
> instances, I'd use {0..32} instead of `seq 0 32`.

Never heard of that before.  Definitely not POSIX (gut feeling here - no
POSIX reference manual handy, but it doesn't work in dash).  Never seen
seq not work (assumed it was posix - I even saw it work on HP-UX of all
things.  Heck, it probably even works on SCO).

> I also advice using
> $(cidr2mask "$cidr") rather than `cidr2mask "$cidr"`; The $() notation
> is newer and more predictable, especially with regard to quoting.

Yeah, trying to get out of the habit (` is still prettier for small
snippets), however I thought $(prog) is not POSIX (I'm straying well away
from posix in this program anyway), whereas ` is.  (how do you google for
"`" and "$(" ?)

> Also, what *is* cidr2mask? I've not seen it anywhere before.

You own favourite shell function.  Not the one I originally wrote which
seemed to work for the common cases until I threw a non-class address at
it while testing months after initial deploy (woops!) (meh, famous last
words, it's not like it's ever going to be used elsewhere other than our
class B).

Here's some useful network calculations someone might find useful (after
suitably debugging and commenting), that should never be deployed in
production because I do silly things like work out what $0 is (so can be
symlinked to netcalc, bcasecacl, cidr2mask, mask2cidr) without any sanity
checking:
http://rather.puzzling.org/~tconnors/code/cidr2mask

> Further, your sed appears to be expecting a space after "$cidr", but
> isn't putting one back after "$netmask". That could give you grief.

Woops, that what happens when you want to fly out of the door before 7 and
it's already 7:04.  Tested fine!  Good thing I ran with --noop rather than
deploying across the cluster :)  It's only me on call.  Guess I better
check my phone to see whether anyone called while I was on the bike :)

> Finally, were I writing this myself (in the absense of cidr2mask), I'd
> probably do something like the following:
>
> | filter_cidr2mask(){
> |   cidr=(
> |   0.0.0.0
> |   128.0.0.0
> |   192.0.0.0
> |   224.0.0.0
> |   240.0.0.0
> |   248.0.0.0
> |   252.0.0.0
> |   254.0.0.0
> |   255.0.0.0
> |   255.128.0.0
> |   255.192.0.0
> |   255.224.0.0
> |   255.240.0.0
> |   255.248.0.0
> |   255.252.0.0
> |   255.254.0.0
> |   255.255.0.0
> |   255.255.128.0
> |   255.255.192.0
> |   255.255.224.0
> |   255.255.240.0
> |   255.255.248.0
> |   255.255.252.0
> |   255.255.254.0
> |   255.255.255.0
> |   255.255.255.128
> |   255.255.255.192
> |   255.255.255.224
> |   255.255.255.240
> |   255.255.255.248
> |   255.255.255.252
> |   255.255.255.254
> |   255.255.255.255
> |   )

Urk.  Big array not generated by a simple loop.

> |   sedExp=
> |   for ((i=0; i<=32; i++)); do
> |     sedExp+="s!/\<$i\>!/${cidr[$i]}!g; "
> |   done
> |
> |   sed "$sedExp"
> | }
>
> 1.  <greybot> seq(1) is a highly nonstandard program used to count to 10
>               in silly Linux howtos. Use one of these: for ((i = 1; i <=
>               10; i++)); do ...  (bash 2.04+/zsh/ksh93), i=; while ((i++
>               <= 10)); do ...  (bash/mksh/ksh88), i=; while [ $(( ( i +=
>               1 ) <= 10 )) -ne 0 ]; do ...  (POSIX). Don't do this: for
>               x in $(...); do ... Don't do this: for i in {1..10}; do
>               ...

Heh.


-- 
Tim Connors
_______________________________________________
luv-main mailing list
[email protected]
http://lists.luv.asn.au/listinfo/luv-main

Reply via email to