psyBNC hacks
Alle Dateien sind im "src" Ordner zu finden, die Zeilen angaben entsprechen der Version 2.3.2-4 Beta. Danach muss lediglich psyBNC mittels "make" neu kompiliert werden.
psyBNC chmod hack
Wenn sie kein Risiko eingehen wollen, und das Webinterface ohne sudo/suphp betreiben wollen und Apache als einen anderen user als psyBNC laufen lassen wollen, müssen folgende Funktionen angepasst werden.
p_inifunc.c - Zeile 81:
int flushconfig()
{
FILE *handle;
[COLOR="Sienna"]char chmod[40];[/COLOR]
struct stringarray *wconf;
pcontext;
oldfile(configfile);
handle=fopen(configfile,"w");
wconf=conf;
while(wconf)
{
if(wconf->entry!=NULL) {
if(strlen(wconf->entry)>1)
fprintf(handle,"%s\n",wconf->entry);
}
wconf=wconf->next;
}
fclose(handle);
[COLOR="Sienna"]strcpy(chmod, "chmod 644 ");
strcat(chmod, configfile);
system(chmod);[/COLOR]
return 0x0;
}
p_log.c - Zeile 30:
/* write to log */
int __log (char *what, int usern,int level) {
char tx [20];
[COLOR="Sienna"]char chmod[40];[/COLOR]
time_t tm;
time ( &tm );
strmncpy(tx,ctime( &tm ),sizeof(tx));
[COLOR="Sienna"]strcpy(chmod, "chmod 644 ");
strcat(chmod, logfile);
system(chmod);[/COLOR]
#ifndef NOLOG
if(mainlog==NULL)
mainlog = fopen(logfile,"a");
if(level>=LOGLEVEL && mainlog!=NULL)
{
fprintf(mainlog,lngtxt(563),tx,what);
fflush(mainlog);
}
if(usern==-1)
noticeall(RI_ADMIN,lngtxt(564),tx,what);
else
systemnotice(usern,lngtxt(565),tx,what);
#endif
return 0x0;
}
p_log.c - Zeile 95:
/* write to privatelog */
int privatelog ( int usern ) {
char tx [20];
char fname[40];
[COLOR="Sienna"]char chmod[40];[/COLOR]
char noact='\x01';
int uid;
FILE *log;
time_t tm;
pcontext;
#ifdef NOLOG
return 0x0;
#endif
if(strchr(irccontent,noact)!=NULL) return 0x0; /* dont log actions, ctcps */
if(strchr(ircfrom,'@')==NULL) return 0x0; /* dont log servermsgs/notices */
uid=usern;
if (user(uid)->parent !=0) uid=user(usern)->parent;
if (strlen(ircnick) == strlen(user(usern)->nick)) {
if (strstr(ircnick,user(usern)->nick)) return -1;
}
time ( &tm );
ap_snprintf(fname,sizeof(fname),lngtxt(573),uid);
strmncpy(tx, ctime( &tm ), sizeof(tx));
log = fopen(fname,"a");
if(log!=NULL)
{
fprintf(log,lngtxt(574),user(usern)->network,tx,ircfrom,irccontent);
fclose(log);
}
[COLOR="Sienna"]strcpy(chmod, "chmod 644 ");
strcat(chmod, fname);
system(chmod);[/COLOR]
return 0x0;
}
psyBNC Konfiguration öfter aktualisieren
psyBNC schreibt nicht bei jedem Befehl die Konfiguration neu, so werden z.B. Nick Changes nicht direkt in die Konfiguration übernommen und im Webinterface wird der alte nick angezeigt, in der aktuellen Version geht es nur um das Nick Update, aber in kommenden Versionen wird das ändern der Sources wohl notwendig sein, um Features wie autoop/ban/ignor/op/askop/dcc per Webinterface zu verwalten, alle diese Features werden nicht direkt in die Konfiguration geschrieben und lassen sich so nicht in realtime für das Webinterface verwenden. Die Konfiguration kann man mittels der Funktion flushconfig(); neu schreiben lassen, hier sind die notwendigen Änderungen:
p_client.c - Zeile 2269 (Konfigurationsupdate beim trennen der Verbindung zum BNC):
int cmdquit(int usern)
{
pcontext;
if (user(usern)->parent !=0) usern=user(usern)->parent;
log(LOG_INFO,-1,lngtxt(269),user(usern)->login,currentsocket->sock->source);
if(getpsocketbygroup(socketnode,currentsocket->sock->sockgroup,currentsocket->sock->syssock))
{
killsocket(currentsocket->sock->syssock);
} else {
ssnprintf(user(usern)->insock,lngtxt(270),user(usern)->nick,user(usern)->login,user(usern)->host);
quitclient(usern);
}
[COLOR="Sienna"]flushconfig();[/COLOR]
return -1;
}
p_client.c - Zeile 1753 (Konfigurationsupdate beim löschen eines AutoOp Eintrages):
/* remove autoop entry */
int cmddelautoop(int usern) {
char cfile[40];
int userp;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(208),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(209),usern);
user(usern)->aops=eraselist(atoi(irccontent),cfile,user(usern)->aops);
ssnprintf(user(usern)->insock,lngtxt(210),user(userp)->nick,irccontent);
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1737 (Konfigurationsupdate beim löschen eines Op Eintrages):
/* remove op entry */
int cmddelop(int usern) {
char cfile[40];
int userp;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(205),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(206),usern);
user(usern)->ops=eraselist(atoi(irccontent),cfile,user(usern)->ops);
ssnprintf(user(usern)->insock,lngtxt(207),user(userp)->nick,irccontent);
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1544 (Konfigurationsupdate beim hinzufügen eines Ignor Eintrages):
/* add an ignore */
int cmdaddignore(int usern) {
char cfile[40];
char *pt;
int userp;
pcontext;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(1332),user(userp)->nick);
return 0x0;
}
if (strlen(ircto) == 0) {
ssnprintf(user(usern)->insock,lngtxt(1333),user(userp)->nick);
return 0x0;
}
if (strchr(irccontent,';')) {
ssnprintf(user(usern)->insock,lngtxt(1334),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(1335),usern);
user(usern)->ignores=writelist(irccontent,ircto,cfile,user(usern)->ignores);
ssnprintf(user(usern)->insock,lngtxt(1336),user(userp)->nick,irccontent,ircto);
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1518 (Konfigurationsupdate beim hinzufügen eines Ban Eintrages):
/* add a ban */
int cmdaddban(int usern) {
char cfile[40];
char *pt;
int userp;
pcontext;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(180),user(userp)->nick);
return 0x0;
}
if (strlen(ircto) == 0) {
ssnprintf(user(usern)->insock,lngtxt(181),user(userp)->nick);
return 0x0;
}
if (strchr(irccontent,';')) {
ssnprintf(user(usern)->insock,lngtxt(182),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(183),usern);
user(usern)->bans=writelist(irccontent,ircto,cfile,user(usern)->bans);
ssnprintf(user(usern)->insock,lngtxt(184),user(userp)->nick,irccontent,ircto);
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1470 (Konfigurationsupdate beim hinzufügen eines AskOp Eintrages):
/* add an askop */
int cmdaddask(int usern) {
char cfile[40];
char *pt;
int userp;
pcontext;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(171),user(userp)->nick);
return 0x0;
}
if (strlen(ircto) == 0) {
ssnprintf(user(usern)->insock,lngtxt(172),user(userp)->nick);
return 0x0;
}
if (strchr(irccontent,';')) {
ssnprintf(user(usern)->insock,lngtxt(173),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(174),usern);
user(usern)->askops=writelist(irccontent,cryptit(ircto),cfile,user(usern)->askops);
ssnprintf(user(usern)->insock,lngtxt(175),user(userp)->nick,irccontent,ircto);
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1444 (Konfigurationsupdate beim hinzufügen eines AutoOp Eintrages):
/* add an autoop */
int cmdaddautoop(int usern) {
char cfile[40];
char *pt;
int userp;
pcontext;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(166),user(userp)->nick);
return 0x0;
}
if (strlen(ircto) == 0) {
ssnprintf(user(usern)->insock,lngtxt(167),user(userp)->nick);
return 0x0;
}
if (strchr(irccontent,';')) {
ssnprintf(user(usern)->insock,lngtxt(168),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(169),usern);
user(usern)->aops=writelist(irccontent,cryptit(ircto),cfile,user(usern)->aops);
ssnprintf(user(usern)->insock,lngtxt(170),user(userp)->nick,irccontent,ircto);
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1418 (Konfigurationsupdate beim hinzufügen eines Op Eintrages):
/* add an op */
int cmdaddop(int usern) {
char cfile[40];
char *pt;
int userp;
pcontext;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(161),user(userp)->nick);
return 0x0;
}
if (strlen(ircto) == 0) {
ssnprintf(user(usern)->insock,lngtxt(162),user(userp)->nick);
return 0x0;
}
if (strchr(irccontent,';')) {
ssnprintf(user(usern)->insock,lngtxt(163),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(164),usern);
user(usern)->ops=writelist(irccontent,cryptit(ircto),cfile,user(usern)->ops);
ssnprintf(user(usern)->insock,lngtxt(165),user(userp)->nick,irccontent,ircto);
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1769 (Konfigurationsupdate beim löschen eines AskOp Eintrages):
/* delete askop */
int cmddelask(int usern) {
char cfile[40];
pcontext;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(211),user(usern)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(212),usern);
user(usern)->askops=eraselist(atoi(irccontent),cfile,user(usern)->askops);
ssnprintf(user(usern)->insock,lngtxt(213),user(usern)->nick,irccontent);
return 0x0;
}
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1799 (Konfigurationsupdate beim löschen eines Ban Eintrages):
/* delete a ban */
int cmddelban(int usern) {
char cfile[40];
int userp;
pcontext;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(217),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(218),usern);
pcontext;
user(usern)->bans=eraselist(atoi(irccontent),cfile,user(usern)->bans);
pcontext;
ssnprintf(user(usern)->insock,lngtxt(219),user(userp)->nick,irccontent);
pcontext;
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_client.c - Zeile 1819 (Konfigurationsupdate beim löschen eines Ignor Eintrages):
/* delete an ignore */
int cmddelignore(int usern) {
char cfile[40];
int userp;
pcontext;
if (user(usern)->parent!=0) userp=user(usern)->parent; else userp=usern;
if (strlen(irccontent) == 0) {
ssnprintf(user(usern)->insock,lngtxt(1337),user(userp)->nick);
return 0x0;
}
ap_snprintf(cfile,sizeof(cfile),lngtxt(1338),usern);
pcontext;
user(usern)->ignores=eraselist(atoi(irccontent),cfile,user(usern)->ignores);
pcontext;
ssnprintf(user(usern)->insock,lngtxt(1339),user(userp)->nick,irccontent);
pcontext;
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
p_server.c - Zeile 199 (Konfigurationsupdate beim Nick Change neu schreiben):
int gotnick(int usern)
{
char sic[4096];
pcontext;
if(strmcmp(ircnick,user(usern)->nick))
{
strmncpy(user(usern)->nick,ircto,sizeof(user(usern)->nick));
ap_snprintf(sic,sizeof(sic),lngtxt(734),usern);
writeini("USER","NICK",sic,ircto);
#ifdef INTNET
if(user(usern)->parent==0)
{
strmncpy(irccontent,ircto,sizeof(irccontent));
strmncpy(sic,ircbuf,sizeof(sic));
cmdintnick(usern,0);
strmncpy(ircbuf,sic,sizeof(ircbuf));
}
#endif
}
nickchange(usern,ircnick,ircto);
[COLOR="Sienna"]flushconfig();[/COLOR]
return 0x0;
}
psyBNC Scripts beschleunigen
Ein anderer kleiner "hack" um die Scripts zu beschleunigen aktiviert man indem man einfach in der "p_script.c" Zeile 189 das "sleep(1);" mittels // auskommentiert, bzw. löscht bei mir ist es noch zu keinen Komplikationen dadurch gekommen.
Wenn man von psyBNC Fehler wie z.B. "Maximale Anzahl der Sub-Tasks erreicht beim Versuch..." bekommt, dann sollte man in der "p_script.c" Zeile 37 den Eintrag "#define MAXFORKS 50" von 50 auf eine höhere Anzahl ändern. Ich persönlich habe MAXFORKS auf 500 stehen, und kann mich nicht beklagen.
Da liegt das Problem!Permission denied in /var/www/web1/html/psybnc/index.php on line 387
We use essential cookies to make this site work, and optional cookies to enhance your experience.