func()

in cmd/core_plugin/network/dhclient/dhclient_linux.go [395:444]


func (ds *dhclientService) Rollback(ctx context.Context, opts *service.Options) error {
	galog.Infof("Rolling back changes for dhclient.")

	// Determine if we can even rollback dhclient processes.
	if isInstalled, err := dhclientInstalled(); !isInstalled || err != nil {
		galog.Debugf("No preconditions met for dhclient roll back, skipping.")
		return nil
	}

	// Release all the interface leases from dhclient.
	for _, iface := range opts.NICConfigs {
		ifaceName := iface.Interface.Name()

		// Release IPv4 leases.
		ipv4Exists, err := dhclientProcessExists(iface, ipv4)
		if err != nil {
			return fmt.Errorf("failed to check if IPv4 process exists for %s: %w", ifaceName, err)
		}
		// Only release IPv4 leases if the process exists.
		if ipv4Exists {
			if err := ds.runDhclient(ctx, ifaceName, ipv4, releaseLease); err != nil {
				return fmt.Errorf("failed to release IPv4 lease for %s: %w", ifaceName, err)
			}
		}

		// Release IPv6 leases.
		if iface.SupportsIPv6 {
			ipv6Exists, err := dhclientProcessExists(iface, ipv6)
			if err != nil {
				return fmt.Errorf("failed to check if IPv6 process exists for %s: %w", ifaceName, err)
			}
			// Only release IPv6 leases if the process exists.
			if ipv6Exists {
				if err := ds.runDhclient(ctx, ifaceName, ipv6, releaseLease); err != nil {
					return fmt.Errorf("failed to release IPv6 lease for %s: %w", ifaceName, err)
				}
			}
		}

		if err := ds.removeVlanInterfaces(ctx, iface, nil); err != nil {
			return fmt.Errorf("failed to remove vlan interfaces: %w", err)
		}

		if err := route.RemoveRoutes(ctx, iface.Interface.Name()); err != nil {
			return fmt.Errorf("failed to remove routes managed by dhclient manager: %w", err)
		}
	}

	return nil
}