CFEngine 3 :: sys.interface variable
By cyril on Friday 4 January 2013, 12:09 - CFEngine - Permalink
https://cfengine.com/manuals/cf3-Reference#Variable-sys_002einterface says:
The assumed (default) name of the main system interface on this host. # interface = eth0
What is "The assumed (default) name of the main system interface on this host."
CFEngine use traditional ioctl(SIOCGIFCONF) by skipping loopback interface.
- CFEngine 3 test:
# cat test_sys_interface.cf body common control { any:: bundlesequence => { "test" }; } bundle agent test { reports: cfengine_3:: "sys.interface is [$(sys.interface)]"; } # cf-agent -f ./test_sys_interface.cf R: sys.interface is [eth0]
- Linux C code test:
#include <stdio.h> #include <net/if.h> #include <netinet/in.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h> #define INT_TO_ADDR(_addr) \ (_addr & 0xFF), \ (_addr >> 8 & 0xFF), \ (_addr >> 16 & 0xFF), \ (_addr >> 24 & 0xFF) int main() { struct ifconf ifc; struct ifreq ifr[10]; int sd, ifc_num, addr, bcast, mask, network, i; /* Create a socket so we can use ioctl on the file * descriptor to retrieve the interface info. */ sd = socket(PF_INET, SOCK_DGRAM, 0); if (sd > 0) { ifc.ifc_len = sizeof(ifr); ifc.ifc_ifcu.ifcu_buf = (caddr_t)ifr; if (ioctl(sd, SIOCGIFCONF, &ifc) == 0) { ifc_num = ifc.ifc_len / sizeof(struct ifreq); //printf("interfacesfound\n"); for (i = 0; i < ifc_num; ++i) { if (ifr[i].ifr_addr.sa_family != AF_INET) { continue; } if (strcmp(ifr[i].ifr_name, "lo") == 0) { continue; } /* display the interface name */ printf("interface(%d): %s\n", i+1, ifr[i].ifr_name); /* Retrieve the IP address, broadcast address, and subnet mask. */ if (ioctl(sd, SIOCGIFADDR, &ifr[i]) == 0) { addr = ((struct sockaddr_in *)(&ifr[i].ifr_addr))->sin_addr.s_addr; printf(" (%d)address: %d.%d.%d.%d\n", i+1, INT_TO_ADDR(addr)); } if (ioctl(sd, SIOCGIFBRDADDR, &ifr[i]) == 0) { bcast = ((struct sockaddr_in *)(&ifr[i].ifr_broadaddr))->sin_addr.s_addr; printf(" (%d)broadcast: %d.%d.%d.%d\n", i+1, INT_TO_ADDR(bcast)); } if (ioctl(sd, SIOCGIFNETMASK, &ifr[i]) == 0) { mask = ((struct sockaddr_in *)(&ifr[i].ifr_netmask))->sin_addr.s_addr; printf(" (%d)netmask: %d.%d.%d.%d\n", i+1, INT_TO_ADDR(mask)); } /* Compute the current network value from the address and netmask. */ network = addr & mask; printf(" (%d)network: %d.%d.%d.%d\n", i+1, INT_TO_ADDR(network)); } } close(sd); } return 0; } # gcc interfaces.c -o interfaces # ./interfaces interface(2): eth0 (2)address: 192.168.1.1 (2)broadcast: 192.168.1.255 (2)netmask: 255.255.255.0 (2)network: 192.168.1.0