]> jfr.im git - solanum.git/commitdiff
Allow remote DIE and RESTART (from ircd-seven)
authorWilliam Pitcock <redacted>
Tue, 12 Jan 2016 06:04:54 +0000 (00:04 -0600)
committerWilliam Pitcock <redacted>
Tue, 12 Jan 2016 06:04:54 +0000 (00:04 -0600)
doc/reference.conf
include/s_newconf.h
ircd/newconf.c
modules/core/m_die.c
modules/m_restart.c
modules/m_stats.c

index 1b94449fea3b445c40f34db9e28abd02f421478f..5f9eab2b1f5e046ec60a8c73563f8c9b4c0dd572 100755 (executable)
@@ -672,6 +672,7 @@ shared {
         *    tdline  - allow setting temp dlines
         *    undline - allow removing dlines
         *    grant   - allow granting operator status
+        *    die     - allow remote DIE/RESTART
         *    none    - disallow everything
         */
 
index 3dbcab71e40d4193da65536db3cc18283b6a812e..2a55a830082bb8c99b505d319b9041f1c70278d9 100644 (file)
@@ -97,6 +97,7 @@ struct remote_conf
 #define SHARED_PDLINE  0x1000
 #define SHARED_UNDLINE 0x2000
 #define SHARED_GRANT   0x4000
+#define SHARED_DIE     0x8000
 
 #define SHARED_ALL     (SHARED_TKLINE | SHARED_PKLINE | SHARED_UNKLINE |\
                        SHARED_PXLINE | SHARED_TXLINE | SHARED_UNXLINE |\
index f6cbd44b604147b79b9cc9fffdb3bbf81087d860..42244f85f33bd294aa3ea80e1815c5a8ee72b329 100644 (file)
@@ -390,6 +390,7 @@ static struct mode_table shared_table[] =
        { "locops",     SHARED_LOCOPS   },
        { "rehash",     SHARED_REHASH   },
        { "grant",      SHARED_GRANT    },
+       { "die",        SHARED_DIE      },
        { "all",        SHARED_ALL      },
        { "none",       0               },
        {NULL, 0}
index e8aa279ee354d05c89a0eb6fc66406b292aff7c6..ef4394f35f7920d76aa61addc6ef461ffbce4bba 100644 (file)
 #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,44 @@ 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;
index e175e9d991070ab2269d5d4d9b2dd483bf71186a..a8ca8b08ee8c1495fc4df920587e70eb3a4ce2b9 100644 (file)
 #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 };
@@ -72,7 +75,48 @@ 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;
index a59d604b99c86cb492401bf907f280dbae65d401..cdb6419592cea9223172f115b9214a8e4ab4e4bd 100644 (file)
@@ -1054,6 +1054,7 @@ static struct shared_flags shared_flagtable[] =
        { SHARED_PDLINE,        'D' },
        { SHARED_UNDLINE,       'E' },
        { SHARED_GRANT,         'G' },
+       { SHARED_DIE,           'I' },
        { 0,                    '\0'}
 };