Eric Blake
2015-Jun-08 21:21 UTC
Re: [libvirt-users] Recommended change for the networking page in wiki
On 06/08/2015 02:43 PM, Laine Stump wrote:>> However, if I changed the destination address from "anywhere" to the >> IP of the host machine, the problem resolved. So I change the script >> to as follows. (Changes are highlighted. For some reason the original >> script didn't work using /bin/sh, but it did with /bin/bash, so I >> changed that too). > > I don't know for sure, but my guess is that this line: > > length=$(( ${#Host_port[@]} - 1 ))Correct - that line is a bashism, and is not portable when /bin/sh is dash.> > which was added by vgerris in order to support forwarding of multiple > ports, could be what's causing the incompatibility (that wasn't in the > original, simpler version of the script, written by me.) > >> >> *#!/bin/bash* >> # used some from advanced script to have multiple ports: use an equal >> number of guest and host ports >> >> Guest_name=xxxxxxx >> Guest_ipaddr=xxx.xxx.xxx.xx >> *Host_ipaddr=xxx.xxx.xxx.xx* >> Host_port=( '80' '443' ) >> Guest_port=( '80' '443' )In fact, these two lines are also bashisms. All the more reason to require bash.>> length=$(( ${#Host_port[@]} - 1 )) >> if [ "${1}" = "${Guest_name}" ]; then >> if [ "${2}" = "stopped" -o "${2}" = "reconnect" ]; thentest ... -o ... (also spelled [ ... -o ... ]) is not portable, even on bash. There are some expressions that are completely ambiguous on how to be parsed, when -o is in the mix. It is better to spell it: [ ... ] || [ ... ] (that is, use the shell's || instead of test's -o to do the conjunction).>> for i in `seq 0 $length`; doseq is not portable outside of GNU/Linux systems.>> Lastly, I should note that I am using Ubuntu 14.04, both for the host >> and guest.Yep, that's a system that uses dash for /bin/sh.>> >> I'm also curious as to why this is considered a hack method. It states >> in the wiki that "This method is a hack", but it doesn't express why. > > I consider it a hack because: > > 1) It requires the IP address of the guest to be known before the guest > is started, so either you need to guess the guest's IP (if the guest is > getting its IP address via dhcp) or configured the guest IP address in > multiple places.Although recent work has been made to get libvirt to add an API that queries the guest for its IP address, once the guest is running. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
BJ
2015-Jun-12 15:29 UTC
Re: [libvirt-users] Recommended change for the networking page in wiki
So should I go ahead and make the changes to the script that I suggested? Thanks, BJ On Mon, Jun 8, 2015 at 3:21 PM, Eric Blake <eblake@redhat.com> wrote:> On 06/08/2015 02:43 PM, Laine Stump wrote: > >> However, if I changed the destination address from "anywhere" to the > >> IP of the host machine, the problem resolved. So I change the script > >> to as follows. (Changes are highlighted. For some reason the original > >> script didn't work using /bin/sh, but it did with /bin/bash, so I > >> changed that too). > > > > I don't know for sure, but my guess is that this line: > > > > length=$(( ${#Host_port[@]} - 1 )) > > Correct - that line is a bashism, and is not portable when /bin/sh is dash. > > > > > which was added by vgerris in order to support forwarding of multiple > > ports, could be what's causing the incompatibility (that wasn't in the > > original, simpler version of the script, written by me.) > > > >> > >> *#!/bin/bash* > >> # used some from advanced script to have multiple ports: use an equal > >> number of guest and host ports > >> > >> Guest_name=xxxxxxx > >> Guest_ipaddr=xxx.xxx.xxx.xx > >> *Host_ipaddr=xxx.xxx.xxx.xx* > >> Host_port=( '80' '443' ) > >> Guest_port=( '80' '443' ) > > In fact, these two lines are also bashisms. All the more reason to > require bash. > > >> length=$(( ${#Host_port[@]} - 1 )) > >> if [ "${1}" = "${Guest_name}" ]; then > >> if [ "${2}" = "stopped" -o "${2}" = "reconnect" ]; then > > test ... -o ... (also spelled [ ... -o ... ]) is not portable, even on > bash. There are some expressions that are completely ambiguous on how > to be parsed, when -o is in the mix. It is better to spell it: [ ... ] > || [ ... ] (that is, use the shell's || instead of test's -o to do the > conjunction). > > >> for i in `seq 0 $length`; do > > seq is not portable outside of GNU/Linux systems. > > >> Lastly, I should note that I am using Ubuntu 14.04, both for the host > >> and guest. > > Yep, that's a system that uses dash for /bin/sh. > > >> > >> I'm also curious as to why this is considered a hack method. It states > >> in the wiki that "This method is a hack", but it doesn't express why. > > > > I consider it a hack because: > > > > 1) It requires the IP address of the guest to be known before the guest > > is started, so either you need to guess the guest's IP (if the guest is > > getting its IP address via dhcp) or configured the guest IP address in > > multiple places. > > Although recent work has been made to get libvirt to add an API that > queries the guest for its IP address, once the guest is running. > > -- > Eric Blake eblake redhat com +1-919-301-3266 > Libvirt virtualization library http://libvirt.org > >