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 #include <glib/gstdio.h> 19 #ifndef _WIN32 20 #include <syslog.h> 21 #include <sys/wait.h> 22 #include <sys/stat.h> 23 #endif 24 #include "qapi/qmp/json-streamer.h" 25 #include "qapi/qmp/json-parser.h" 26 #include "qapi/qmp/qint.h" 27 #include "qapi/qmp/qjson.h" 28 #include "qga/guest-agent-core.h" 29 #include "qemu/module.h" 30 #include "signal.h" 31 #include "qapi/qmp/qerror.h" 32 #include "qapi/qmp/dispatch.h" 33 #include "qga/channel.h" 34 #include "qemu/bswap.h" 35 #ifdef _WIN32 36 #include "qga/service-win32.h" 37 #include <windows.h> 38 #endif 39 #ifdef __linux__ 40 #include <linux/fs.h> 41 #ifdef FIFREEZE 42 #define CONFIG_FSFREEZE 43 #endif 44 #endif 45 46 #ifndef _WIN32 47 #define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0" 48 #else 49 #define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0" 50 #endif 51 #define QGA_STATEDIR_DEFAULT CONFIG_QEMU_LOCALSTATEDIR "/run" 52 #define QGA_PIDFILE_DEFAULT QGA_STATEDIR_DEFAULT "/qemu-ga.pid" 53 #ifdef CONFIG_FSFREEZE 54 #define QGA_FSFREEZE_HOOK_DEFAULT CONFIG_QEMU_CONFDIR "/fsfreeze-hook" 55 #endif 56 #define QGA_SENTINEL_BYTE 0xFF 57 58 typedef struct GAPersistentState { 59 #define QGA_PSTATE_DEFAULT_FD_COUNTER 1000 60 int64_t fd_counter; 61 } GAPersistentState; 62 63 struct GAState { 64 JSONMessageParser parser; 65 GMainLoop *main_loop; 66 GAChannel *channel; 67 bool virtio; /* fastpath to check for virtio to deal with poll() quirks */ 68 GACommandState *command_state; 69 GLogLevelFlags log_level; 70 FILE *log_file; 71 bool logging_enabled; 72 #ifdef _WIN32 73 GAService service; 74 #endif 75 bool delimit_response; 76 bool frozen; 77 GList *blacklist; 78 const char *state_filepath_isfrozen; 79 struct { 80 const char *log_filepath; 81 const char *pid_filepath; 82 } deferred_options; 83 #ifdef CONFIG_FSFREEZE 84 const char *fsfreeze_hook; 85 #endif 86 const gchar *pstate_filepath; 87 GAPersistentState pstate; 88 }; 89 90 struct GAState *ga_state; 91 92 /* commands that are safe to issue while filesystems are frozen */ 93 static const char *ga_freeze_whitelist[] = { 94 "guest-ping", 95 "guest-info", 96 "guest-sync", 97 "guest-sync-delimited", 98 "guest-fsfreeze-status", 99 "guest-fsfreeze-thaw", 100 NULL 101 }; 102 103 #ifdef _WIN32 104 DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data, 105 LPVOID ctx); 106 VOID WINAPI service_main(DWORD argc, TCHAR *argv[]); 107 #endif 108 109 static void quit_handler(int sig) 110 { 111 /* if we're frozen, don't exit unless we're absolutely forced to, 112 * because it's basically impossible for graceful exit to complete 113 * unless all log/pid files are on unfreezable filesystems. there's 114 * also a very likely chance killing the agent before unfreezing 115 * the filesystems is a mistake (or will be viewed as one later). 116 */ 117 if (ga_is_frozen(ga_state)) { 118 return; 119 } 120 g_debug("received signal num %d, quitting", sig); 121 122 if (g_main_loop_is_running(ga_state->main_loop)) { 123 g_main_loop_quit(ga_state->main_loop); 124 } 125 } 126 127 #ifndef _WIN32 128 static gboolean register_signal_handlers(void) 129 { 130 struct sigaction sigact; 131 int ret; 132 133 memset(&sigact, 0, sizeof(struct sigaction)); 134 sigact.sa_handler = quit_handler; 135 136 ret = sigaction(SIGINT, &sigact, NULL); 137 if (ret == -1) { 138 g_error("error configuring signal handler: %s", strerror(errno)); 139 } 140 ret = sigaction(SIGTERM, &sigact, NULL); 141 if (ret == -1) { 142 g_error("error configuring signal handler: %s", strerror(errno)); 143 } 144 145 return true; 146 } 147 148 /* TODO: use this in place of all post-fork() fclose(std*) callers */ 149 void reopen_fd_to_null(int fd) 150 { 151 int nullfd; 152 153 nullfd = open("/dev/null", O_RDWR); 154 if (nullfd < 0) { 155 return; 156 } 157 158 dup2(nullfd, fd); 159 160 if (nullfd != fd) { 161 close(nullfd); 162 } 163 } 164 #endif 165 166 static void usage(const char *cmd) 167 { 168 printf( 169 "Usage: %s [-m <method> -p <path>] [<options>]\n" 170 "QEMU Guest Agent %s\n" 171 "\n" 172 " -m, --method transport method: one of unix-listen, virtio-serial, or\n" 173 " isa-serial (virtio-serial is the default)\n" 174 " -p, --path device/socket path (the default for virtio-serial is:\n" 175 " %s)\n" 176 " -l, --logfile set logfile path, logs to stderr by default\n" 177 " -f, --pidfile specify pidfile (default is %s)\n" 178 #ifdef CONFIG_FSFREEZE 179 " -F, --fsfreeze-hook\n" 180 " enable fsfreeze hook. Accepts an optional argument that\n" 181 " specifies script to run on freeze/thaw. Script will be\n" 182 " called with 'freeze'/'thaw' arguments accordingly.\n" 183 " (default is %s)\n" 184 " If using -F with an argument, do not follow -F with a\n" 185 " space.\n" 186 " (for example: -F/var/run/fsfreezehook.sh)\n" 187 #endif 188 " -t, --statedir specify dir to store state information (absolute paths\n" 189 " only, default is %s)\n" 190 " -v, --verbose log extra debugging information\n" 191 " -V, --version print version information and exit\n" 192 " -d, --daemonize become a daemon\n" 193 #ifdef _WIN32 194 " -s, --service service commands: install, uninstall\n" 195 #endif 196 " -b, --blacklist comma-separated list of RPCs to disable (no spaces, \"?\"\n" 197 " to list available RPCs)\n" 198 " -h, --help display this help and exit\n" 199 "\n" 200 "Report bugs to <mdroth@linux.vnet.ibm.com>\n" 201 , cmd, QEMU_VERSION, QGA_VIRTIO_PATH_DEFAULT, QGA_PIDFILE_DEFAULT, 202 #ifdef CONFIG_FSFREEZE 203 QGA_FSFREEZE_HOOK_DEFAULT, 204 #endif 205 QGA_STATEDIR_DEFAULT); 206 } 207 208 static const char *ga_log_level_str(GLogLevelFlags level) 209 { 210 switch (level & G_LOG_LEVEL_MASK) { 211 case G_LOG_LEVEL_ERROR: 212 return "error"; 213 case G_LOG_LEVEL_CRITICAL: 214 return "critical"; 215 case G_LOG_LEVEL_WARNING: 216 return "warning"; 217 case G_LOG_LEVEL_MESSAGE: 218 return "message"; 219 case G_LOG_LEVEL_INFO: 220 return "info"; 221 case G_LOG_LEVEL_DEBUG: 222 return "debug"; 223 default: 224 return "user"; 225 } 226 } 227 228 bool ga_logging_enabled(GAState *s) 229 { 230 return s->logging_enabled; 231 } 232 233 void ga_disable_logging(GAState *s) 234 { 235 s->logging_enabled = false; 236 } 237 238 void ga_enable_logging(GAState *s) 239 { 240 s->logging_enabled = true; 241 } 242 243 static void ga_log(const gchar *domain, GLogLevelFlags level, 244 const gchar *msg, gpointer opaque) 245 { 246 GAState *s = opaque; 247 GTimeVal time; 248 const char *level_str = ga_log_level_str(level); 249 250 if (!ga_logging_enabled(s)) { 251 return; 252 } 253 254 level &= G_LOG_LEVEL_MASK; 255 #ifndef _WIN32 256 if (domain && strcmp(domain, "syslog") == 0) { 257 syslog(LOG_INFO, "%s: %s", level_str, msg); 258 } else if (level & s->log_level) { 259 #else 260 if (level & s->log_level) { 261 #endif 262 g_get_current_time(&time); 263 fprintf(s->log_file, 264 "%lu.%lu: %s: %s\n", time.tv_sec, time.tv_usec, level_str, msg); 265 fflush(s->log_file); 266 } 267 } 268 269 void ga_set_response_delimited(GAState *s) 270 { 271 s->delimit_response = true; 272 } 273 274 static FILE *ga_open_logfile(const char *logfile) 275 { 276 FILE *f; 277 278 f = fopen(logfile, "a"); 279 if (!f) { 280 return NULL; 281 } 282 283 qemu_set_cloexec(fileno(f)); 284 return f; 285 } 286 287 #ifndef _WIN32 288 static bool ga_open_pidfile(const char *pidfile) 289 { 290 int pidfd; 291 char pidstr[32]; 292 293 pidfd = qemu_open(pidfile, O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR); 294 if (pidfd == -1 || lockf(pidfd, F_TLOCK, 0)) { 295 g_critical("Cannot lock pid file, %s", strerror(errno)); 296 if (pidfd != -1) { 297 close(pidfd); 298 } 299 return false; 300 } 301 302 if (ftruncate(pidfd, 0)) { 303 g_critical("Failed to truncate pid file"); 304 goto fail; 305 } 306 snprintf(pidstr, sizeof(pidstr), "%d\n", getpid()); 307 if (write(pidfd, pidstr, strlen(pidstr)) != strlen(pidstr)) { 308 g_critical("Failed to write pid file"); 309 goto fail; 310 } 311 312 /* keep pidfile open & locked forever */ 313 return true; 314 315 fail: 316 unlink(pidfile); 317 close(pidfd); 318 return false; 319 } 320 #else /* _WIN32 */ 321 static bool ga_open_pidfile(const char *pidfile) 322 { 323 return true; 324 } 325 #endif 326 327 static gint ga_strcmp(gconstpointer str1, gconstpointer str2) 328 { 329 return strcmp(str1, str2); 330 } 331 332 /* disable commands that aren't safe for fsfreeze */ 333 static void ga_disable_non_whitelisted(void) 334 { 335 char **list_head, **list; 336 bool whitelisted; 337 int i; 338 339 list_head = list = qmp_get_command_list(); 340 while (*list != NULL) { 341 whitelisted = false; 342 i = 0; 343 while (ga_freeze_whitelist[i] != NULL) { 344 if (strcmp(*list, ga_freeze_whitelist[i]) == 0) { 345 whitelisted = true; 346 } 347 i++; 348 } 349 if (!whitelisted) { 350 g_debug("disabling command: %s", *list); 351 qmp_disable_command(*list); 352 } 353 g_free(*list); 354 list++; 355 } 356 g_free(list_head); 357 } 358 359 /* [re-]enable all commands, except those explicitly blacklisted by user */ 360 static void ga_enable_non_blacklisted(GList *blacklist) 361 { 362 char **list_head, **list; 363 364 list_head = list = qmp_get_command_list(); 365 while (*list != NULL) { 366 if (g_list_find_custom(blacklist, *list, ga_strcmp) == NULL && 367 !qmp_command_is_enabled(*list)) { 368 g_debug("enabling command: %s", *list); 369 qmp_enable_command(*list); 370 } 371 g_free(*list); 372 list++; 373 } 374 g_free(list_head); 375 } 376 377 static bool ga_create_file(const char *path) 378 { 379 int fd = open(path, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR); 380 if (fd == -1) { 381 g_warning("unable to open/create file %s: %s", path, strerror(errno)); 382 return false; 383 } 384 close(fd); 385 return true; 386 } 387 388 static bool ga_delete_file(const char *path) 389 { 390 int ret = unlink(path); 391 if (ret == -1) { 392 g_warning("unable to delete file: %s: %s", path, strerror(errno)); 393 return false; 394 } 395 396 return true; 397 } 398 399 bool ga_is_frozen(GAState *s) 400 { 401 return s->frozen; 402 } 403 404 void ga_set_frozen(GAState *s) 405 { 406 if (ga_is_frozen(s)) { 407 return; 408 } 409 /* disable all non-whitelisted (for frozen state) commands */ 410 ga_disable_non_whitelisted(); 411 g_warning("disabling logging due to filesystem freeze"); 412 ga_disable_logging(s); 413 s->frozen = true; 414 if (!ga_create_file(s->state_filepath_isfrozen)) { 415 g_warning("unable to create %s, fsfreeze may not function properly", 416 s->state_filepath_isfrozen); 417 } 418 } 419 420 void ga_unset_frozen(GAState *s) 421 { 422 if (!ga_is_frozen(s)) { 423 return; 424 } 425 426 /* if we delayed creation/opening of pid/log files due to being 427 * in a frozen state at start up, do it now 428 */ 429 if (s->deferred_options.log_filepath) { 430 s->log_file = ga_open_logfile(s->deferred_options.log_filepath); 431 if (!s->log_file) { 432 s->log_file = stderr; 433 } 434 s->deferred_options.log_filepath = NULL; 435 } 436 ga_enable_logging(s); 437 g_warning("logging re-enabled due to filesystem unfreeze"); 438 if (s->deferred_options.pid_filepath) { 439 if (!ga_open_pidfile(s->deferred_options.pid_filepath)) { 440 g_warning("failed to create/open pid file"); 441 } 442 s->deferred_options.pid_filepath = NULL; 443 } 444 445 /* enable all disabled, non-blacklisted commands */ 446 ga_enable_non_blacklisted(s->blacklist); 447 s->frozen = false; 448 if (!ga_delete_file(s->state_filepath_isfrozen)) { 449 g_warning("unable to delete %s, fsfreeze may not function properly", 450 s->state_filepath_isfrozen); 451 } 452 } 453 454 #ifdef CONFIG_FSFREEZE 455 const char *ga_fsfreeze_hook(GAState *s) 456 { 457 return s->fsfreeze_hook; 458 } 459 #endif 460 461 static void become_daemon(const char *pidfile) 462 { 463 #ifndef _WIN32 464 pid_t pid, sid; 465 466 pid = fork(); 467 if (pid < 0) { 468 exit(EXIT_FAILURE); 469 } 470 if (pid > 0) { 471 exit(EXIT_SUCCESS); 472 } 473 474 if (pidfile) { 475 if (!ga_open_pidfile(pidfile)) { 476 g_critical("failed to create pidfile"); 477 exit(EXIT_FAILURE); 478 } 479 } 480 481 umask(0); 482 sid = setsid(); 483 if (sid < 0) { 484 goto fail; 485 } 486 if ((chdir("/")) < 0) { 487 goto fail; 488 } 489 490 reopen_fd_to_null(STDIN_FILENO); 491 reopen_fd_to_null(STDOUT_FILENO); 492 reopen_fd_to_null(STDERR_FILENO); 493 return; 494 495 fail: 496 if (pidfile) { 497 unlink(pidfile); 498 } 499 g_critical("failed to daemonize"); 500 exit(EXIT_FAILURE); 501 #endif 502 } 503 504 static int send_response(GAState *s, QObject *payload) 505 { 506 const char *buf; 507 QString *payload_qstr, *response_qstr; 508 GIOStatus status; 509 510 g_assert(payload && s->channel); 511 512 payload_qstr = qobject_to_json(payload); 513 if (!payload_qstr) { 514 return -EINVAL; 515 } 516 517 if (s->delimit_response) { 518 s->delimit_response = false; 519 response_qstr = qstring_new(); 520 qstring_append_chr(response_qstr, QGA_SENTINEL_BYTE); 521 qstring_append(response_qstr, qstring_get_str(payload_qstr)); 522 QDECREF(payload_qstr); 523 } else { 524 response_qstr = payload_qstr; 525 } 526 527 qstring_append_chr(response_qstr, '\n'); 528 buf = qstring_get_str(response_qstr); 529 status = ga_channel_write_all(s->channel, buf, strlen(buf)); 530 QDECREF(response_qstr); 531 if (status != G_IO_STATUS_NORMAL) { 532 return -EIO; 533 } 534 535 return 0; 536 } 537 538 static void process_command(GAState *s, QDict *req) 539 { 540 QObject *rsp = NULL; 541 int ret; 542 543 g_assert(req); 544 g_debug("processing command"); 545 rsp = qmp_dispatch(QOBJECT(req)); 546 if (rsp) { 547 ret = send_response(s, rsp); 548 if (ret) { 549 g_warning("error sending response: %s", strerror(ret)); 550 } 551 qobject_decref(rsp); 552 } 553 } 554 555 /* handle requests/control events coming in over the channel */ 556 static void process_event(JSONMessageParser *parser, QList *tokens) 557 { 558 GAState *s = container_of(parser, GAState, parser); 559 QObject *obj; 560 QDict *qdict; 561 Error *err = NULL; 562 int ret; 563 564 g_assert(s && parser); 565 566 g_debug("process_event: called"); 567 obj = json_parser_parse_err(tokens, NULL, &err); 568 if (err || !obj || qobject_type(obj) != QTYPE_QDICT) { 569 qobject_decref(obj); 570 qdict = qdict_new(); 571 if (!err) { 572 g_warning("failed to parse event: unknown error"); 573 error_set(&err, QERR_JSON_PARSING); 574 } else { 575 g_warning("failed to parse event: %s", error_get_pretty(err)); 576 } 577 qdict_put_obj(qdict, "error", qmp_build_error_object(err)); 578 error_free(err); 579 } else { 580 qdict = qobject_to_qdict(obj); 581 } 582 583 g_assert(qdict); 584 585 /* handle host->guest commands */ 586 if (qdict_haskey(qdict, "execute")) { 587 process_command(s, qdict); 588 } else { 589 if (!qdict_haskey(qdict, "error")) { 590 QDECREF(qdict); 591 qdict = qdict_new(); 592 g_warning("unrecognized payload format"); 593 error_set(&err, QERR_UNSUPPORTED); 594 qdict_put_obj(qdict, "error", qmp_build_error_object(err)); 595 error_free(err); 596 } 597 ret = send_response(s, QOBJECT(qdict)); 598 if (ret) { 599 g_warning("error sending error response: %s", strerror(ret)); 600 } 601 } 602 603 QDECREF(qdict); 604 } 605 606 /* false return signals GAChannel to close the current client connection */ 607 static gboolean channel_event_cb(GIOCondition condition, gpointer data) 608 { 609 GAState *s = data; 610 gchar buf[QGA_READ_COUNT_DEFAULT+1]; 611 gsize count; 612 GError *err = NULL; 613 GIOStatus status = ga_channel_read(s->channel, buf, QGA_READ_COUNT_DEFAULT, &count); 614 if (err != NULL) { 615 g_warning("error reading channel: %s", err->message); 616 g_error_free(err); 617 return false; 618 } 619 switch (status) { 620 case G_IO_STATUS_ERROR: 621 g_warning("error reading channel"); 622 return false; 623 case G_IO_STATUS_NORMAL: 624 buf[count] = 0; 625 g_debug("read data, count: %d, data: %s", (int)count, buf); 626 json_message_parser_feed(&s->parser, (char *)buf, (int)count); 627 break; 628 case G_IO_STATUS_EOF: 629 g_debug("received EOF"); 630 if (!s->virtio) { 631 return false; 632 } 633 /* fall through */ 634 case G_IO_STATUS_AGAIN: 635 /* virtio causes us to spin here when no process is attached to 636 * host-side chardev. sleep a bit to mitigate this 637 */ 638 if (s->virtio) { 639 usleep(100*1000); 640 } 641 return true; 642 default: 643 g_warning("unknown channel read status, closing"); 644 return false; 645 } 646 return true; 647 } 648 649 static gboolean channel_init(GAState *s, const gchar *method, const gchar *path) 650 { 651 GAChannelMethod channel_method; 652 653 if (method == NULL) { 654 method = "virtio-serial"; 655 } 656 657 if (path == NULL) { 658 if (strcmp(method, "virtio-serial") != 0) { 659 g_critical("must specify a path for this channel"); 660 return false; 661 } 662 /* try the default path for the virtio-serial port */ 663 path = QGA_VIRTIO_PATH_DEFAULT; 664 } 665 666 if (strcmp(method, "virtio-serial") == 0) { 667 s->virtio = true; /* virtio requires special handling in some cases */ 668 channel_method = GA_CHANNEL_VIRTIO_SERIAL; 669 } else if (strcmp(method, "isa-serial") == 0) { 670 channel_method = GA_CHANNEL_ISA_SERIAL; 671 } else if (strcmp(method, "unix-listen") == 0) { 672 channel_method = GA_CHANNEL_UNIX_LISTEN; 673 } else { 674 g_critical("unsupported channel method/type: %s", method); 675 return false; 676 } 677 678 s->channel = ga_channel_new(channel_method, path, channel_event_cb, s); 679 if (!s->channel) { 680 g_critical("failed to create guest agent channel"); 681 return false; 682 } 683 684 return true; 685 } 686 687 #ifdef _WIN32 688 DWORD WINAPI service_ctrl_handler(DWORD ctrl, DWORD type, LPVOID data, 689 LPVOID ctx) 690 { 691 DWORD ret = NO_ERROR; 692 GAService *service = &ga_state->service; 693 694 switch (ctrl) 695 { 696 case SERVICE_CONTROL_STOP: 697 case SERVICE_CONTROL_SHUTDOWN: 698 quit_handler(SIGTERM); 699 service->status.dwCurrentState = SERVICE_STOP_PENDING; 700 SetServiceStatus(service->status_handle, &service->status); 701 break; 702 703 default: 704 ret = ERROR_CALL_NOT_IMPLEMENTED; 705 } 706 return ret; 707 } 708 709 VOID WINAPI service_main(DWORD argc, TCHAR *argv[]) 710 { 711 GAService *service = &ga_state->service; 712 713 service->status_handle = RegisterServiceCtrlHandlerEx(QGA_SERVICE_NAME, 714 service_ctrl_handler, NULL); 715 716 if (service->status_handle == 0) { 717 g_critical("Failed to register extended requests function!\n"); 718 return; 719 } 720 721 service->status.dwServiceType = SERVICE_WIN32; 722 service->status.dwCurrentState = SERVICE_RUNNING; 723 service->status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; 724 service->status.dwWin32ExitCode = NO_ERROR; 725 service->status.dwServiceSpecificExitCode = NO_ERROR; 726 service->status.dwCheckPoint = 0; 727 service->status.dwWaitHint = 0; 728 SetServiceStatus(service->status_handle, &service->status); 729 730 g_main_loop_run(ga_state->main_loop); 731 732 service->status.dwCurrentState = SERVICE_STOPPED; 733 SetServiceStatus(service->status_handle, &service->status); 734 } 735 #endif 736 737 static void set_persistent_state_defaults(GAPersistentState *pstate) 738 { 739 g_assert(pstate); 740 pstate->fd_counter = QGA_PSTATE_DEFAULT_FD_COUNTER; 741 } 742 743 static void persistent_state_from_keyfile(GAPersistentState *pstate, 744 GKeyFile *keyfile) 745 { 746 g_assert(pstate); 747 g_assert(keyfile); 748 /* if any fields are missing, either because the file was tampered with 749 * by agents of chaos, or because the field wasn't present at the time the 750 * file was created, the best we can ever do is start over with the default 751 * values. so load them now, and ignore any errors in accessing key-value 752 * pairs 753 */ 754 set_persistent_state_defaults(pstate); 755 756 if (g_key_file_has_key(keyfile, "global", "fd_counter", NULL)) { 757 pstate->fd_counter = 758 g_key_file_get_integer(keyfile, "global", "fd_counter", NULL); 759 } 760 } 761 762 static void persistent_state_to_keyfile(const GAPersistentState *pstate, 763 GKeyFile *keyfile) 764 { 765 g_assert(pstate); 766 g_assert(keyfile); 767 768 g_key_file_set_integer(keyfile, "global", "fd_counter", pstate->fd_counter); 769 } 770 771 static gboolean write_persistent_state(const GAPersistentState *pstate, 772 const gchar *path) 773 { 774 GKeyFile *keyfile = g_key_file_new(); 775 GError *gerr = NULL; 776 gboolean ret = true; 777 gchar *data = NULL; 778 gsize data_len; 779 780 g_assert(pstate); 781 782 persistent_state_to_keyfile(pstate, keyfile); 783 data = g_key_file_to_data(keyfile, &data_len, &gerr); 784 if (gerr) { 785 g_critical("failed to convert persistent state to string: %s", 786 gerr->message); 787 ret = false; 788 goto out; 789 } 790 791 g_file_set_contents(path, data, data_len, &gerr); 792 if (gerr) { 793 g_critical("failed to write persistent state to %s: %s", 794 path, gerr->message); 795 ret = false; 796 goto out; 797 } 798 799 out: 800 if (gerr) { 801 g_error_free(gerr); 802 } 803 if (keyfile) { 804 g_key_file_free(keyfile); 805 } 806 g_free(data); 807 return ret; 808 } 809 810 static gboolean read_persistent_state(GAPersistentState *pstate, 811 const gchar *path, gboolean frozen) 812 { 813 GKeyFile *keyfile = NULL; 814 GError *gerr = NULL; 815 struct stat st; 816 gboolean ret = true; 817 818 g_assert(pstate); 819 820 if (stat(path, &st) == -1) { 821 /* it's okay if state file doesn't exist, but any other error 822 * indicates a permissions issue or some other misconfiguration 823 * that we likely won't be able to recover from. 824 */ 825 if (errno != ENOENT) { 826 g_critical("unable to access state file at path %s: %s", 827 path, strerror(errno)); 828 ret = false; 829 goto out; 830 } 831 832 /* file doesn't exist. initialize state to default values and 833 * attempt to save now. (we could wait till later when we have 834 * modified state we need to commit, but if there's a problem, 835 * such as a missing parent directory, we want to catch it now) 836 * 837 * there is a potential scenario where someone either managed to 838 * update the agent from a version that didn't use a key store 839 * while qemu-ga thought the filesystem was frozen, or 840 * deleted the key store prior to issuing a fsfreeze, prior 841 * to restarting the agent. in this case we go ahead and defer 842 * initial creation till we actually have modified state to 843 * write, otherwise fail to recover from freeze. 844 */ 845 set_persistent_state_defaults(pstate); 846 if (!frozen) { 847 ret = write_persistent_state(pstate, path); 848 if (!ret) { 849 g_critical("unable to create state file at path %s", path); 850 ret = false; 851 goto out; 852 } 853 } 854 ret = true; 855 goto out; 856 } 857 858 keyfile = g_key_file_new(); 859 g_key_file_load_from_file(keyfile, path, 0, &gerr); 860 if (gerr) { 861 g_critical("error loading persistent state from path: %s, %s", 862 path, gerr->message); 863 ret = false; 864 goto out; 865 } 866 867 persistent_state_from_keyfile(pstate, keyfile); 868 869 out: 870 if (keyfile) { 871 g_key_file_free(keyfile); 872 } 873 if (gerr) { 874 g_error_free(gerr); 875 } 876 877 return ret; 878 } 879 880 int64_t ga_get_fd_handle(GAState *s, Error **errp) 881 { 882 int64_t handle; 883 884 g_assert(s->pstate_filepath); 885 /* we blacklist commands and avoid operations that potentially require 886 * writing to disk when we're in a frozen state. this includes opening 887 * new files, so we should never get here in that situation 888 */ 889 g_assert(!ga_is_frozen(s)); 890 891 handle = s->pstate.fd_counter++; 892 893 /* This should never happen on a reasonable timeframe, as guest-file-open 894 * would have to be issued 2^63 times */ 895 if (s->pstate.fd_counter == INT64_MAX) { 896 abort(); 897 } 898 899 if (!write_persistent_state(&s->pstate, s->pstate_filepath)) { 900 error_setg(errp, "failed to commit persistent state to disk"); 901 } 902 903 return handle; 904 } 905 906 int main(int argc, char **argv) 907 { 908 const char *sopt = "hVvdm:p:l:f:F::b:s:t:"; 909 const char *method = NULL, *path = NULL; 910 const char *log_filepath = NULL; 911 const char *pid_filepath = QGA_PIDFILE_DEFAULT; 912 #ifdef CONFIG_FSFREEZE 913 const char *fsfreeze_hook = NULL; 914 #endif 915 const char *state_dir = QGA_STATEDIR_DEFAULT; 916 #ifdef _WIN32 917 const char *service = NULL; 918 #endif 919 const struct option lopt[] = { 920 { "help", 0, NULL, 'h' }, 921 { "version", 0, NULL, 'V' }, 922 { "logfile", 1, NULL, 'l' }, 923 { "pidfile", 1, NULL, 'f' }, 924 #ifdef CONFIG_FSFREEZE 925 { "fsfreeze-hook", 2, NULL, 'F' }, 926 #endif 927 { "verbose", 0, NULL, 'v' }, 928 { "method", 1, NULL, 'm' }, 929 { "path", 1, NULL, 'p' }, 930 { "daemonize", 0, NULL, 'd' }, 931 { "blacklist", 1, NULL, 'b' }, 932 #ifdef _WIN32 933 { "service", 1, NULL, 's' }, 934 #endif 935 { "statedir", 1, NULL, 't' }, 936 { NULL, 0, NULL, 0 } 937 }; 938 int opt_ind = 0, ch, daemonize = 0, i, j, len; 939 GLogLevelFlags log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL; 940 GList *blacklist = NULL; 941 GAState *s; 942 943 module_call_init(MODULE_INIT_QAPI); 944 945 while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) { 946 switch (ch) { 947 case 'm': 948 method = optarg; 949 break; 950 case 'p': 951 path = optarg; 952 break; 953 case 'l': 954 log_filepath = optarg; 955 break; 956 case 'f': 957 pid_filepath = optarg; 958 break; 959 #ifdef CONFIG_FSFREEZE 960 case 'F': 961 fsfreeze_hook = optarg ? optarg : QGA_FSFREEZE_HOOK_DEFAULT; 962 break; 963 #endif 964 case 't': 965 state_dir = optarg; 966 break; 967 case 'v': 968 /* enable all log levels */ 969 log_level = G_LOG_LEVEL_MASK; 970 break; 971 case 'V': 972 printf("QEMU Guest Agent %s\n", QEMU_VERSION); 973 return 0; 974 case 'd': 975 daemonize = 1; 976 break; 977 case 'b': { 978 char **list_head, **list; 979 if (is_help_option(optarg)) { 980 list_head = list = qmp_get_command_list(); 981 while (*list != NULL) { 982 printf("%s\n", *list); 983 g_free(*list); 984 list++; 985 } 986 g_free(list_head); 987 return 0; 988 } 989 for (j = 0, i = 0, len = strlen(optarg); i < len; i++) { 990 if (optarg[i] == ',') { 991 optarg[i] = 0; 992 blacklist = g_list_append(blacklist, &optarg[j]); 993 j = i + 1; 994 } 995 } 996 if (j < i) { 997 blacklist = g_list_append(blacklist, &optarg[j]); 998 } 999 break; 1000 } 1001 #ifdef _WIN32 1002 case 's': 1003 service = optarg; 1004 if (strcmp(service, "install") == 0) { 1005 return ga_install_service(path, log_filepath); 1006 } else if (strcmp(service, "uninstall") == 0) { 1007 return ga_uninstall_service(); 1008 } else { 1009 printf("Unknown service command.\n"); 1010 return EXIT_FAILURE; 1011 } 1012 break; 1013 #endif 1014 case 'h': 1015 usage(argv[0]); 1016 return 0; 1017 case '?': 1018 g_print("Unknown option, try '%s --help' for more information.\n", 1019 argv[0]); 1020 return EXIT_FAILURE; 1021 } 1022 } 1023 1024 s = g_malloc0(sizeof(GAState)); 1025 s->log_level = log_level; 1026 s->log_file = stderr; 1027 #ifdef CONFIG_FSFREEZE 1028 s->fsfreeze_hook = fsfreeze_hook; 1029 #endif 1030 g_log_set_default_handler(ga_log, s); 1031 g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR); 1032 ga_enable_logging(s); 1033 s->state_filepath_isfrozen = g_strdup_printf("%s/qga.state.isfrozen", 1034 state_dir); 1035 s->pstate_filepath = g_strdup_printf("%s/qga.state", state_dir); 1036 s->frozen = false; 1037 1038 #ifndef _WIN32 1039 /* check if a previous instance of qemu-ga exited with filesystems' state 1040 * marked as frozen. this could be a stale value (a non-qemu-ga process 1041 * or reboot may have since unfrozen them), but better to require an 1042 * uneeded unfreeze than to risk hanging on start-up 1043 */ 1044 struct stat st; 1045 if (stat(s->state_filepath_isfrozen, &st) == -1) { 1046 /* it's okay if the file doesn't exist, but if we can't access for 1047 * some other reason, such as permissions, there's a configuration 1048 * that needs to be addressed. so just bail now before we get into 1049 * more trouble later 1050 */ 1051 if (errno != ENOENT) { 1052 g_critical("unable to access state file at path %s: %s", 1053 s->state_filepath_isfrozen, strerror(errno)); 1054 return EXIT_FAILURE; 1055 } 1056 } else { 1057 g_warning("previous instance appears to have exited with frozen" 1058 " filesystems. deferring logging/pidfile creation and" 1059 " disabling non-fsfreeze-safe commands until" 1060 " guest-fsfreeze-thaw is issued, or filesystems are" 1061 " manually unfrozen and the file %s is removed", 1062 s->state_filepath_isfrozen); 1063 s->frozen = true; 1064 } 1065 #endif 1066 1067 if (ga_is_frozen(s)) { 1068 if (daemonize) { 1069 /* delay opening/locking of pidfile till filesystem are unfrozen */ 1070 s->deferred_options.pid_filepath = pid_filepath; 1071 become_daemon(NULL); 1072 } 1073 if (log_filepath) { 1074 /* delay opening the log file till filesystems are unfrozen */ 1075 s->deferred_options.log_filepath = log_filepath; 1076 } 1077 ga_disable_logging(s); 1078 ga_disable_non_whitelisted(); 1079 } else { 1080 if (daemonize) { 1081 become_daemon(pid_filepath); 1082 } 1083 if (log_filepath) { 1084 FILE *log_file = ga_open_logfile(log_filepath); 1085 if (!log_file) { 1086 g_critical("unable to open specified log file: %s", 1087 strerror(errno)); 1088 goto out_bad; 1089 } 1090 s->log_file = log_file; 1091 } 1092 } 1093 1094 /* load persistent state from disk */ 1095 if (!read_persistent_state(&s->pstate, 1096 s->pstate_filepath, 1097 ga_is_frozen(s))) { 1098 g_critical("failed to load persistent state"); 1099 goto out_bad; 1100 } 1101 1102 if (blacklist) { 1103 s->blacklist = blacklist; 1104 do { 1105 g_debug("disabling command: %s", (char *)blacklist->data); 1106 qmp_disable_command(blacklist->data); 1107 blacklist = g_list_next(blacklist); 1108 } while (blacklist); 1109 } 1110 s->command_state = ga_command_state_new(); 1111 ga_command_state_init(s, s->command_state); 1112 ga_command_state_init_all(s->command_state); 1113 json_message_parser_init(&s->parser, process_event); 1114 ga_state = s; 1115 #ifndef _WIN32 1116 if (!register_signal_handlers()) { 1117 g_critical("failed to register signal handlers"); 1118 goto out_bad; 1119 } 1120 #endif 1121 1122 s->main_loop = g_main_loop_new(NULL, false); 1123 if (!channel_init(ga_state, method, path)) { 1124 g_critical("failed to initialize guest agent channel"); 1125 goto out_bad; 1126 } 1127 #ifndef _WIN32 1128 g_main_loop_run(ga_state->main_loop); 1129 #else 1130 if (daemonize) { 1131 SERVICE_TABLE_ENTRY service_table[] = { 1132 { (char *)QGA_SERVICE_NAME, service_main }, { NULL, NULL } }; 1133 StartServiceCtrlDispatcher(service_table); 1134 } else { 1135 g_main_loop_run(ga_state->main_loop); 1136 } 1137 #endif 1138 1139 ga_command_state_cleanup_all(ga_state->command_state); 1140 ga_channel_free(ga_state->channel); 1141 1142 if (daemonize) { 1143 unlink(pid_filepath); 1144 } 1145 return 0; 1146 1147 out_bad: 1148 if (daemonize) { 1149 unlink(pid_filepath); 1150 } 1151 return EXIT_FAILURE; 1152 } 1153