static void test_last(void **state) { Rlist *l = NULL; assert_true(RlistLast(l) == NULL); AppendRlist(&l, "a", CF_SCALAR); assert_string_equal("a", ScalarValue(RlistLast(l))); AppendRlist(&l, "b", CF_SCALAR); assert_string_equal("b", ScalarValue(RlistLast(l))); DeleteRlist(l); }
static void Unix_GetMacAddress(enum cfagenttype ag, int fd, struct ifreq *ifr, struct ifreq *ifp, Rlist **interfaces, Rlist **hardware) { char name[CF_MAXVARSIZE]; if (ag != cf_know) { snprintf(name, CF_MAXVARSIZE, "hardware_mac[%s]", ifp->ifr_name); } else { snprintf(name, CF_MAXVARSIZE, "hardware_mac[interface_name]"); } # ifdef SIOCGIFHWADDR char hw_mac[CF_MAXVARSIZE]; ioctl(fd, SIOCGIFHWADDR, ifr); snprintf(hw_mac, CF_MAXVARSIZE - 1, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", (unsigned char) ifr->ifr_hwaddr.sa_data[0], (unsigned char) ifr->ifr_hwaddr.sa_data[1], (unsigned char) ifr->ifr_hwaddr.sa_data[2], (unsigned char) ifr->ifr_hwaddr.sa_data[3], (unsigned char) ifr->ifr_hwaddr.sa_data[4], (unsigned char) ifr->ifr_hwaddr.sa_data[5]); NewScalar("sys", name, hw_mac, cf_str); AppendRlist(hardware, hw_mac, CF_SCALAR); AppendRlist(interfaces, ifp->ifr_name, CF_SCALAR); snprintf(name, CF_MAXVARSIZE, "mac_%s", CanonifyName(hw_mac)); NewClass(name); # else NewScalar("sys", name, "mac_unknown", cf_str); NewClass("mac_unknown"); # endif }
Rlist *NewExpArgs(const FnCall *fp, const Promise *pp) { int len; Rval rval; Rlist *newargs = NULL; FnCall *subfp; const FnCallType *fn = FindFunction(fp->name); len = RlistLen(fp->args); if (!fn->varargs) { if (len != FnNumArgs(fn)) { CfOut(cf_error, "", "Arguments to function %s(.) do not tally. Expect %d not %d", fp->name, FnNumArgs(fn), len); PromiseRef(cf_error, pp); exit(1); } } for (const Rlist *rp = fp->args; rp != NULL; rp = rp->next) { switch (rp->type) { case CF_FNCALL: subfp = (FnCall *) rp->item; rval = EvaluateFunctionCall(subfp, pp).rval; break; default: rval = ExpandPrivateRval(CONTEXTID, (Rval) {rp->item, rp->type}); break; } CfDebug("EXPARG: %s.%s\n", CONTEXTID, (char *) rval.item); AppendRlist(&newargs, rval.item, rval.rtype); DeleteRvalItem(rval); } return newargs; }
void Unix_GetInterfaceInfo(enum cfagenttype ag) { int fd, len, i, j, first_address = false, ipdefault = false; struct ifreq ifbuf[CF_IFREQ], ifr, *ifp; struct ifconf list; struct sockaddr_in *sin; struct hostent *hp; char *sp, workbuf[CF_BUFSIZE]; char ip[CF_MAXVARSIZE]; char name[CF_MAXVARSIZE]; char last_name[CF_BUFSIZE]; Rlist *interfaces = NULL, *hardware = NULL, *ips = NULL; CfDebug("Unix_GetInterfaceInfo()\n"); memset(ifbuf, 0, sizeof(ifbuf)); InitIgnoreInterfaces(); last_name[0] = '\0'; if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { CfOut(cf_error, "socket", "Couldn't open socket"); exit(1); } list.ifc_len = sizeof(ifbuf); list.ifc_req = ifbuf; # ifdef SIOCGIFCONF if (ioctl(fd, SIOCGIFCONF, &list) == -1 || (list.ifc_len < (sizeof(struct ifreq)))) # else if (ioctl(fd, OSIOCGIFCONF, &list) == -1 || (list.ifc_len < (sizeof(struct ifreq)))) # endif { CfOut(cf_error, "ioctl", "Couldn't get interfaces - old kernel? Try setting CF_IFREQ to 1024"); exit(1); } last_name[0] = '\0'; for (j = 0, len = 0, ifp = list.ifc_req; len < list.ifc_len; len += SIZEOF_IFREQ(*ifp), j++, ifp = (struct ifreq *) ((char *) ifp + SIZEOF_IFREQ(*ifp))) { if (ifp->ifr_addr.sa_family == 0) { continue; } if (ifp->ifr_name == NULL || strlen(ifp->ifr_name) == 0) { continue; } /* Skip virtual network interfaces for Linux, which seems to be a problem */ if (IgnoreInterface(ifp->ifr_name)) { continue; } if (strstr(ifp->ifr_name, ":")) { if (VSYSTEMHARDCLASS == linuxx) { CfOut(cf_verbose, "", "Skipping apparent virtual interface %d: %s\n", j + 1, ifp->ifr_name); continue; } } else { CfOut(cf_verbose, "", "Interface %d: %s\n", j + 1, ifp->ifr_name); } // Ignore the loopback if (strcmp(ifp->ifr_name, "lo") == 0) { continue; } if (strncmp(last_name, ifp->ifr_name, sizeof(ifp->ifr_name)) == 0) { first_address = false; } else { strncpy(last_name, ifp->ifr_name, sizeof(ifp->ifr_name)); if (!first_address) { NewScalar("sys", "interface", last_name, cf_str); first_address = true; } } snprintf(workbuf, CF_BUFSIZE, "net_iface_%s", CanonifyName(ifp->ifr_name)); NewClass(workbuf); if (ifp->ifr_addr.sa_family == AF_INET) { strncpy(ifr.ifr_name, ifp->ifr_name, sizeof(ifp->ifr_name)); if (ioctl(fd, SIOCGIFFLAGS, &ifr) == -1) { CfOut(cf_error, "ioctl", "No such network device"); //close(fd); //return; continue; } if ((ifr.ifr_flags & IFF_BROADCAST) && !(ifr.ifr_flags & IFF_LOOPBACK)) { sin = (struct sockaddr_in *) &ifp->ifr_addr; if (IgnoreJailInterface(j + 1, sin)) { CfOut(cf_verbose, "", "Ignoring interface %d", j + 1); continue; } CfDebug("Adding hostip %s..\n", inet_ntoa(sin->sin_addr)); NewClass(inet_ntoa(sin->sin_addr)); if ((hp = gethostbyaddr((char *) &(sin->sin_addr.s_addr), sizeof(sin->sin_addr.s_addr), AF_INET)) == NULL) { CfDebug("No hostinformation for %s not found\n", inet_ntoa(sin->sin_addr)); } else { if (hp->h_name != NULL) { CfDebug("Adding hostname %s..\n", hp->h_name); NewClass(hp->h_name); if (hp->h_aliases != NULL) { for (i = 0; hp->h_aliases[i] != NULL; i++) { CfOut(cf_verbose, "", "Adding alias %s..\n", hp->h_aliases[i]); NewClass(hp->h_aliases[i]); } } } } if (strcmp(inet_ntoa(sin->sin_addr), "0.0.0.0") == 0) { // Maybe we need to do something windows specific here? CfOut(cf_verbose, "", " !! Cannot discover hardware IP, using DNS value"); strcpy(ip, "ipv4_"); strcat(ip, VIPADDRESS); AppendItem(&IPADDRESSES, VIPADDRESS, ""); AppendRlist(&ips, VIPADDRESS, CF_SCALAR); for (sp = ip + strlen(ip) - 1; (sp > ip); sp--) { if (*sp == '.') { *sp = '\0'; NewClass(ip); } } strcpy(ip, VIPADDRESS); i = 3; for (sp = ip + strlen(ip) - 1; (sp > ip); sp--) { if (*sp == '.') { *sp = '\0'; snprintf(name, CF_MAXVARSIZE - 1, "ipv4_%d[%s]", i--, CanonifyName(VIPADDRESS)); NewScalar("sys", name, ip, cf_str); } } //close(fd); //return; continue; } strncpy(ip, "ipv4_", CF_MAXVARSIZE); strncat(ip, inet_ntoa(sin->sin_addr), CF_MAXVARSIZE - 6); NewClass(ip); if (!ipdefault) { ipdefault = true; NewScalar("sys", "ipv4", inet_ntoa(sin->sin_addr), cf_str); strcpy(VIPADDRESS, inet_ntoa(sin->sin_addr)); } AppendItem(&IPADDRESSES, inet_ntoa(sin->sin_addr), ""); AppendRlist(&ips, inet_ntoa(sin->sin_addr), CF_SCALAR); for (sp = ip + strlen(ip) - 1; (sp > ip); sp--) { if (*sp == '.') { *sp = '\0'; NewClass(ip); } } // Set the IPv4 on interface array strcpy(ip, inet_ntoa(sin->sin_addr)); if (ag != cf_know) { snprintf(name, CF_MAXVARSIZE - 1, "ipv4[%s]", CanonifyName(ifp->ifr_name)); } else { snprintf(name, CF_MAXVARSIZE - 1, "ipv4[interface_name]"); } NewScalar("sys", name, ip, cf_str); i = 3; for (sp = ip + strlen(ip) - 1; (sp > ip); sp--) { if (*sp == '.') { *sp = '\0'; if (ag != cf_know) { snprintf(name, CF_MAXVARSIZE - 1, "ipv4_%d[%s]", i--, CanonifyName(ifp->ifr_name)); } else { snprintf(name, CF_MAXVARSIZE - 1, "ipv4_%d[interface_name]", i--); } NewScalar("sys", name, ip, cf_str); } } } // Set the hardware/mac address array Unix_GetMacAddress(ag, fd, &ifr, ifp, &interfaces, &hardware); } } close(fd); NewList("sys", "interfaces", interfaces, cf_slist); NewList("sys", "hardware_addresses", hardware, cf_slist); NewList("sys", "ip_addresses", ips, cf_slist); }
static void DoVerifyServices(Attributes a, Promise *pp, const ReportContext *report_context) { FnCall *default_bundle = NULL; Rlist *args = NULL; // Need to set up the default service pack to eliminate syntax if (GetConstraintValue("service_bundle", pp, CF_SCALAR) == NULL) { switch (a.service.service_policy) { case cfsrv_start: AppendRlist(&args, pp->promiser, CF_SCALAR); AppendRlist(&args, "start", CF_SCALAR); break; case cfsrv_restart: AppendRlist(&args, pp->promiser, CF_SCALAR); AppendRlist(&args, "restart", CF_SCALAR); break; case cfsrv_reload: AppendRlist(&args, pp->promiser, CF_SCALAR); AppendRlist(&args, "restart", CF_SCALAR); break; case cfsrv_stop: case cfsrv_disable: default: AppendRlist(&args, pp->promiser, CF_SCALAR); AppendRlist(&args, "stop", CF_SCALAR); break; } default_bundle = NewFnCall("default:standard_services", args); ConstraintAppendToPromise(pp, "service_bundle", (Rval) {default_bundle, CF_FNCALL}, "any", false); a.havebundle = true; } // Set $(this.service_policy) for flexible bundle adaptation switch (a.service.service_policy) { case cfsrv_start: NewScalar("this", "service_policy", "start", cf_str); break; case cfsrv_restart: NewScalar("this", "service_policy", "restart", cf_str); break; case cfsrv_reload: NewScalar("this", "service_policy", "reload", cf_str); break; case cfsrv_stop: case cfsrv_disable: default: NewScalar("this", "service_policy", "stop", cf_str); break; } if (default_bundle && GetBundle(PolicyFromPromise(pp), default_bundle->name, "agent") == NULL) { cfPS(cf_inform, CF_FAIL, "", pp, a, " !! Service %s could not be invoked successfully\n", pp->promiser); } if (!DONTDO) { VerifyMethod("service_bundle", a, pp, report_context); // Send list of classes to set privately? } }