dhcp_lib.sh 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #!/bin/sh
  2. # SPDX-License-Identifier: GPL-2.0-or-later
  3. # Copyright (c) 2014-2018 Oracle and/or its affiliates. All Rights Reserved.
  4. # Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
  5. # Author: Alexey Kodanev alexey.kodanev@oracle.com
  6. TST_SETUP="dhcp_lib_setup"
  7. TST_CLEANUP="dhcp_lib_cleanup"
  8. TST_TESTFUNC="test01"
  9. TST_NEEDS_TMPDIR=1
  10. TST_NEEDS_ROOT=1
  11. TST_NEEDS_CMDS="cat $dhcp_name awk ip pgrep pkill dhclient"
  12. . tst_net.sh
  13. . daemonlib.sh
  14. iface0="ltp_veth0"
  15. iface1="ltp_veth1"
  16. stop_dhcp()
  17. {
  18. [ "$(pgrep -x $dhcp_name)" ] || return 0
  19. tst_res TINFO "stopping $dhcp_name"
  20. local count=0
  21. while [ $count -le 10 ]; do
  22. pkill -x $dhcp_name
  23. [ "$(pgrep -x $dhcp_name)" ] || return 0
  24. tst_sleep 100ms
  25. count=$((count + 1))
  26. done
  27. pkill -9 -x $dhcp_name
  28. tst_sleep 100ms
  29. [ "$(pgrep -x $dhcp_name)" ] && return 1 || return 0
  30. }
  31. dhcp_lib_setup()
  32. {
  33. [ -z "$log" ] && log="$PWD/$(basename $0 '.sh').log"
  34. if [ $TST_IPV6 ]; then
  35. ip_addr="fd00:1:1:2::12/64"
  36. ip_addr_check_noprefix="fd00:1:1:2::100"
  37. ip_addr_check="$ip_addr_check_noprefix/128"
  38. else
  39. ip_addr="10.1.1.12/24"
  40. ip_addr_check_noprefix="10.1.1.100"
  41. ip_addr_check="$ip_addr_check_noprefix/24"
  42. fi
  43. lsmod | grep -q '^veth ' && veth_loaded=yes || veth_loaded=no
  44. tst_res TINFO "create veth interfaces"
  45. ip li add $iface0 type veth peer name $iface1 || \
  46. tst_brk TBROK "failed to add veth $iface0"
  47. veth_added=1
  48. ip li set up $iface0 || tst_brk TBROK "failed to bring $iface0 up"
  49. ip li set up $iface1 || tst_brk TBROK "failed to bring $iface1 up"
  50. stop_dhcp || tst_brk TBROK "Failed to stop dhcp server"
  51. dhclient_lease="/var/lib/dhclient/dhclient${TST_IPV6}.leases"
  52. [ -f $dhclient_lease ] || dhclient_lease="/var/lib/dhcp/dhclient${TST_IPV6}.leases"
  53. if [ -f $dhclient_lease ]; then
  54. tst_res TINFO "backup dhclient${TST_IPV6}.leases"
  55. mv $dhclient_lease .
  56. fi
  57. tst_res TINFO "add $ip_addr to $iface0"
  58. ip addr add $ip_addr dev $iface0 || \
  59. tst_brk TBROK "failed to add ip address"
  60. if [ ! -d "$lease_dir" ]; then
  61. mkdir -p $lease_dir
  62. lease_dir_added=1
  63. fi
  64. }
  65. dhcp_lib_cleanup()
  66. {
  67. [ -z "$veth_loaded" ] && return
  68. [ "$lease_dir_added" = 1 ] && rm -rf $lease_dir
  69. rm -f $lease_file
  70. stop_dhcp
  71. pkill -f "dhclient -$TST_IPVER $iface1"
  72. cleanup_dhcp
  73. # restore dhclient leases
  74. [ $dhclient_lease ] && rm -f $dhclient_lease
  75. [ -f "dhclient${TST_IPV6}.leases" ] && \
  76. mv dhclient${TST_IPV6}.leases $dhclient_lease
  77. [ $veth_added ] && ip li del $iface0
  78. [ "$veth_loaded" = "no" ] && lsmod | grep -q '^veth ' && rmmod veth
  79. }
  80. print_dhcp_log()
  81. {
  82. [ -f "$log" ] && cat $log
  83. }
  84. test01()
  85. {
  86. local wicked_cfg="/etc/sysconfig/network/ifcfg-$iface1"
  87. local wicked_cleanup
  88. tst_res TINFO "testing DHCP server $dhcp_name: $(print_dhcp_version)"
  89. tst_res TINFO "using DHCP client: $(dhclient --version 2>&1)"
  90. tst_res TINFO "starting DHCPv$TST_IPVER server on $iface0"
  91. start_dhcp$TST_IPV6
  92. if [ $? -ne 0 ]; then
  93. print_dhcp_log
  94. tst_brk TBROK "Failed to start $dhcp_name"
  95. fi
  96. sleep 1
  97. if [ "$(pgrep '$dhcp_name')" ]; then
  98. print_dhcp_log
  99. tst_brk TBROK "Failed to start $dhcp_name"
  100. fi
  101. if [ $HAVE_SYSTEMCTL -eq 1 ] && \
  102. systemctl --no-pager -p Id show network.service | grep -q Id=wicked.service; then
  103. tst_res TINFO "wicked is running, don't start dhclient"
  104. if [ ! -f "$wicked_cfg" ]; then
  105. cat <<EOF > $wicked_cfg
  106. BOOTPROTO='dhcp'
  107. NAME='LTP card'
  108. STARTMODE='auto'
  109. USERCONTROL='no'
  110. EOF
  111. wicked_cleanup=1
  112. else
  113. tst_res TINFO "wicked config file $wicked_cfg already exist"
  114. fi
  115. tst_res TINFO "restarting wicked"
  116. systemctl restart wicked
  117. else
  118. tst_res TINFO "starting dhclient -$TST_IPVER $iface1"
  119. dhclient -$TST_IPVER $iface1 || tst_brk TBROK "dhclient failed"
  120. fi
  121. # check that we get configured ip address
  122. ip addr show $iface1 | grep -q $ip_addr_check
  123. if [ $? -eq 0 ]; then
  124. tst_res TPASS "'$ip_addr_check' configured by DHCPv$TST_IPVER"
  125. else
  126. if ip addr show $iface1 | grep -q $ip_addr_check_noprefix; then
  127. tst_res TFAIL "'$ip_addr_check_noprefix' configured but has wrong prefix, expect '$ip_addr_check'"
  128. ip addr show $iface1
  129. else
  130. tst_res TFAIL "'$ip_addr_check' not configured by DHCPv$TST_IPVER"
  131. print_dhcp_log
  132. fi
  133. fi
  134. [ "$wicked_cleanup" ] && rm -f $wicked_cfg
  135. stop_dhcp
  136. }