1 #include <config.h>
2
3 #include "internal.h"
4 #include "virconf.h"
5 #include "viralloc.h"
6 #include "domain_conf.h"
7 #include "virgettext.h"
8
9
10 static int
getArgs(int argc,char ** argv,const char ** uri,const char ** uuid,virDomainLockFailureAction * action)11 getArgs(int argc,
12 char **argv,
13 const char **uri,
14 const char **uuid,
15 virDomainLockFailureAction *action)
16 {
17 int act;
18
19 if (argc != 4) {
20 fprintf(stderr, _("%s uri uuid action\n"), argv[0]);
21 return -1;
22 }
23
24 *uri = argv[1];
25 *uuid = argv[2];
26
27 act = virDomainLockFailureTypeFromString(argv[3]);
28 if (act < 0) {
29 fprintf(stderr, _("invalid failure action: '%s'\n"), argv[3]);
30 return -1;
31 }
32 *action = act;
33
34 return 0;
35 }
36
37
38 static int
authCallback(virConnectCredentialPtr cred G_GNUC_UNUSED,unsigned int ncred G_GNUC_UNUSED,void * cbdata G_GNUC_UNUSED)39 authCallback(virConnectCredentialPtr cred G_GNUC_UNUSED,
40 unsigned int ncred G_GNUC_UNUSED,
41 void *cbdata G_GNUC_UNUSED)
42 {
43 return -1;
44 }
45
46
47 int
main(int argc,char ** argv)48 main(int argc, char **argv)
49 {
50 const char *uri;
51 const char *uuid;
52 virDomainLockFailureAction action;
53 virConnectPtr conn = NULL;
54 virDomainPtr dom = NULL;
55 int ret = EXIT_FAILURE;
56
57 int authTypes[] = {
58 VIR_CRED_AUTHNAME,
59 VIR_CRED_ECHOPROMPT,
60 VIR_CRED_PASSPHRASE,
61 VIR_CRED_NOECHOPROMPT,
62 };
63 virConnectAuth auth = {
64 .credtype = authTypes,
65 .ncredtype = G_N_ELEMENTS(authTypes),
66 .cb = authCallback,
67 };
68
69 if (virGettextInitialize() < 0)
70 exit(EXIT_FAILURE);
71
72 if (getArgs(argc, argv, &uri, &uuid, &action) < 0)
73 goto cleanup;
74
75 if (!(conn = virConnectOpenAuth(uri, &auth, 0)) ||
76 !(dom = virDomainLookupByUUIDString(conn, uuid)))
77 goto cleanup;
78
79 switch (action) {
80 case VIR_DOMAIN_LOCK_FAILURE_POWEROFF:
81 if (virDomainDestroy(dom) == 0 ||
82 virDomainIsActive(dom) == 0)
83 ret = EXIT_SUCCESS;
84 break;
85
86 case VIR_DOMAIN_LOCK_FAILURE_PAUSE:
87 if (virDomainSuspend(dom) == 0)
88 ret = EXIT_SUCCESS;
89 break;
90
91 case VIR_DOMAIN_LOCK_FAILURE_DEFAULT:
92 case VIR_DOMAIN_LOCK_FAILURE_RESTART:
93 case VIR_DOMAIN_LOCK_FAILURE_IGNORE:
94 case VIR_DOMAIN_LOCK_FAILURE_LAST:
95 fprintf(stderr, _("unsupported failure action: '%s'\n"),
96 virDomainLockFailureTypeToString(action));
97 break;
98 }
99
100 cleanup:
101 virObjectUnref(dom);
102 if (conn)
103 virConnectClose(conn);
104
105 return ret;
106 }
107