1
/* Copyright (c) 2012 Dovecot authors, see the included COPYING file */
4
#include "master-instance.h"
6
#include "doveadm-print.h"
12
extern struct doveadm_cmd doveadm_cmd_instance[];
14
static void instance_cmd_help(doveadm_command_t *cmd) ATTR_NORETURN;
16
static bool pid_file_read(const char *path)
24
fd = open(path, O_RDONLY);
27
i_error("open(%s) failed: %m", path);
31
ret = read(fd, buf, sizeof(buf));
33
i_error("read(%s) failed: %m", path);
34
else if (ret > 0 && buf[ret-1] == '\n') {
36
if (str_to_pid(buf, &pid) == 0) {
37
found = !(pid == getpid() ||
38
(kill(pid, 0) < 0 && errno == ESRCH));
45
static void cmd_instance_list(int argc ATTR_UNUSED, char *argv[] ATTR_UNUSED)
47
struct master_instance_list *list;
48
struct master_instance_list_iter *iter;
49
const struct master_instance *inst;
50
const char *pidfile_path;
52
doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
53
doveadm_print_header("path", "path", DOVEADM_PRINT_HEADER_FLAG_EXPAND);
54
doveadm_print_header_simple("name");
55
doveadm_print_header_simple("last used");
56
doveadm_print_header_simple("running");
58
list = master_instance_list_init(MASTER_INSTANCE_PATH);
59
iter = master_instance_list_iterate_init(list);
60
while ((inst = master_instance_iterate_list_next(iter)) != NULL) {
61
doveadm_print(inst->base_dir);
62
doveadm_print(inst->name);
63
doveadm_print(unixdate2str(inst->last_used));
64
pidfile_path = t_strconcat(inst->base_dir, "/master.pid", NULL);
65
if (pid_file_read(pidfile_path))
70
master_instance_iterate_list_deinit(&iter);
71
master_instance_list_deinit(&list);
74
static void cmd_instance_remove(int argc, char *argv[])
76
struct master_instance_list *list;
77
const struct master_instance *inst;
82
instance_cmd_help(cmd_instance_remove);
84
list = master_instance_list_init(MASTER_INSTANCE_PATH);
85
inst = master_instance_list_find_by_name(list, argv[1]);
86
base_dir = inst != NULL ? inst->base_dir : argv[1];
87
if ((ret = master_instance_list_remove(list, base_dir)) < 0) {
88
i_error("Failed to remove instance");
89
doveadm_exit_code = EX_TEMPFAIL;
90
} else if (ret == 0) {
91
i_error("Instance already didn't exist");
92
doveadm_exit_code = DOVEADM_EX_NOTFOUND;
94
master_instance_list_deinit(&list);
97
struct doveadm_cmd doveadm_cmd_instance[] = {
98
{ cmd_instance_list, "instance list", "" },
99
{ cmd_instance_remove, "instance remove", "<name> | <base dir>" }
102
static void instance_cmd_help(doveadm_command_t *cmd)
106
for (i = 0; i < N_ELEMENTS(doveadm_cmd_instance); i++) {
107
if (doveadm_cmd_instance[i].cmd == cmd)
108
help(&doveadm_cmd_instance[i]);
113
void doveadm_register_instance_commands(void)
117
for (i = 0; i < N_ELEMENTS(doveadm_cmd_instance); i++)
118
doveadm_register_cmd(&doveadm_cmd_instance[i]);