qemu-ga.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. /*
  2. * QEMU Guest Agent
  3. *
  4. * Copyright IBM Corp. 2011
  5. *
  6. * Authors:
  7. * Adam Litke <aglitke@linux.vnet.ibm.com>
  8. * Michael Roth <mdroth@linux.vnet.ibm.com>
  9. *
  10. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  11. * See the COPYING file in the top-level directory.
  12. */
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <stdbool.h>
  16. #include <glib.h>
  17. #include <getopt.h>
  18. #ifndef _WIN32
  19. #include <syslog.h>
  20. #include <sys/wait.h>
  21. #include <sys/stat.h>
  22. #endif
  23. #include "json-streamer.h"
  24. #include "json-parser.h"
  25. #include "qint.h"
  26. #include "qjson.h"
  27. #include "qga/guest-agent-core.h"
  28. #include "module.h"
  29. #include "signal.h"
  30. #include "qerror.h"
  31. #include "error_int.h"
  32. #include "qapi/qmp-core.h"
  33. #include "qga/channel.h"
  34. #ifdef _WIN32
  35. #include "qga/service-win32.h"
  36. #include <windows.h>
  37. #endif
  38. #ifndef _WIN32
  39. #define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0"
  40. #else
  41. #define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0"
  42. #endif
  43. #define QGA_PIDFILE_DEFAULT "/var/run/qemu-ga.pid"
  44. #define QGA_STATEDIR_DEFAULT "/tmp"
  45. #define QGA_SENTINEL_BYTE 0xFF
  46. struct GAState {
  47. JSONMessageParser parser;
  48. GMainLoop *main_loop;
  49. GAChannel *channel;
  50. bool virtio; /* fastpath to check for virtio to deal with poll() quirks */
  51. GACommandState *command_state;
  52. GLogLevelFlags log_level;
  53. FILE *log_file;
  54. bool logging_enabled;
  55. #ifdef _WIN32
  56. GAService service;
  57. #endif
  58. bool delimit_response;
  59. bool frozen;
  60. GList *blacklist;
  61. const char *state_filepath_isfrozen;
  62. struct {
  63. const char *log_filepath;
  64. const char *pid_filepath;
  65. } deferred_options;
  66. };
  67. struct GAState *ga_state;
  68. /* commands that are safe to issue while filesystems are frozen */
  69. static const char *ga_freeze_whitelist[] = {
  70. "guest-ping",
  71. "guest-info",
  72. "guest-sync",
  73. "guest-fsfreeze-status",
  74. "guest-fsfreeze-thaw",
  75. NULL
  76. };
  77. #ifdef _WIN32
  78. DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data,
  79. LPVOID ctx);
  80. VOID WINAPI service_main(DWORD argc, TCHAR *argv[]);
  81. #endif
  82. static void quit_handler(int sig)
  83. {
  84. /* if we're frozen, don't exit unless we're absolutely forced to,
  85. * because it's basically impossible for graceful exit to complete
  86. * unless all log/pid files are on unfreezable filesystems. there's
  87. * also a very likely chance killing the agent before unfreezing
  88. * the filesystems is a mistake (or will be viewed as one later).
  89. */
  90. if (ga_is_frozen(ga_state)) {
  91. return;
  92. }
  93. g_debug("received signal num %d, quitting", sig);
  94. if (g_main_loop_is_running(ga_state->main_loop)) {
  95. g_main_loop_quit(ga_state->main_loop);
  96. }
  97. }
  98. #ifndef _WIN32
  99. static gboolean register_signal_handlers(void)
  100. {
  101. struct sigaction sigact;
  102. int ret;
  103. memset(&sigact, 0, sizeof(struct sigaction));
  104. sigact.sa_handler = quit_handler;
  105. ret = sigaction(SIGINT, &sigact, NULL);
  106. if (ret == -1) {
  107. g_error("error configuring signal handler: %s", strerror(errno));
  108. return false;
  109. }
  110. ret = sigaction(SIGTERM, &sigact, NULL);
  111. if (ret == -1) {
  112. g_error("error configuring signal handler: %s", strerror(errno));
  113. return false;
  114. }
  115. return true;
  116. }
  117. /* TODO: use this in place of all post-fork() fclose(std*) callers */
  118. void reopen_fd_to_null(int fd)
  119. {
  120. int nullfd;
  121. nullfd = open("/dev/null", O_RDWR);
  122. if (nullfd < 0) {
  123. return;
  124. }
  125. dup2(nullfd, fd);
  126. if (nullfd != fd) {
  127. close(nullfd);
  128. }
  129. }
  130. #endif
  131. static void usage(const char *cmd)
  132. {
  133. printf(
  134. "Usage: %s [-m <method> -p <path>] [<options>]\n"
  135. "QEMU Guest Agent %s\n"
  136. "\n"
  137. " -m, --method transport method: one of unix-listen, virtio-serial, or\n"
  138. " isa-serial (virtio-serial is the default)\n"
  139. " -p, --path device/socket path (the default for virtio-serial is:\n"
  140. " %s)\n"
  141. " -l, --logfile set logfile path, logs to stderr by default\n"
  142. " -f, --pidfile specify pidfile (default is %s)\n"
  143. " -t, --statedir specify dir to store state information (absolute paths\n"
  144. " only, default is %s)\n"
  145. " -v, --verbose log extra debugging information\n"
  146. " -V, --version print version information and exit\n"
  147. " -d, --daemonize become a daemon\n"
  148. #ifdef _WIN32
  149. " -s, --service service commands: install, uninstall\n"
  150. #endif
  151. " -b, --blacklist comma-separated list of RPCs to disable (no spaces, \"?\"\n"
  152. " to list available RPCs)\n"
  153. " -h, --help display this help and exit\n"
  154. "\n"
  155. "Report bugs to <mdroth@linux.vnet.ibm.com>\n"
  156. , cmd, QEMU_VERSION, QGA_VIRTIO_PATH_DEFAULT, QGA_PIDFILE_DEFAULT,
  157. QGA_STATEDIR_DEFAULT);
  158. }
  159. static const char *ga_log_level_str(GLogLevelFlags level)
  160. {
  161. switch (level & G_LOG_LEVEL_MASK) {
  162. case G_LOG_LEVEL_ERROR:
  163. return "error";
  164. case G_LOG_LEVEL_CRITICAL:
  165. return "critical";
  166. case G_LOG_LEVEL_WARNING:
  167. return "warning";
  168. case G_LOG_LEVEL_MESSAGE:
  169. return "message";
  170. case G_LOG_LEVEL_INFO:
  171. return "info";
  172. case G_LOG_LEVEL_DEBUG:
  173. return "debug";
  174. default:
  175. return "user";
  176. }
  177. }
  178. bool ga_logging_enabled(GAState *s)
  179. {
  180. return s->logging_enabled;
  181. }
  182. void ga_disable_logging(GAState *s)
  183. {
  184. s->logging_enabled = false;
  185. }
  186. void ga_enable_logging(GAState *s)
  187. {
  188. s->logging_enabled = true;
  189. }
  190. static void ga_log(const gchar *domain, GLogLevelFlags level,
  191. const gchar *msg, gpointer opaque)
  192. {
  193. GAState *s = opaque;
  194. GTimeVal time;
  195. const char *level_str = ga_log_level_str(level);
  196. if (!ga_logging_enabled(s)) {
  197. return;
  198. }
  199. level &= G_LOG_LEVEL_MASK;
  200. #ifndef _WIN32
  201. if (domain && strcmp(domain, "syslog") == 0) {
  202. syslog(LOG_INFO, "%s: %s", level_str, msg);
  203. } else if (level & s->log_level) {
  204. #else
  205. if (level & s->log_level) {
  206. #endif
  207. g_get_current_time(&time);
  208. fprintf(s->log_file,
  209. "%lu.%lu: %s: %s\n", time.tv_sec, time.tv_usec, level_str, msg);
  210. fflush(s->log_file);
  211. }
  212. }
  213. void ga_set_response_delimited(GAState *s)
  214. {
  215. s->delimit_response = true;
  216. }
  217. #ifndef _WIN32
  218. static bool ga_open_pidfile(const char *pidfile)
  219. {
  220. int pidfd;
  221. char pidstr[32];
  222. pidfd = open(pidfile, O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR);
  223. if (pidfd == -1 || lockf(pidfd, F_TLOCK, 0)) {
  224. g_critical("Cannot lock pid file, %s", strerror(errno));
  225. if (pidfd != -1) {
  226. close(pidfd);
  227. }
  228. return false;
  229. }
  230. if (ftruncate(pidfd, 0) || lseek(pidfd, 0, SEEK_SET)) {
  231. g_critical("Failed to truncate pid file");
  232. goto fail;
  233. }
  234. sprintf(pidstr, "%d", getpid());
  235. if (write(pidfd, pidstr, strlen(pidstr)) != strlen(pidstr)) {
  236. g_critical("Failed to write pid file");
  237. goto fail;
  238. }
  239. return true;
  240. fail:
  241. unlink(pidfile);
  242. return false;
  243. }
  244. #else /* _WIN32 */
  245. static bool ga_open_pidfile(const char *pidfile)
  246. {
  247. return true;
  248. }
  249. #endif
  250. static gint ga_strcmp(gconstpointer str1, gconstpointer str2)
  251. {
  252. return strcmp(str1, str2);
  253. }
  254. /* disable commands that aren't safe for fsfreeze */
  255. static void ga_disable_non_whitelisted(void)
  256. {
  257. char **list_head, **list;
  258. bool whitelisted;
  259. int i;
  260. list_head = list = qmp_get_command_list();
  261. while (*list != NULL) {
  262. whitelisted = false;
  263. i = 0;
  264. while (ga_freeze_whitelist[i] != NULL) {
  265. if (strcmp(*list, ga_freeze_whitelist[i]) == 0) {
  266. whitelisted = true;
  267. }
  268. i++;
  269. }
  270. if (!whitelisted) {
  271. g_debug("disabling command: %s", *list);
  272. qmp_disable_command(*list);
  273. }
  274. g_free(*list);
  275. list++;
  276. }
  277. g_free(list_head);
  278. }
  279. /* [re-]enable all commands, except those explicitly blacklisted by user */
  280. static void ga_enable_non_blacklisted(GList *blacklist)
  281. {
  282. char **list_head, **list;
  283. list_head = list = qmp_get_command_list();
  284. while (*list != NULL) {
  285. if (g_list_find_custom(blacklist, *list, ga_strcmp) == NULL &&
  286. !qmp_command_is_enabled(*list)) {
  287. g_debug("enabling command: %s", *list);
  288. qmp_enable_command(*list);
  289. }
  290. g_free(*list);
  291. list++;
  292. }
  293. g_free(list_head);
  294. }
  295. static bool ga_create_file(const char *path)
  296. {
  297. int fd = open(path, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR);
  298. if (fd == -1) {
  299. g_warning("unable to open/create file %s: %s", path, strerror(errno));
  300. return false;
  301. }
  302. close(fd);
  303. return true;
  304. }
  305. static bool ga_delete_file(const char *path)
  306. {
  307. int ret = unlink(path);
  308. if (ret == -1) {
  309. g_warning("unable to delete file: %s: %s", path, strerror(errno));
  310. return false;
  311. }
  312. return true;
  313. }
  314. bool ga_is_frozen(GAState *s)
  315. {
  316. return s->frozen;
  317. }
  318. void ga_set_frozen(GAState *s)
  319. {
  320. if (ga_is_frozen(s)) {
  321. return;
  322. }
  323. /* disable all non-whitelisted (for frozen state) commands */
  324. ga_disable_non_whitelisted();
  325. g_warning("disabling logging due to filesystem freeze");
  326. ga_disable_logging(s);
  327. s->frozen = true;
  328. if (!ga_create_file(s->state_filepath_isfrozen)) {
  329. g_warning("unable to create %s, fsfreeze may not function properly",
  330. s->state_filepath_isfrozen);
  331. }
  332. }
  333. void ga_unset_frozen(GAState *s)
  334. {
  335. if (!ga_is_frozen(s)) {
  336. return;
  337. }
  338. /* if we delayed creation/opening of pid/log files due to being
  339. * in a frozen state at start up, do it now
  340. */
  341. if (s->deferred_options.log_filepath) {
  342. s->log_file = fopen(s->deferred_options.log_filepath, "a");
  343. if (!s->log_file) {
  344. s->log_file = stderr;
  345. }
  346. s->deferred_options.log_filepath = NULL;
  347. }
  348. ga_enable_logging(s);
  349. g_warning("logging re-enabled due to filesystem unfreeze");
  350. if (s->deferred_options.pid_filepath) {
  351. if (!ga_open_pidfile(s->deferred_options.pid_filepath)) {
  352. g_warning("failed to create/open pid file");
  353. }
  354. s->deferred_options.pid_filepath = NULL;
  355. }
  356. /* enable all disabled, non-blacklisted commands */
  357. ga_enable_non_blacklisted(s->blacklist);
  358. s->frozen = false;
  359. if (!ga_delete_file(s->state_filepath_isfrozen)) {
  360. g_warning("unable to delete %s, fsfreeze may not function properly",
  361. s->state_filepath_isfrozen);
  362. }
  363. }
  364. static void become_daemon(const char *pidfile)
  365. {
  366. #ifndef _WIN32
  367. pid_t pid, sid;
  368. pid = fork();
  369. if (pid < 0) {
  370. exit(EXIT_FAILURE);
  371. }
  372. if (pid > 0) {
  373. exit(EXIT_SUCCESS);
  374. }
  375. if (pidfile) {
  376. if (!ga_open_pidfile(pidfile)) {
  377. g_critical("failed to create pidfile");
  378. exit(EXIT_FAILURE);
  379. }
  380. }
  381. umask(0);
  382. sid = setsid();
  383. if (sid < 0) {
  384. goto fail;
  385. }
  386. if ((chdir("/")) < 0) {
  387. goto fail;
  388. }
  389. reopen_fd_to_null(STDIN_FILENO);
  390. reopen_fd_to_null(STDOUT_FILENO);
  391. reopen_fd_to_null(STDERR_FILENO);
  392. return;
  393. fail:
  394. if (pidfile) {
  395. unlink(pidfile);
  396. }
  397. g_critical("failed to daemonize");
  398. exit(EXIT_FAILURE);
  399. #endif
  400. }
  401. static int send_response(GAState *s, QObject *payload)
  402. {
  403. const char *buf;
  404. QString *payload_qstr, *response_qstr;
  405. GIOStatus status;
  406. g_assert(payload && s->channel);
  407. payload_qstr = qobject_to_json(payload);
  408. if (!payload_qstr) {
  409. return -EINVAL;
  410. }
  411. if (s->delimit_response) {
  412. s->delimit_response = false;
  413. response_qstr = qstring_new();
  414. qstring_append_chr(response_qstr, QGA_SENTINEL_BYTE);
  415. qstring_append(response_qstr, qstring_get_str(payload_qstr));
  416. QDECREF(payload_qstr);
  417. } else {
  418. response_qstr = payload_qstr;
  419. }
  420. qstring_append_chr(response_qstr, '\n');
  421. buf = qstring_get_str(response_qstr);
  422. status = ga_channel_write_all(s->channel, buf, strlen(buf));
  423. QDECREF(response_qstr);
  424. if (status != G_IO_STATUS_NORMAL) {
  425. return -EIO;
  426. }
  427. return 0;
  428. }
  429. static void process_command(GAState *s, QDict *req)
  430. {
  431. QObject *rsp = NULL;
  432. int ret;
  433. g_assert(req);
  434. g_debug("processing command");
  435. rsp = qmp_dispatch(QOBJECT(req));
  436. if (rsp) {
  437. ret = send_response(s, rsp);
  438. if (ret) {
  439. g_warning("error sending response: %s", strerror(ret));
  440. }
  441. qobject_decref(rsp);
  442. }
  443. }
  444. /* handle requests/control events coming in over the channel */
  445. static void process_event(JSONMessageParser *parser, QList *tokens)
  446. {
  447. GAState *s = container_of(parser, GAState, parser);
  448. QObject *obj;
  449. QDict *qdict;
  450. Error *err = NULL;
  451. int ret;
  452. g_assert(s && parser);
  453. g_debug("process_event: called");
  454. obj = json_parser_parse_err(tokens, NULL, &err);
  455. if (err || !obj || qobject_type(obj) != QTYPE_QDICT) {
  456. qobject_decref(obj);
  457. qdict = qdict_new();
  458. if (!err) {
  459. g_warning("failed to parse event: unknown error");
  460. error_set(&err, QERR_JSON_PARSING);
  461. } else {
  462. g_warning("failed to parse event: %s", error_get_pretty(err));
  463. }
  464. qdict_put_obj(qdict, "error", error_get_qobject(err));
  465. error_free(err);
  466. } else {
  467. qdict = qobject_to_qdict(obj);
  468. }
  469. g_assert(qdict);
  470. /* handle host->guest commands */
  471. if (qdict_haskey(qdict, "execute")) {
  472. process_command(s, qdict);
  473. } else {
  474. if (!qdict_haskey(qdict, "error")) {
  475. QDECREF(qdict);
  476. qdict = qdict_new();
  477. g_warning("unrecognized payload format");
  478. error_set(&err, QERR_UNSUPPORTED);
  479. qdict_put_obj(qdict, "error", error_get_qobject(err));
  480. error_free(err);
  481. }
  482. ret = send_response(s, QOBJECT(qdict));
  483. if (ret) {
  484. g_warning("error sending error response: %s", strerror(ret));
  485. }
  486. }
  487. QDECREF(qdict);
  488. }
  489. /* false return signals GAChannel to close the current client connection */
  490. static gboolean channel_event_cb(GIOCondition condition, gpointer data)
  491. {
  492. GAState *s = data;
  493. gchar buf[QGA_READ_COUNT_DEFAULT+1];
  494. gsize count;
  495. GError *err = NULL;
  496. GIOStatus status = ga_channel_read(s->channel, buf, QGA_READ_COUNT_DEFAULT, &count);
  497. if (err != NULL) {
  498. g_warning("error reading channel: %s", err->message);
  499. g_error_free(err);
  500. return false;
  501. }
  502. switch (status) {
  503. case G_IO_STATUS_ERROR:
  504. g_warning("error reading channel");
  505. return false;
  506. case G_IO_STATUS_NORMAL:
  507. buf[count] = 0;
  508. g_debug("read data, count: %d, data: %s", (int)count, buf);
  509. json_message_parser_feed(&s->parser, (char *)buf, (int)count);
  510. break;
  511. case G_IO_STATUS_EOF:
  512. g_debug("received EOF");
  513. if (!s->virtio) {
  514. return false;
  515. }
  516. case G_IO_STATUS_AGAIN:
  517. /* virtio causes us to spin here when no process is attached to
  518. * host-side chardev. sleep a bit to mitigate this
  519. */
  520. if (s->virtio) {
  521. usleep(100*1000);
  522. }
  523. return true;
  524. default:
  525. g_warning("unknown channel read status, closing");
  526. return false;
  527. }
  528. return true;
  529. }
  530. static gboolean channel_init(GAState *s, const gchar *method, const gchar *path)
  531. {
  532. GAChannelMethod channel_method;
  533. if (method == NULL) {
  534. method = "virtio-serial";
  535. }
  536. if (path == NULL) {
  537. if (strcmp(method, "virtio-serial") != 0) {
  538. g_critical("must specify a path for this channel");
  539. return false;
  540. }
  541. /* try the default path for the virtio-serial port */
  542. path = QGA_VIRTIO_PATH_DEFAULT;
  543. }
  544. if (strcmp(method, "virtio-serial") == 0) {
  545. s->virtio = true; /* virtio requires special handling in some cases */
  546. channel_method = GA_CHANNEL_VIRTIO_SERIAL;
  547. } else if (strcmp(method, "isa-serial") == 0) {
  548. channel_method = GA_CHANNEL_ISA_SERIAL;
  549. } else if (strcmp(method, "unix-listen") == 0) {
  550. channel_method = GA_CHANNEL_UNIX_LISTEN;
  551. } else {
  552. g_critical("unsupported channel method/type: %s", method);
  553. return false;
  554. }
  555. s->channel = ga_channel_new(channel_method, path, channel_event_cb, s);
  556. if (!s->channel) {
  557. g_critical("failed to create guest agent channel");
  558. return false;
  559. }
  560. return true;
  561. }
  562. #ifdef _WIN32
  563. DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data,
  564. LPVOID ctx)
  565. {
  566. DWORD ret = NO_ERROR;
  567. GAService *service = &ga_state->service;
  568. switch (ctrl)
  569. {
  570. case SERVICE_CONTROL_STOP:
  571. case SERVICE_CONTROL_SHUTDOWN:
  572. quit_handler(SIGTERM);
  573. service->status.dwCurrentState = SERVICE_STOP_PENDING;
  574. SetServiceStatus(service->status_handle, &service->status);
  575. break;
  576. default:
  577. ret = ERROR_CALL_NOT_IMPLEMENTED;
  578. }
  579. return ret;
  580. }
  581. VOID WINAPI service_main(DWORD argc, TCHAR *argv[])
  582. {
  583. GAService *service = &ga_state->service;
  584. service->status_handle = RegisterServiceCtrlHandlerEx(QGA_SERVICE_NAME,
  585. service_ctrl_handler, NULL);
  586. if (service->status_handle == 0) {
  587. g_critical("Failed to register extended requests function!\n");
  588. return;
  589. }
  590. service->status.dwServiceType = SERVICE_WIN32;
  591. service->status.dwCurrentState = SERVICE_RUNNING;
  592. service->status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
  593. service->status.dwWin32ExitCode = NO_ERROR;
  594. service->status.dwServiceSpecificExitCode = NO_ERROR;
  595. service->status.dwCheckPoint = 0;
  596. service->status.dwWaitHint = 0;
  597. SetServiceStatus(service->status_handle, &service->status);
  598. g_main_loop_run(ga_state->main_loop);
  599. service->status.dwCurrentState = SERVICE_STOPPED;
  600. SetServiceStatus(service->status_handle, &service->status);
  601. }
  602. #endif
  603. int main(int argc, char **argv)
  604. {
  605. const char *sopt = "hVvdm:p:l:f:b:s:t:";
  606. const char *method = NULL, *path = NULL;
  607. const char *log_filepath = NULL;
  608. const char *pid_filepath = QGA_PIDFILE_DEFAULT;
  609. const char *state_dir = QGA_STATEDIR_DEFAULT;
  610. #ifdef _WIN32
  611. const char *service = NULL;
  612. #endif
  613. const struct option lopt[] = {
  614. { "help", 0, NULL, 'h' },
  615. { "version", 0, NULL, 'V' },
  616. { "logfile", 1, NULL, 'l' },
  617. { "pidfile", 1, NULL, 'f' },
  618. { "verbose", 0, NULL, 'v' },
  619. { "method", 1, NULL, 'm' },
  620. { "path", 1, NULL, 'p' },
  621. { "daemonize", 0, NULL, 'd' },
  622. { "blacklist", 1, NULL, 'b' },
  623. #ifdef _WIN32
  624. { "service", 1, NULL, 's' },
  625. #endif
  626. { "statedir", 1, NULL, 't' },
  627. { NULL, 0, NULL, 0 }
  628. };
  629. int opt_ind = 0, ch, daemonize = 0, i, j, len;
  630. GLogLevelFlags log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL;
  631. GList *blacklist = NULL;
  632. GAState *s;
  633. module_call_init(MODULE_INIT_QAPI);
  634. while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
  635. switch (ch) {
  636. case 'm':
  637. method = optarg;
  638. break;
  639. case 'p':
  640. path = optarg;
  641. break;
  642. case 'l':
  643. log_filepath = optarg;
  644. break;
  645. case 'f':
  646. pid_filepath = optarg;
  647. break;
  648. case 't':
  649. state_dir = optarg;
  650. break;
  651. case 'v':
  652. /* enable all log levels */
  653. log_level = G_LOG_LEVEL_MASK;
  654. break;
  655. case 'V':
  656. printf("QEMU Guest Agent %s\n", QEMU_VERSION);
  657. return 0;
  658. case 'd':
  659. daemonize = 1;
  660. break;
  661. case 'b': {
  662. char **list_head, **list;
  663. if (*optarg == '?') {
  664. list_head = list = qmp_get_command_list();
  665. while (*list != NULL) {
  666. printf("%s\n", *list);
  667. g_free(*list);
  668. list++;
  669. }
  670. g_free(list_head);
  671. return 0;
  672. }
  673. for (j = 0, i = 0, len = strlen(optarg); i < len; i++) {
  674. if (optarg[i] == ',') {
  675. optarg[i] = 0;
  676. blacklist = g_list_append(blacklist, &optarg[j]);
  677. j = i + 1;
  678. }
  679. }
  680. if (j < i) {
  681. blacklist = g_list_append(blacklist, &optarg[j]);
  682. }
  683. break;
  684. }
  685. #ifdef _WIN32
  686. case 's':
  687. service = optarg;
  688. if (strcmp(service, "install") == 0) {
  689. return ga_install_service(path, log_filepath);
  690. } else if (strcmp(service, "uninstall") == 0) {
  691. return ga_uninstall_service();
  692. } else {
  693. printf("Unknown service command.\n");
  694. return EXIT_FAILURE;
  695. }
  696. break;
  697. #endif
  698. case 'h':
  699. usage(argv[0]);
  700. return 0;
  701. case '?':
  702. g_print("Unknown option, try '%s --help' for more information.\n",
  703. argv[0]);
  704. return EXIT_FAILURE;
  705. }
  706. }
  707. s = g_malloc0(sizeof(GAState));
  708. s->log_level = log_level;
  709. s->log_file = stderr;
  710. g_log_set_default_handler(ga_log, s);
  711. g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR);
  712. ga_enable_logging(s);
  713. s->state_filepath_isfrozen = g_strdup_printf("%s/qga.state.isfrozen",
  714. state_dir);
  715. s->frozen = false;
  716. #ifndef _WIN32
  717. /* check if a previous instance of qemu-ga exited with filesystems' state
  718. * marked as frozen. this could be a stale value (a non-qemu-ga process
  719. * or reboot may have since unfrozen them), but better to require an
  720. * uneeded unfreeze than to risk hanging on start-up
  721. */
  722. struct stat st;
  723. if (stat(s->state_filepath_isfrozen, &st) == -1) {
  724. /* it's okay if the file doesn't exist, but if we can't access for
  725. * some other reason, such as permissions, there's a configuration
  726. * that needs to be addressed. so just bail now before we get into
  727. * more trouble later
  728. */
  729. if (errno != ENOENT) {
  730. g_critical("unable to access state file at path %s: %s",
  731. s->state_filepath_isfrozen, strerror(errno));
  732. return EXIT_FAILURE;
  733. }
  734. } else {
  735. g_warning("previous instance appears to have exited with frozen"
  736. " filesystems. deferring logging/pidfile creation and"
  737. " disabling non-fsfreeze-safe commands until"
  738. " guest-fsfreeze-thaw is issued, or filesystems are"
  739. " manually unfrozen and the file %s is removed",
  740. s->state_filepath_isfrozen);
  741. s->frozen = true;
  742. }
  743. #endif
  744. if (ga_is_frozen(s)) {
  745. if (daemonize) {
  746. /* delay opening/locking of pidfile till filesystem are unfrozen */
  747. s->deferred_options.pid_filepath = pid_filepath;
  748. become_daemon(NULL);
  749. }
  750. if (log_filepath) {
  751. /* delay opening the log file till filesystems are unfrozen */
  752. s->deferred_options.log_filepath = log_filepath;
  753. }
  754. ga_disable_logging(s);
  755. ga_disable_non_whitelisted();
  756. } else {
  757. if (daemonize) {
  758. become_daemon(pid_filepath);
  759. }
  760. if (log_filepath) {
  761. FILE *log_file = fopen(log_filepath, "a");
  762. if (!log_file) {
  763. g_critical("unable to open specified log file: %s",
  764. strerror(errno));
  765. goto out_bad;
  766. }
  767. s->log_file = log_file;
  768. }
  769. }
  770. if (blacklist) {
  771. s->blacklist = blacklist;
  772. do {
  773. g_debug("disabling command: %s", (char *)blacklist->data);
  774. qmp_disable_command(blacklist->data);
  775. blacklist = g_list_next(blacklist);
  776. } while (blacklist);
  777. }
  778. s->command_state = ga_command_state_new();
  779. ga_command_state_init(s, s->command_state);
  780. ga_command_state_init_all(s->command_state);
  781. json_message_parser_init(&s->parser, process_event);
  782. ga_state = s;
  783. #ifndef _WIN32
  784. if (!register_signal_handlers()) {
  785. g_critical("failed to register signal handlers");
  786. goto out_bad;
  787. }
  788. #endif
  789. s->main_loop = g_main_loop_new(NULL, false);
  790. if (!channel_init(ga_state, method, path)) {
  791. g_critical("failed to initialize guest agent channel");
  792. goto out_bad;
  793. }
  794. #ifndef _WIN32
  795. g_main_loop_run(ga_state->main_loop);
  796. #else
  797. if (daemonize) {
  798. SERVICE_TABLE_ENTRY service_table[] = {
  799. { (char *)QGA_SERVICE_NAME, service_main }, { NULL, NULL } };
  800. StartServiceCtrlDispatcher(service_table);
  801. } else {
  802. g_main_loop_run(ga_state->main_loop);
  803. }
  804. #endif
  805. ga_command_state_cleanup_all(ga_state->command_state);
  806. ga_channel_free(ga_state->channel);
  807. if (daemonize) {
  808. unlink(pid_filepath);
  809. }
  810. return 0;
  811. out_bad:
  812. if (daemonize) {
  813. unlink(pid_filepath);
  814. }
  815. return EXIT_FAILURE;
  816. }