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