Pull in remote restart and die (from ircd-seven) allow opers

to remotely restart and die servers.
This commit is contained in:
JD Horelick 2010-03-23 14:21:31 -04:00
parent 74e3e4f1e2
commit 658a333d65
2 changed files with 87 additions and 9 deletions

View File

@ -36,12 +36,15 @@
#include "parse.h"
#include "modules.h"
#include "s_newconf.h"
#include "hash.h"
static int mo_die(struct Client *, struct Client *, int, const char **);
static int me_die(struct Client *, struct Client *, int, const char **);
static int do_die(struct Client *, const char *);
static struct Message die_msgtab = {
"DIE", 0, 0, 0, MFLG_SLOW,
{mg_unreg, mg_not_oper, mg_ignore, mg_ignore, mg_ignore, {mo_die, 0}}
{mg_unreg, mg_not_oper, mg_ignore, mg_ignore, {me_die, 1}, {mo_die, 0}}
};
mapi_clist_av1 die_clist[] = { &die_msgtab, NULL };
@ -65,7 +68,43 @@ mo_die(struct Client *client_p __unused, struct Client *source_p, int parc, cons
sendto_one_notice(source_p, ":Need server name /die %s", me.name);
return 0;
}
else if(irccmp(parv[1], me.name))
if(parc > 2)
{
/* Remote die. Pass it along. */
struct Client *server_p = find_server(NULL, parv[2]);
if (!server_p)
{
sendto_one_numeric(source_p, ERR_NOSUCHSERVER, form_str(ERR_NOSUCHSERVER), parv[2]);
return 0;
}
if (!IsMe(server_p))
{
sendto_one(server_p, ":%s ENCAP %s DIE %s", source_p->name, parv[2], parv[1]);
return 0;
}
}
return do_die(source_p, parv[1]);
}
static int
me_die(struct Client *client_p __unused, struct Client *source_p, int parc, const char *parv[])
{
if(!find_shared_conf(source_p->username, source_p->host, source_p->servptr->name, SHARED_DIE))
{
sendto_one_notice(source_p, ":*** You do not have an appropriate shared block to "
"remotely shut down this server.");
return 0;
}
return do_die(source_p, parv[1]);
}
static int
do_die(struct Client *source_p, const char *servername)
{
if(irccmp(servername, me.name))
{
sendto_one_notice(source_p, ":Mismatch on /die %s", me.name);
return 0;

View File

@ -38,12 +38,15 @@
#include "msg.h"
#include "parse.h"
#include "modules.h"
#include "hash.h"
static int mo_restart(struct Client *, struct Client *, int, const char **);
static int me_restart(struct Client *, struct Client *, int, const char **);
static int do_restart(struct Client *source_p, const char *servername);
struct Message restart_msgtab = {
"RESTART", 0, 0, 0, MFLG_SLOW,
{mg_unreg, mg_not_oper, mg_ignore, mg_ignore, mg_ignore, {mo_restart, 0}}
{mg_unreg, mg_not_oper, mg_ignore, mg_ignore, {me_restart, 1}, {mo_restart, 0}}
};
mapi_clist_av1 restart_clist[] = { &restart_msgtab, NULL };
@ -56,10 +59,6 @@ DECLARE_MODULE_AV1(restart, NULL, NULL, restart_clist, NULL, NULL, "$Revision: 3
static int
mo_restart(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
{
char buf[BUFSIZE];
rb_dlink_node *ptr;
struct Client *target_p;
if(!IsOperDie(source_p))
{
sendto_one(source_p, form_str(ERR_NOPRIVS),
@ -72,11 +71,51 @@ mo_restart(struct Client *client_p, struct Client *source_p, int parc, const cha
sendto_one_notice(source_p, ":Need server name /restart %s", me.name);
return 0;
}
else if(irccmp(parv[1], me.name))
if(parc > 2)
{
/* Remote restart. Pass it along. */
struct Client *server_p = find_server(NULL, parv[2]);
if (!server_p)
{
sendto_one_numeric(source_p, ERR_NOSUCHSERVER, form_str(ERR_NOSUCHSERVER), parv[2]);
return 0;
}
if (!IsMe(server_p))
{
sendto_one(server_p, ":%s ENCAP %s RESTART %s", source_p->name, parv[2], parv[1]);
return 0;
}
}
return do_restart(source_p, parv[1]);
}
static int
me_restart(struct Client *client_p __unused, struct Client *source_p, int parc, const char *parv[])
{
if(!find_shared_conf(source_p->username, source_p->host, source_p->servptr->name, SHARED_DIE))
{
sendto_one_notice(source_p, ":*** You do not have an appropriate shared block to "
"remotely restart this server.");
return 0;
}
return do_restart(source_p, parv[1]);
}
static int
do_restart(struct Client *source_p, const char *servername)
{
char buf[BUFSIZE];
rb_dlink_node *ptr;
struct Client *target_p;
if(irccmp(servername, me.name))
{
sendto_one_notice(source_p, ":Mismatch on /restart %s", me.name);
return 0;
}
}
RB_DLINK_FOREACH(ptr, lclient_list.head)
{