Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/VibeDevelopers/Comet.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442/* * ircd-ratbox: A slightly useful ircd. * m_rehash.c: Re-reads the configuration file. * * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center * Copyright (C) 1996-2002 Hybrid Development Team * Copyright (C) 2002-2005 ircd-ratbox development team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */
#include "stdinc.h"#include "client.h"#include "channel.h"#include "match.h"#include "ircd.h"#include "s_serv.h"#include "numeric.h"#include "s_conf.h"#include "s_newconf.h"#include "logger.h"#include "send.h"#include "msg.h"#include "parse.h"#include "modules.h"#include "hostmask.h"#include "reject.h"#include "hash.h"#include "cache.h"#include "rb_radixtree.h"#include "sslproc.h"
static const char rehash_desc[] = "Provides the REHASH command to reload configuration and other files";
static void mo_rehash(struct MsgBuf *, struct Client *, struct Client *, int, const char **);static void me_rehash(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
struct Message rehash_msgtab = { "REHASH", 0, 0, 0, 0, {mg_unreg, mg_not_oper, mg_ignore, mg_ignore, {me_rehash, 0}, {mo_rehash, 0}}};
mapi_clist_av1 rehash_clist[] = { &rehash_msgtab, NULL };
DECLARE_MODULE_AV2(rehash, NULL, NULL, rehash_clist, NULL, NULL, NULL, NULL, rehash_desc);
struct hash_commands{ const char *cmd; void (*handler) (struct Client * source_p);};
static voidrehash_bans_loc(struct Client *source_p){ if(!IsOperRemoteBan(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "remoteban"); return; }
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is rehashing bans", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
rehash_bans();}
static voidrehash_dns(struct Client *source_p){ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is rehashing DNS", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
reload_nameservers();}
static voidrehash_ssld(struct Client *source_p){ if (!IsOperAdmin(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "admin"); return; }
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is restarting ssld", get_oper_name(source_p));
restart_ssld();}
static voidrehash_motd(struct Client *source_p){ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is forcing re-reading of MOTD file", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
cache_user_motd();}
static voidrehash_omotd(struct Client *source_p){ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is forcing re-reading of OPER MOTD file", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
free_cachefile(oper_motd); oper_motd = cache_file(ircd_paths[IRCD_PATH_IRCD_OMOTD], "opers.motd", 0);}
static voidrehash_tklines(struct Client *source_p){ if(!IsOperRemoteBan(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "remoteban"); return; }
struct ConfItem *aconf; rb_dlink_node *ptr, *next_ptr; int i;
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing temp klines", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
for(i = 0; i < LAST_TEMP_TYPE; i++) { RB_DLINK_FOREACH_SAFE(ptr, next_ptr, temp_klines[i].head) { aconf = ptr->data;
delete_one_address_conf(aconf->host, aconf); rb_dlinkDestroy(ptr, &temp_klines[i]); } }}
static voidrehash_tdlines(struct Client *source_p){ if(!IsOperRemoteBan(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "remoteban"); return; }
struct ConfItem *aconf; rb_dlink_node *ptr, *next_ptr; int i;
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing temp dlines", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
for(i = 0; i < LAST_TEMP_TYPE; i++) { RB_DLINK_FOREACH_SAFE(ptr, next_ptr, temp_dlines[i].head) { aconf = ptr->data;
delete_one_address_conf(aconf->host, aconf); rb_dlinkDestroy(ptr, &temp_dlines[i]); } }}
static voidrehash_txlines(struct Client *source_p){ if(!IsOperRemoteBan(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "remoteban"); return; }
struct ConfItem *aconf; rb_dlink_node *ptr; rb_dlink_node *next_ptr;
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing temp xlines", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head) { aconf = ptr->data;
if(!aconf->hold || aconf->lifetime) continue;
free_conf(aconf); rb_dlinkDestroy(ptr, &xline_conf_list); }}
static voidrehash_tresvs(struct Client *source_p){ if(!IsOperRemoteBan(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "remoteban"); return; }
struct ConfItem *aconf; rb_radixtree_iteration_state iter; rb_dlink_node *ptr; rb_dlink_node *next_ptr;
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing temp resvs", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
RB_RADIXTREE_FOREACH(aconf, &iter, resv_tree) { if(!aconf->hold || aconf->lifetime) continue;
rb_radixtree_delete(resv_tree, aconf->host); free_conf(aconf); }
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head) { aconf = ptr->data;
if(!aconf->hold || aconf->lifetime) continue;
free_conf(aconf); rb_dlinkDestroy(ptr, &resv_conf_list); }}
static voidrehash_rejectcache(struct Client *source_p){ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing reject cache", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p; flush_reject();
}
static voidrehash_throttles(struct Client *source_p){ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing throttles", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p; flush_throttle();
}
static voidrehash_help(struct Client *source_p){ sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is forcing re-reading of HELP files", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p; load_help();}
static voidrehash_nickdelay(struct Client *source_p){ struct nd_entry *nd; rb_dlink_node *ptr; rb_dlink_node *safe_ptr;
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing the nick delay table", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p;
RB_DLINK_FOREACH_SAFE(ptr, safe_ptr, nd_list.head) { nd = ptr->data;
free_nd_entry(nd); }}
/* *INDENT-OFF* */static struct hash_commands rehash_commands[] ={ {"BANS", rehash_bans_loc }, {"DNS", rehash_dns }, {"SSLD", rehash_ssld }, {"MOTD", rehash_motd }, {"OMOTD", rehash_omotd }, {"TKLINES", rehash_tklines }, {"TDLINES", rehash_tdlines }, {"TXLINES", rehash_txlines }, {"TRESVS", rehash_tresvs }, {"REJECTCACHE", rehash_rejectcache }, {"THROTTLES", rehash_throttles }, {"HELP", rehash_help }, {"NICKDELAY", rehash_nickdelay }, {NULL, NULL }};/* *INDENT-ON* */
static voiddo_rehash(struct Client *source_p, const char *type){ if (type != NULL) { int x; char cmdbuf[100];
for (x = 0; rehash_commands[x].cmd != NULL && rehash_commands[x].handler != NULL; x++) { if(irccmp(type, rehash_commands[x].cmd) == 0) { sendto_one(source_p, form_str(RPL_REHASHING), me.name, source_p->name, rehash_commands[x].cmd); ilog(L_MAIN, "REHASH %s From %s[%s]", type, get_oper_name(source_p), source_p->sockhost); rehash_commands[x].handler(source_p); remote_rehash_oper_p = NULL; return; } }
/* We are still here..we didn't match */ cmdbuf[0] = '\0'; for (x = 0; rehash_commands[x].cmd != NULL && rehash_commands[x].handler != NULL; x++) { rb_strlcat(cmdbuf, " ", sizeof(cmdbuf)); rb_strlcat(cmdbuf, rehash_commands[x].cmd, sizeof(cmdbuf)); } sendto_one_notice(source_p, ":rehash one of:%s", cmdbuf); } else { sendto_one(source_p, form_str(RPL_REHASHING), me.name, source_p->name, ConfigFileEntry.configfile); sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is rehashing server config file", get_oper_name(source_p)); if (!MyConnect(source_p)) remote_rehash_oper_p = source_p; ilog(L_MAIN, "REHASH From %s[%s]", get_oper_name(source_p), source_p->sockhost); rehash(false); remote_rehash_oper_p = NULL; }}
/* * mo_rehash - REHASH message handler * * parv[1] = rehash type or destination * parv[2] = destination */static voidmo_rehash(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]){ const char *type = NULL, *target_server = NULL;
if(!IsOperRehash(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "rehash"); return; }
if (parc > 2) type = parv[1], target_server = parv[2]; else if (parc > 1 && (strchr(parv[1], '.') || strchr(parv[1], '?') || strchr(parv[1], '*'))) type = NULL, target_server = parv[1]; else if (parc > 1) type = parv[1], target_server = NULL; else type = NULL, target_server = NULL;
if (target_server != NULL) { sendto_match_servs(source_p, target_server, CAP_ENCAP, NOCAPS, "ENCAP %s REHASH %s", target_server, type != NULL ? type : ""); if (match(target_server, me.name) == 0) return; }
do_rehash(source_p, type);}
static voidme_rehash(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]){
if (!IsPerson(source_p)) return;
do_rehash(source_p, parc > 1 ? parv[1] : NULL);}