Message ID | 1519383935-3556-2-git-send-email-jonatan.schlag@ipfire.org |
---|---|
State | New |
Headers | show |
Series | [1/3] Add new function: device_get_by_assigned_ip_address() | expand |
On Fri, 2018-02-23 at 11:05 +0000, Jonatan Schlag via network wrote: > This function is neede by IPsec to set the routes correctly. > We can now now find a source IP for a given net. > This way is ugly because the source IP > is unpredictable if we get multiple IPs. > > Signed-off-by: Jonatan Schlag <jonatan.schlag@ipfire.org> > --- > src/functions/functions.ip | 25 +++++++++++++++++++++++++ > 1 file changed, 25 insertions(+) > > diff --git a/src/functions/functions.ip b/src/functions/functions.ip > index 3b43da7..ef40bcc 100644 > --- a/src/functions/functions.ip > +++ b/src/functions/functions.ip > @@ -205,3 +205,28 @@ ip_address_del() { > > return ${EXIT_OK} > } > + > +# Get all currently assigned addresse for a given network > +ip_get_assigned_addresses_from_net() { > + local net=${1} > + shift > + local args="$@" > + > + assert ip_net_is_valid ${net} I think this assertion isn't needed because "ip" will check this and just throw an error. > + local line > + local ips It would be nicer if the "ips" variable would be called "addresses" because that is the term that we actually use most of the time. > + # We read the output of $(ip addr show to ${net} ${args}) > + while read -r line; do > + # We are only interested in lines which start with inet or > inet6 > + [[ "${line}" =~ ^(inet6 |inet ) ]] || continue > + > + # We need the second word the line > + line=(${line}) > + list_append "ips" "$(ip_split_prefix "${line[1]}")" You could also achieve this by passing the line argument up to the first space and use the "%" and "#" parameters in the brackets. I am not sure if the conversion to the array has any implications. > + done <<< "$(ip addr show to "${net}" ${args})" > + > + # We sort the list to get the lowest IP as first item > + print "$(list_sort ${ips})" You don't need to call print here. This will create a subshell for the list_sort call, but list_sort already prints the output, so you can just write: list_sort ${ips} That will be a lot faster. > +} -Michael
Hi, Am Sa, 24. Feb, 2018 um 12:53 schrieb Michael Tremer <michael.tremer@ipfire.org>: > On Fri, 2018-02-23 at 11:05 +0000, Jonatan Schlag via network wrote: >> This function is neede by IPsec to set the routes correctly. >> We can now now find a source IP for a given net. >> This way is ugly because the source IP >> is unpredictable if we get multiple IPs. >> >> Signed-off-by: Jonatan Schlag <jonatan.schlag@ipfire.org> >> --- >> src/functions/functions.ip | 25 +++++++++++++++++++++++++ >> 1 file changed, 25 insertions(+) >> >> diff --git a/src/functions/functions.ip b/src/functions/functions.ip >> index 3b43da7..ef40bcc 100644 >> --- a/src/functions/functions.ip >> +++ b/src/functions/functions.ip >> @@ -205,3 +205,28 @@ ip_address_del() { >> >> return ${EXIT_OK} >> } >> + >> +# Get all currently assigned addresse for a given network >> +ip_get_assigned_addresses_from_net() { >> + local net=${1} >> + shift >> + local args="$@" >> + >> + assert ip_net_is_valid ${net} > > I think this assertion isn't needed because "ip" will check this and > just throw > an error. But can we catch the error in a nice way? I could have a look at this but using $? should be harder then to use our normal functions. > >> + local line >> + local ips > > It would be nicer if the "ips" variable would be called "addresses" > because that > is the term that we actually use most of the time. Ok > > >> + # We read the output of $(ip addr show to ${net} ${args}) >> + while read -r line; do >> + # We are only interested in lines which start with inet or >> inet6 >> + [[ "${line}" =~ ^(inet6 |inet ) ]] || continue >> + >> + # We need the second word the line >> + line=(${line}) >> + list_append "ips" "$(ip_split_prefix "${line[1]}")" > > You could also achieve this by passing the line argument up to the > first space > and use the "%" and "#" parameters in the brackets. > > I am not sure if the conversion to the array has any implications. So how can we make shure that this has no implications? > > >> + done <<< "$(ip addr show to "${net}" ${args})" >> + >> + # We sort the list to get the lowest IP as first item >> + print "$(list_sort ${ips})" > > You don't need to call print here. This will create a subshell for > the list_sort > call, but list_sort already prints the output, so you can just write: > > list_sort ${ips} > > That will be a lot faster. Ok > > >> +} > > -Michael Hi,<br><br>Am Sa, 24. Feb, 2018 um 12:53 schrieb Michael Tremer <michael.tremer@ipfire.org>:<br> <blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;">On Fri, 2018-02-23 at 11:05 +0000, Jonatan Schlag via network wrote: <blockquote> This function is neede by IPsec to set the routes correctly. We can now now find a source IP for a given net. This way is ugly because the source IP is unpredictable if we get multiple IPs. Signed-off-by: Jonatan Schlag <<a href="mailto:jonatan.schlag@ipfire.org">jonatan.schlag@ipfire.org</a>> --- src/functions/functions.ip | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/functions/functions.ip b/src/functions/functions.ip index 3b43da7..ef40bcc 100644 --- a/src/functions/functions.ip +++ b/src/functions/functions.ip @@ -205,3 +205,28 @@ ip_address_del() { return ${EXIT_OK} } + +# Get all currently assigned addresse for a given network +ip_get_assigned_addresses_from_net() { + local net=${1} + shift + local args="$@" + + assert ip_net_is_valid ${net} </blockquote> I think this assertion isn't needed because "ip" will check this and just throw an error. </div></blockquote><div><br></div><div>But can we catch the error in a nice way? I could have a look at this but using $? should be harder then to use our normal functions. </div><div><br></div><blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;"> <blockquote> + local line + local ips </blockquote> It would be nicer if the "ips" variable would be called "addresses" because that is the term that we actually use most of the time.</div></blockquote><div><br></div>Ok<div><br><blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;"> <blockquote> + # We read the output of $(ip addr show to ${net} ${args}) + while read -r line; do + # We are only interested in lines which start with inet or inet6 + [[ "${line}" =~ ^(inet6 |inet ) ]] || continue + + # We need the second word the line + line=(${line}) + list_append "ips" "$(ip_split_prefix "${line[1]}")" </blockquote> You could also achieve this by passing the line argument up to the first space and use the "%" and "#" parameters in the brackets. I am not sure if the conversion to the array has any implications.</div></blockquote><div><br></div><div>So how can we make shure that this has no <span style="white-space: pre-wrap;">implications?</span></div><div><br></div><blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;"> <blockquote> + done <<< "$(ip addr show to "${net}" ${args})" + + # We sort the list to get the lowest IP as first item + print "$(list_sort ${ips})" </blockquote> You don't need to call print here. This will create a subshell for the list_sort call, but list_sort already prints the output, so you can just write: list_sort ${ips} That will be a lot faster.</div></blockquote><div><br></div>Ok<div><br><blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;"> <blockquote> +} </blockquote> -Michael </div></blockquote></div></div>
diff --git a/src/functions/functions.ip b/src/functions/functions.ip index 3b43da7..ef40bcc 100644 --- a/src/functions/functions.ip +++ b/src/functions/functions.ip @@ -205,3 +205,28 @@ ip_address_del() { return ${EXIT_OK} } + +# Get all currently assigned addresse for a given network +ip_get_assigned_addresses_from_net() { + local net=${1} + shift + local args="$@" + + assert ip_net_is_valid ${net} + + local line + local ips + + # We read the output of $(ip addr show to ${net} ${args}) + while read -r line; do + # We are only interested in lines which start with inet or inet6 + [[ "${line}" =~ ^(inet6 |inet ) ]] || continue + + # We need the second word the line + line=(${line}) + list_append "ips" "$(ip_split_prefix "${line[1]}")" + done <<< "$(ip addr show to "${net}" ${args})" + + # We sort the list to get the lowest IP as first item + print "$(list_sort ${ips})" +}
This function is neede by IPsec to set the routes correctly. We can now now find a source IP for a given net. This way is ugly because the source IP is unpredictable if we get multiple IPs. Signed-off-by: Jonatan Schlag <jonatan.schlag@ipfire.org> --- src/functions/functions.ip | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)