changeset 20203:6f836ae592a5

13368 libbe_py should support temporary BE activation Reviewed by: Toomas Soome <tsoome@me.com> Approved by: Gordon Ross <gordon.w.ross@gmail.com>
author Andy Fiddaman <omnios@citrus-it.co.uk>
date Wed, 16 Dec 2020 15:08:40 +0000
parents 8fc178e155c7
children deb4016895be
files usr/src/lib/pylibbe/common/libbe_py.c
diffstat 1 files changed, 26 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/lib/pylibbe/common/libbe_py.c	Fri Dec 18 05:34:43 2020 +0200
+++ b/usr/src/lib/pylibbe/common/libbe_py.c	Wed Dec 16 15:08:40 2020 +0000
@@ -22,7 +22,7 @@
 /*
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2012 OmniTI Computer Consulting, Inc.  All rights reserved.
- * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
  */
 
 #include <Python.h>
@@ -51,7 +51,7 @@
 PyObject *beCreateSnapshot(PyObject *, PyObject *);
 PyObject *beCopy(PyObject *, PyObject *);
 PyObject *beList(PyObject *, PyObject *, PyObject *);
-PyObject *beActivate(PyObject *, PyObject *);
+PyObject *beActivate(PyObject *, PyObject *, PyObject *);
 PyObject *beDestroy(PyObject *, PyObject *);
 PyObject *beDestroySnapshot(PyObject *, PyObject *);
 PyObject *beRename(PyObject *, PyObject *);
@@ -93,7 +93,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beCreateSnapshot(PyObject *self, PyObject *args)
 {
@@ -159,7 +158,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beCopy(PyObject *self, PyObject *args)
 {
@@ -285,7 +283,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beList(PyObject *self, PyObject *args, PyObject *keywds)
 {
@@ -413,7 +410,10 @@
  *              to activate a Boot Environment
  * Parameters:
  *   args -     pointer to a python object containing:
- *     beName - The name of the BE to activate
+ *     bename    - The name of the BE to activate
+ *     temporary - If True, perform a temporary BE activation
+ *                 If False, remove a temporary BE activation
+ *                 If not present, do nothing in regard to temporary activation
  *
  * Returns a pointer to a python object:
  *      BE_SUCCESS - Success
@@ -421,28 +421,36 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
-beActivate(PyObject *self, PyObject *args)
+beActivate(PyObject *self, PyObject *args, PyObject *keywds)
 {
 	char		*beName = NULL;
 	int		ret = BE_PY_SUCCESS;
 	nvlist_t	*beAttrs = NULL;
+	int		temp = -1;
 
-	if (!PyArg_ParseTuple(args, "z", &beName)) {
-		return (Py_BuildValue("i", BE_PY_ERR_PARSETUPLE));
+	static char *kwlist[] = {"bename", "temporary", NULL};
+
+	if (!PyArg_ParseTupleAndKeywords(args, keywds, "z|i",
+	    kwlist, &beName, &temp)) {
+		ret = BE_PY_ERR_PARSETUPLE;
+		goto done;
 	}
 
-	if (!convertPyArgsToNvlist(&beAttrs, 2, BE_ATTR_ORIG_BE_NAME, beName)) {
-		nvlist_free(beAttrs);
-		return (Py_BuildValue("i", BE_PY_ERR_NVLIST));
+	if (!convertPyArgsToNvlist(&beAttrs, 2, BE_ATTR_ORIG_BE_NAME, beName) ||
+	    beAttrs == NULL) {
+		ret = BE_PY_ERR_NVLIST;
+		goto done;
 	}
 
-	if (beAttrs == NULL) {
-		return (Py_BuildValue("i", BE_PY_ERR_NVLIST));
+	if (temp != -1 && nvlist_add_boolean_value(beAttrs,
+	    BE_ATTR_ACTIVE_NEXTBOOT, temp == 0 ? B_FALSE : B_TRUE) != 0) {
+		ret = BE_PY_ERR_NVLIST;
+		goto done;
 	}
 
 	ret = be_activate(beAttrs);
+done:
 	nvlist_free(beAttrs);
 	return (Py_BuildValue("i", ret));
 }
@@ -461,7 +469,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beDestroy(PyObject *self, PyObject *args)
 {
@@ -520,7 +527,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beDestroySnapshot(PyObject *self, PyObject *args)
 {
@@ -564,7 +570,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beRename(PyObject *self, PyObject *args)
 {
@@ -609,7 +614,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beMount(PyObject *self, PyObject *args)
 {
@@ -652,7 +656,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beUnmount(PyObject *self, PyObject *args)
 {
@@ -707,7 +710,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beRollback(PyObject *self, PyObject *args)
 {
@@ -753,7 +755,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 bePrintErrors(PyObject *self, PyObject *args)
 {
@@ -778,7 +779,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beGetErrDesc(PyObject *self, PyObject *args)
 {
@@ -812,7 +812,6 @@
  * Scope:
  *      Public
  */
-/* ARGSUSED */
 PyObject *
 beVerifyBEName(PyObject *self, PyObject *args)
 {
@@ -1038,6 +1037,7 @@
 			(void) printf("nvlist_add_string failed for %s (%s).\n",
 			    pt, pt2);
 			nvlist_free(*nvList);
+			*nvList = NULL;
 			return (B_FALSE);
 		}
 	}
@@ -1097,7 +1097,8 @@
 	{"beList", (PyCFunction)(uintptr_t)beList, METH_VARARGS | METH_KEYWORDS,
 	    "List BE info."},
 	{"beRename", beRename, METH_VARARGS, "Rename a BE."},
-	{"beActivate", beActivate, METH_VARARGS, "Activate a BE."},
+	{"beActivate", (PyCFunction)(uintptr_t)beActivate,
+	    METH_VARARGS | METH_KEYWORDS, "Activate a BE."},
 	{"beRollback", beRollback, METH_VARARGS, "Rollback a BE."},
 	{"bePrintErrors", bePrintErrors, METH_VARARGS,
 	    "Enable/disable error printing."},