#include #include #include "Linux_Service.h" #include "util/serviceutil.h" #include "globals.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, "Linux_Service"); Linux_ServiceRef_Set_SystemCreationClassName(&w, get_system_creation_class_name()); Linux_ServiceRef_Set_SystemName(&w, get_system_name()); 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))) { KReturn2(_cb, ERR_FAILED, "Unable to enumerate instances of Linux_Service"); } CMPIData cd; while (CMHasNext(e, &st)) { cd = CMGetNext(e, &st); if (st.rc || cd.type != CMPI_ref) { KReturn2(_cb, ERR_FAILED, "Enumerate instances didn't returned list of references"); } CMPIInstance *in = _cb->bft->getInstance(_cb, cc, cd.value.ref, properties, &st); if (st.rc) { KReturn2(_cb, ERR_FAILED, "Unable to get instance of Linux_Service"); } 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); Service_End_Enum(enumhdl); KReturn(OK); } else { KReturn(ERR_NOT_FOUND); } } 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")