static void ToolsCoreWorkAroundLoop(ToolsServiceState *state, gboolean before) { #ifdef __APPLE__ if (state->mainService) { char *libDir = GuestApp_GetInstallPath(); char *argv[] = { NULL, before ? "--startInternal" : "--stopInternal", NULL, }; if (!libDir) { g_error("Failed to retrieve libDir.\n"); } argv[0] = g_strdup_printf("%s/services.sh", libDir); free(libDir); if (!argv[0]) { g_error("Failed to construct argv[0].\n"); } g_spawn_sync(NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); free(argv[0]); } #endif }
static char * VmBackupGetScriptPath(void) { char *scriptPath = NULL; char *installPath = GuestApp_GetInstallPath(); if (installPath == NULL) { return NULL; } scriptPath = Str_Asprintf(NULL, "%s%s%s", installPath, DIRSEPS, "backupScripts.d"); free(installPath); return scriptPath; }
char * GuestApp_GetConfPath(void) { #if defined(_WIN32) char *path = W32Util_GetVmwareCommonAppDataFilePath(NULL); if (path != NULL) { char *tmp = Str_SafeAsprintf(NULL, "%s%c%s", path, DIRSEPC, ProductState_GetName()); free(path); path = tmp; if (!File_EnsureDirectory(path)) { free(path); path = NULL; } } return path; #else /* Just call into GuestApp_GetInstallPath. */ return GuestApp_GetInstallPath(); #endif }
static gboolean GuestInfoVMSupport(RpcInData *data) { #if defined(_WIN32) char vmSupportCmd[] = "vm-support.vbs"; char *vmSupportPath = NULL; gchar *vmSupport = NULL; SECURITY_ATTRIBUTES saProcess = {0}, saThread = {0}; ProcMgr_AsyncProc *vmSupportProc = NULL; ProcMgr_ProcArgs vmSupportProcArgs = {0}; /* * Construct the commandline to be passed during execution * This will be the path of our vm-support.vbs */ vmSupportPath = GuestApp_GetInstallPath(); if (vmSupportPath == NULL) { return RPCIN_SETRETVALS(data, "GuestApp_GetInstallPath failed", FALSE); } /* Put together absolute vm-support filename. */ vmSupport = g_strdup_printf("cscript \"%s%s%s\" -u", vmSupportPath, DIRSEPS, vmSupportCmd); vm_free(vmSupportPath); saProcess.nLength = sizeof saProcess; saProcess.bInheritHandle = TRUE; saThread.nLength = sizeof saThread; vmSupportProcArgs.lpProcessAttributes = &saProcess; vmSupportProcArgs.lpThreadAttributes = &saThread; vmSupportProcArgs.dwCreationFlags = CREATE_NO_WINDOW; g_message("Starting vm-support script - %s\n", vmSupport); vmSupportProc = ProcMgr_ExecAsync(vmSupport, &vmSupportProcArgs); g_free(vmSupport); if (vmSupportProc == NULL) { g_warning("Error starting vm-support script\n"); return RPCIN_SETRETVALS(data, "Error starting vm-support script", FALSE); } ProcMgr_Free(vmSupportProc); return RPCIN_SETRETVALS(data, "", TRUE); #else gchar *vmSupportCmdArgv[] = {"vm-support", "-u", NULL}; g_message("Starting vm-support script - %s\n", vmSupportCmdArgv[0]); if (!g_spawn_async(NULL, vmSupportCmdArgv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, NULL, NULL)) { g_warning("Error starting vm-support script\n"); return RPCIN_SETRETVALS(data, "Error starting vm-support script", FALSE); } return RPCIN_SETRETVALS(data, "", TRUE); #endif }
static int GetConfEntry(const char *progName, // IN: program name (argv[0]) const char *apm, // IN: apm name ScriptType type) // IN: Script type (default or current) { gchar *entry; GKeyFile *confDict; const char *confName; int len; int ret; confName = GetConfName(apm); if (!confName) { ToolsCmd_UnknownEntityError(progName, SU_(script.operation, "operation"), apm); return EX_USAGE; } confDict = LoadConfFile(); switch (type) { case Current: entry = g_key_file_get_string(confDict, "powerops", confName, NULL); if (entry) { break; } /* Fall through */ default: entry = g_strdup(GuestApp_GetDefaultScript(confName)); break; } len = strlen(entry); if (len > 0) { /* If script path is not absolute, assume the Tools install path. */ if (!g_path_is_absolute(entry)) { char *defaultPath = GuestApp_GetInstallPath(); char *tmp; Bool quoted; ASSERT(defaultPath != NULL); /* Cope with old configs that added quotes around script paths. */ quoted = (entry[0] == '"' && entry[len - 1] == '"'); tmp = g_strdup_printf("%s%c%.*s", defaultPath, DIRSEPC, quoted ? len - 2 : len, quoted ? entry + 1 : entry); vm_free(defaultPath); g_free(entry); entry = tmp; } g_print("%s\n", entry); ret = EXIT_SUCCESS; } else { ToolsCmd_PrintErr(SU_(script.unknownop, "No script for operation %s.\n"), apm); ret = EX_TEMPFAIL; } g_free(entry); g_key_file_free(confDict); return ret; }
gboolean ToolsCore_LoadPlugins(ToolsServiceState *state) { gboolean pluginDirExists; gboolean ret = FALSE; gchar *pluginRoot; guint i; GPtrArray *plugins = NULL; #if defined(sun) && defined(__x86_64__) const char *subdir = "/amd64"; #else const char *subdir = ""; #endif #if defined(OPEN_VM_TOOLS) pluginRoot = g_strdup(VMTOOLSD_PLUGIN_ROOT); #else char *instPath = GuestApp_GetInstallPath(); pluginRoot = g_strdup_printf("%s%cplugins", instPath, DIRSEPC); vm_free(instPath); #endif ASSERT(g_module_supported()); #ifdef USE_APPLOADER { Bool ret = FALSE; GModule *mainModule = g_module_open(NULL, G_MODULE_BIND_LAZY); ASSERT(mainModule); ret = g_module_symbol(mainModule, "AppLoader_LoadLibraryDependencies", (gpointer *)&LoadDependencies); g_module_close(mainModule); if (!ret) { g_critical("Unable to locate library dependency loading function.\n"); goto exit; } } #endif plugins = g_ptr_array_new(); /* * First, load plugins from the common directory. The common directory * is not required to exist unless provided on the command line. */ if (state->commonPath == NULL) { state->commonPath = g_strdup_printf("%s%s%c%s", pluginRoot, subdir, DIRSEPC, TOOLSCORE_COMMON); } else if (!g_file_test(state->commonPath, G_FILE_TEST_IS_DIR)) { g_warning("Common plugin path is not a directory: %s\n", state->commonPath); goto exit; } if (g_file_test(state->commonPath, G_FILE_TEST_IS_DIR) && !ToolsCoreLoadDirectory(&state->ctx, state->commonPath, plugins)) { goto exit; } /* * Load the container-specific plugins. Ignore if the plugin directory * doesn't exist when running in debug mode. */ if (state->pluginPath == NULL) { state->pluginPath = g_strdup_printf("%s%s%c%s", pluginRoot, subdir, DIRSEPC, state->name); } pluginDirExists = g_file_test(state->pluginPath, G_FILE_TEST_IS_DIR); if (state->debugPlugin == NULL && !pluginDirExists) { g_warning("Plugin path is not a directory: %s\n", state->pluginPath); goto exit; } if (pluginDirExists && !ToolsCoreLoadDirectory(&state->ctx, state->pluginPath, plugins)) { goto exit; } /* * All plugins are loaded, now initialize them. */ state->plugins = g_ptr_array_new(); for (i = 0; i < plugins->len; i++) { ToolsPlugin *plugin = g_ptr_array_index(plugins, i); plugin->data = plugin->onload(&state->ctx); if (plugin->data == NULL) { g_info("Plugin '%s' didn't provide deployment data, unloading.\n", plugin->fileName); ToolsCoreFreePlugin(plugin); } else if (state->ctx.errorCode != 0) { /* Break early if a plugin has requested the container to quit. */ ToolsCoreFreePlugin(plugin); break; } else { ASSERT(plugin->data->name != NULL); g_module_make_resident(plugin->module); g_ptr_array_add(state->plugins, plugin); VMTools_BindTextDomain(plugin->data->name, NULL, NULL); g_message("Plugin '%s' initialized.\n", plugin->data->name); } } /* * If there is a debug plugin, see if it exports standard plugin registration * data too. */ if (state->debugData != NULL && state->debugData->debugPlugin->plugin != NULL) { ToolsPluginData *data = state->debugData->debugPlugin->plugin; ToolsPlugin *plugin = g_malloc(sizeof *plugin); plugin->fileName = NULL; plugin->module = NULL; plugin->data = data; VMTools_BindTextDomain(data->name, NULL, NULL); g_ptr_array_add(state->plugins, plugin); } ret = TRUE; exit: if (plugins != NULL) { g_ptr_array_free(plugins, TRUE); } g_free(pluginRoot); return ret; }
static gboolean PowerOpsStateChange(RpcInData *data) { size_t i; PowerOpState *state = data->clientData; if (state->pid != INVALID_PID) { g_debug("State change already in progress.\n"); return RPCIN_SETRETVALS(data, "State change already in progress", FALSE); } g_debug("State change: %s\n", data->name); for (i = 0; i < ARRAYSIZE(stateChangeCmdTable); i++) { if (strcmp(data->name, stateChangeCmdTable[i].tcloCmd) == 0) { gchar *script; const char *result; const char *confName; Bool ret; state->stateChgInProgress = stateChangeCmdTable[i].id; /* Check for the toolScripts option. */ if (!state->scriptEnabled[stateChangeCmdTable[i].id]) { PowerOpsStateChangeDone(state, TRUE); g_debug("Script for %s not configured to run\n", stateChangeCmdTable[i].tcloCmd); return RPCIN_SETRETVALS(data, "", TRUE); } confName = stateChgConfNames[stateChangeCmdTable[i].id]; script = g_key_file_get_string(state->ctx->config, "powerops", confName, NULL); if (script == NULL) { /* Use default script if not set in config file. */ const char *dfltScript = GuestApp_GetDefaultScript(confName); if (dfltScript == NULL) { g_debug("No default script to run for state change %s.\n", stateChangeCmdTable[i].name); PowerOpsStateChangeDone(state, TRUE); return RPCIN_SETRETVALS(data, "", TRUE); } script = g_strdup(dfltScript); } else if (strlen(script) == 0) { g_debug("No script to run for state change %s.\n", stateChangeCmdTable[i].name); g_free(script); PowerOpsStateChangeDone(state, TRUE); return RPCIN_SETRETVALS(data, "", TRUE); } /* If script path is not absolute, assume the Tools install path. */ if (!g_path_is_absolute(script)) { char *dfltPath; char *tmp; dfltPath = GuestApp_GetInstallPath(); ASSERT(dfltPath != NULL); /* * Before the switch to vmtoolsd, the config file was saved with * quotes around the script path to make the old VMware dict code * happy. Now we need to undo that when modifying the script path. * * PowerOpsRunScript will "re-quote" the script path. */ if (script[0] == '"') { script[strlen(script) - 1] = '\0'; tmp = g_strdup_printf("%s%c%s", dfltPath, DIRSEPC, script + 1); } else { tmp = g_strdup_printf("%s%c%s", dfltPath, DIRSEPC, script); } g_free(script); vm_free(dfltPath); script = tmp; } if (PowerOpsRunScript(state, script)) { result = ""; ret = TRUE; } else { PowerOpsStateChangeDone(state, FALSE); result = "Error starting script"; ret = FALSE; } g_free(script); return RPCIN_SETRETVALS(data, (char *) result, ret); } } g_warning("Invalid state change command.\n"); return RPCIN_SETRETVALS(data, "Invalid state change command", FALSE); }
void VMTools_BindTextDomain(const char *domain, const char *lang, const char *catdir) { char *dfltdir = NULL; gchar *file; gchar *usrlang = NULL; MsgState *state = MsgGetState(); MsgCatalog *catalog; ASSERT(domain); /* * If the caller has asked for the default user language, detect it and * translate to our internal language string representation. */ if (lang == NULL || *lang == '\0') { usrlang = MsgGetUserLanguage(); lang = usrlang; } g_debug("%s: user locale=%s\n", __FUNCTION__, lang); /* * Use the default install directory if none is provided. */ if (catdir == NULL) { #if defined(OPEN_VM_TOOLS) dfltdir = Util_SafeStrdup(VMTOOLS_DATA_DIR); #else dfltdir = GuestApp_GetInstallPath(); #endif catdir = (dfltdir) ? dfltdir : "."; } file = g_strdup_printf("%s%smessages%s%s%s%s.vmsg", catdir, DIRSEPS, DIRSEPS, lang, DIRSEPS, domain); if (!File_IsFile(file)) { /* * If we couldn't find the catalog file for the user's language, see if * we can find a more generic language (e.g., for "en_US", also try "en"). */ char *sep = Str_Strrchr(lang, '_'); if (sep != NULL) { if (usrlang == NULL) { usrlang = Util_SafeStrdup(lang); } usrlang[sep - lang] = '\0'; g_free(file); file = g_strdup_printf("%s%smessages%s%s%s%s.vmsg", catdir, DIRSEPS, DIRSEPS, usrlang, DIRSEPS, domain); } } catalog = MsgLoadCatalog(file); if (catalog == NULL) { if (Str_Strncmp(lang, "en", 2)) { /* * Don't warn about english dictionary, which may not exist (it is the * default translation). */ g_message("Cannot load message catalog for domain '%s', language '%s', " "catalog dir '%s'.\n", domain, lang, catdir); } } else { g_static_mutex_lock(&state->lock); MsgSetCatalog(domain, catalog); g_static_mutex_unlock(&state->lock); } g_free(file); free(dfltdir); g_free(usrlang); }