diff options
Diffstat (limited to 'src/service/Linux_ServiceProvider.c')
-rw-r--r-- | src/service/Linux_ServiceProvider.c | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/src/service/Linux_ServiceProvider.c b/src/service/Linux_ServiceProvider.c new file mode 100644 index 0000000..7cbf54b --- /dev/null +++ b/src/service/Linux_ServiceProvider.c @@ -0,0 +1,334 @@ +#include <konkret/konkret.h> +#include <stdint.h> +#include "Linux_Service.h" +#include "ServiceUtils.h" +#include "util/serviceutil.h" + +static const CMPIBroker* _cb = NULL; + +static void Linux_ServiceInitialize() +{ +} + +static CMPIStatus Linux_ServiceCleanup( + CMPIInstanceMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ServiceEnumInstanceNames( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + const char *ns = KNameSpace(cop); + SList *slist = NULL; + + slist = Service_Find_All(); + for (int i = 0; i < slist->cnt; i++) { + Linux_ServiceRef w; + Linux_ServiceRef_Init(&w, _cb, ns); + Linux_ServiceRef_Set_CreationClassName(&w, CreationClassName()); + Linux_ServiceRef_Set_SystemCreationClassName(&w, SystemCreationClassName()); + Linux_ServiceRef_Set_SystemName(&w, SystemName()); + Linux_ServiceRef_Set_Name(&w, slist->name[i]); + + KReturnObjectPath(cr, w); + } + Service_Free_SList(slist); + + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ServiceEnumInstances( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + CMPIStatus st; + CMPIEnumeration* e; + if (!(e = _cb->bft->enumerateInstanceNames(_cb, cc, cop, &st))) { + KReturn(ERR_FAILED); + } + CMPIData cd; + while (CMHasNext(e, &st)) { + + cd = CMGetNext(e, &st); + if (st.rc || cd.type != CMPI_ref) { + KReturn(ERR_FAILED); + } + + CMPIInstance *in = _cb->bft->getInstance(_cb, cc, cd.value.ref, properties, &st); + if (st.rc) { + KReturn(ERR_FAILED); + } + cr->ft->returnInstance(cr, in); + } + KReturn(OK); +} + +static CMPIStatus Linux_ServiceGetInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + Linux_Service w; + Linux_Service_InitFromObjectPath(&w, _cb, cop); + + void *enumhdl = Service_Begin_Enum(w.Name.chars); + Service servicebuf; + if (Service_Next_Enum(enumhdl, &servicebuf, w.Name.chars)) { + Linux_Service_Set_Status(&w, servicebuf.svStatus); + Linux_Service_Set_Started(&w, servicebuf.svStarted); + + switch (servicebuf.svEnabledDefault) { + case ENABLED: + Linux_Service_Set_EnabledDefault(&w, Linux_Service_EnabledDefault_Enabled); + break; + case DISABLED: + Linux_Service_Set_EnabledDefault(&w, Linux_Service_EnabledDefault_Disabled); + break; + default: + Linux_Service_Set_EnabledDefault(&w, Linux_Service_EnabledDefault_Not_Applicable); + break; + } + + KReturnInstance(cr, w); + } + KReturn(OK); +} + +static CMPIStatus Linux_ServiceCreateInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ServiceModifyInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci, + const char** properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ServiceDeleteInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ServiceExecQuery( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* lang, + const char* query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +CMInstanceMIStub( + Linux_Service, + Linux_Service, + _cb, + Linux_ServiceInitialize()) + +static CMPIStatus Linux_ServiceMethodCleanup( + CMPIMethodMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ServiceInvokeMethod( + CMPIMethodMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* meth, + const CMPIArgs* in, + CMPIArgs* out) +{ + return Linux_Service_DispatchMethod( + _cb, mi, cc, cr, cop, meth, in, out); +} + +CMMethodMIStub( + Linux_Service, + Linux_Service, + _cb, + Linux_ServiceInitialize()) + +KUint32 Linux_Service_RequestStateChange( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + const KUint16* RequestedState, + KRef* Job, + const KDateTime* TimeoutPeriod, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + + KSetStatus(status, ERR_NOT_SUPPORTED); + return result; +} + +unsigned int Service_RunOperation(const char *service, const char *operation, CMPIStatus *status) +{ + char output[1024]; + int res = Service_Operation(service, operation, output, sizeof(output)); + if (res == 0) { + KSetStatus2(_cb, status, OK, output); + } else { + KSetStatus2(_cb, status, ERR_FAILED, output); + } + return res; +} + +KUint32 Linux_Service_StartService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "start", status)); + return result; +} + +KUint32 Linux_Service_StopService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "stop", status)); + return result; +} + +KUint32 Linux_Service_ReloadService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "reload", status)); + return result; +} + +KUint32 Linux_Service_RestartService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "restart", status)); + return result; +} + +KUint32 Linux_Service_TryRestartService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "try-restart", status)); + return result; +} + +KUint32 Linux_Service_CondRestartService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "condrestart", status)); + return result; +} + +KUint32 Linux_Service_ReloadOrRestartService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "reload-or-restart", status)); + return result; +} + +KUint32 Linux_Service_ReloadOrTryRestartService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "reload-or-try-restart", status)); + return result; +} + +KUint32 Linux_Service_TurnServiceOn( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "enable", status)); + return result; +} + +KUint32 Linux_Service_TurnServiceOff( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + KUint32_Set(&result, Service_RunOperation(self->Name.chars, "disable", status)); + return result; +} + +KONKRET_REGISTRATION( + "root/cimv2", + "Linux_Service", + "Linux_Service", + "instance method") |