/* * virsh-domain.c: Commands to manage network filters * * Copyright (C) 2005, 2007-2012 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; If not, see * . * * Daniel Veillard * Karel Zak * Daniel P. Berrange * */ /* default is lookup by Name and UUID */ #define vshCommandOptNWFilter(_ctl, _cmd, _name) \ vshCommandOptNWFilterBy(_ctl, _cmd, _name, \ VSH_BYUUID|VSH_BYNAME) static virNWFilterPtr vshCommandOptNWFilterBy(vshControl *ctl, const vshCmd *cmd, const char **name, int flag) { virNWFilterPtr nwfilter = NULL; const char *n = NULL; const char *optname = "nwfilter"; if (!cmd_has_option(ctl, cmd, optname)) return NULL; if (vshCommandOptString(cmd, optname, &n) <= 0) return NULL; vshDebug(ctl, VSH_ERR_INFO, "%s: found option <%s>: %s\n", cmd->def->name, optname, n); if (name) *name = n; /* try it by UUID */ if ((flag & VSH_BYUUID) && strlen(n) == VIR_UUID_STRING_BUFLEN-1) { vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as nwfilter UUID\n", cmd->def->name, optname); nwfilter = virNWFilterLookupByUUIDString(ctl->conn, n); } /* try it by NAME */ if (nwfilter == NULL && (flag & VSH_BYNAME)) { vshDebug(ctl, VSH_ERR_DEBUG, "%s: <%s> trying as nwfilter NAME\n", cmd->def->name, optname); nwfilter = virNWFilterLookupByName(ctl->conn, n); } if (!nwfilter) vshError(ctl, _("failed to get nwfilter '%s'"), n); return nwfilter; } /* * "nwfilter-define" command */ static const vshCmdInfo info_nwfilter_define[] = { {"help", N_("define or update a network filter from an XML file")}, {"desc", N_("Define a new network filter or update an existing one.")}, {NULL, NULL} }; static const vshCmdOptDef opts_nwfilter_define[] = { {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containing an XML network filter description")}, {NULL, 0, 0, NULL} }; static bool cmdNWFilterDefine(vshControl *ctl, const vshCmd *cmd) { virNWFilterPtr nwfilter; const char *from = NULL; bool ret = true; char *buffer; if (!vshConnectionUsability(ctl, ctl->conn)) return false; if (vshCommandOptString(cmd, "file", &from) <= 0) return false; if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) return false; nwfilter = virNWFilterDefineXML(ctl->conn, buffer); VIR_FREE(buffer); if (nwfilter != NULL) { vshPrint(ctl, _("Network filter %s defined from %s\n"), virNWFilterGetName(nwfilter), from); virNWFilterFree(nwfilter); } else { vshError(ctl, _("Failed to define network filter from %s"), from); ret = false; } return ret; } /* * "nwfilter-undefine" command */ static const vshCmdInfo info_nwfilter_undefine[] = { {"help", N_("undefine a network filter")}, {"desc", N_("Undefine a given network filter.")}, {NULL, NULL} }; static const vshCmdOptDef opts_nwfilter_undefine[] = { {"nwfilter", VSH_OT_DATA, VSH_OFLAG_REQ, N_("network filter name or uuid")}, {NULL, 0, 0, NULL} }; static bool cmdNWFilterUndefine(vshControl *ctl, const vshCmd *cmd) { virNWFilterPtr nwfilter; bool ret = true; const char *name; if (!vshConnectionUsability(ctl, ctl->conn)) return false; if (!(nwfilter = vshCommandOptNWFilter(ctl, cmd, &name))) return false; if (virNWFilterUndefine(nwfilter) == 0) { vshPrint(ctl, _("Network filter %s undefined\n"), name); } else { vshError(ctl, _("Failed to undefine network filter %s"), name); ret = false; } virNWFilterFree(nwfilter); return ret; } /* * "nwfilter-dumpxml" command */ static const vshCmdInfo info_nwfilter_dumpxml[] = { {"help", N_("network filter information in XML")}, {"desc", N_("Output the network filter information as an XML dump to stdout.")}, {NULL, NULL} }; static const vshCmdOptDef opts_nwfilter_dumpxml[] = { {"nwfilter", VSH_OT_DATA, VSH_OFLAG_REQ, N_("network filter name or uuid")}, {NULL, 0, 0, NULL} }; static bool cmdNWFilterDumpXML(vshControl *ctl, const vshCmd *cmd) { virNWFilterPtr nwfilter; bool ret = true; char *dump; if (!vshConnectionUsability(ctl, ctl->conn)) return false; if (!(nwfilter = vshCommandOptNWFilter(ctl, cmd, NULL))) return false; dump = virNWFilterGetXMLDesc(nwfilter, 0); if (dump != NULL) { vshPrint(ctl, "%s", dump); VIR_FREE(dump); } else { ret = false; } virNWFilterFree(nwfilter); return ret; } /* * "nwfilter-list" command */ static const vshCmdInfo info_nwfilter_list[] = { {"help", N_("list network filters")}, {"desc", N_("Returns list of network filters.")}, {NULL, NULL} }; static const vshCmdOptDef opts_nwfilter_list[] = { {NULL, 0, 0, NULL} }; static bool cmdNWFilterList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) { int numfilters, i; char **names; char uuid[VIR_UUID_STRING_BUFLEN]; if (!vshConnectionUsability(ctl, ctl->conn)) return false; numfilters = virConnectNumOfNWFilters(ctl->conn); if (numfilters < 0) { vshError(ctl, "%s", _("Failed to list network filters")); return false; } names = vshMalloc(ctl, sizeof(char *) * numfilters); if ((numfilters = virConnectListNWFilters(ctl->conn, names, numfilters)) < 0) { vshError(ctl, "%s", _("Failed to list network filters")); VIR_FREE(names); return false; } qsort(&names[0], numfilters, sizeof(char *), vshNameSorter); vshPrintExtra(ctl, "%-36s %-20s \n", _("UUID"), _("Name")); vshPrintExtra(ctl, "----------------------------------------------------------------\n"); for (i = 0; i < numfilters; i++) { virNWFilterPtr nwfilter = virNWFilterLookupByName(ctl->conn, names[i]); /* this kind of work with networks is not atomic operation */ if (!nwfilter) { VIR_FREE(names[i]); continue; } virNWFilterGetUUIDString(nwfilter, uuid); vshPrint(ctl, "%-36s %-20s\n", uuid, virNWFilterGetName(nwfilter)); virNWFilterFree(nwfilter); VIR_FREE(names[i]); } VIR_FREE(names); return true; } /* * "nwfilter-edit" command */ static const vshCmdInfo info_nwfilter_edit[] = { {"help", N_("edit XML configuration for a network filter")}, {"desc", N_("Edit the XML configuration for a network filter.")}, {NULL, NULL} }; static const vshCmdOptDef opts_nwfilter_edit[] = { {"nwfilter", VSH_OT_DATA, VSH_OFLAG_REQ, N_("network filter name or uuid")}, {NULL, 0, 0, NULL} }; static bool cmdNWFilterEdit(vshControl *ctl, const vshCmd *cmd) { bool ret = false; virNWFilterPtr nwfilter = NULL; virNWFilterPtr nwfilter_edited = NULL; if (!vshConnectionUsability(ctl, ctl->conn)) goto cleanup; nwfilter = vshCommandOptNWFilter(ctl, cmd, NULL); if (nwfilter == NULL) goto cleanup; #define EDIT_GET_XML virNWFilterGetXMLDesc(nwfilter, 0) #define EDIT_NOT_CHANGED \ vshPrint(ctl, _("Network filter %s XML " \ "configuration not changed.\n"), \ virNWFilterGetName(nwfilter)); \ ret = true; goto edit_cleanup; #define EDIT_DEFINE \ (nwfilter_edited = virNWFilterDefineXML(ctl->conn, doc_edited)) #define EDIT_FREE \ if (nwfilter_edited) \ virNWFilterFree(nwfilter); #include "virsh-edit.c" vshPrint(ctl, _("Network filter %s XML configuration edited.\n"), virNWFilterGetName(nwfilter_edited)); ret = true; cleanup: if (nwfilter) virNWFilterFree(nwfilter); if (nwfilter_edited) virNWFilterFree(nwfilter_edited); return ret; }