#include <wizlevels.h>#include <daemon.h>#include <events.h>#include <strings.h>#include <files.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | FTPSAVE "/secure/ARCH/ftpd" |
| #define | MAXLOGSIZE 2000000 |
| #define | SMALLLOGSIZE 200000 |
| #define | LOGTIME 120 |
| #define | MAXBUFFSIZE 1000 |
| #define | DEBUG(x) |
| #define | D_LOGTIME 0 |
| #define | D_FLAGS 1 |
| #define | D_ERSTIE 2 |
| #define | D_IPSTRING 3 |
| #define | D_INDEX 4 |
| #define | D_LOG 5 |
| #define | DL_TIME 0 |
| #define | DL_CMD 1 |
| #define | DL_ENV 2 |
| #define | FL_PERMANENT 1 |
| #define | FL_SYNC 2 |
| #define | P_SECOND "second" |
Funktionen | |
| public int | query_bb () |
| public void | writebb (string msg) |
| public void | BBWrite (string msg) |
| public int | add (string user, int timeout) |
| public int | sub (string user) |
| public void | ftpbb (string user, string msg) |
| private void | scan_bb_opfer () |
| private void | DumpData (string uid, string erstie, string ip, int flags, mixed logdata) |
| private void | ProcessBuffer (string uid) |
| private void | RemoveTemporaryPlayer (string uid) |
| public void | create () |
| public void | Eventhandler (string eid, object trigob, mixed data) |
| public int | ProcessAllBuffers () |
| private void | AddTemporaryPlayer (string uid) |
| public varargs void | BBWrite (string msg, int catmode) |
| public varargs int | remove (int silent) |
| private int | player_exists (string user) |
Variablen | |
| private mapping | monitored |
| private nosave mapping | ldata = m_allocate(0,D_LOG) |
| #define D_ERSTIE 2 |
Definiert in Zeile 32 der Datei bbmaster.c.
| #define D_FLAGS 1 |
Definiert in Zeile 31 der Datei bbmaster.c.
Wird benutzt von ftpbb(), NewDoor(), oeffnen(), reset_doors() und schliessen().
| #define D_INDEX 4 |
Definiert in Zeile 34 der Datei bbmaster.c.
Wird benutzt von ProcessAllBuffers() und ProcessBuffer().
| #define D_IPSTRING 3 |
Definiert in Zeile 33 der Datei bbmaster.c.
| #define D_LOG 5 |
Definiert in Zeile 35 der Datei bbmaster.c.
Wird benutzt von ProcessAllBuffers().
| #define D_LOGTIME 0 |
Definiert in Zeile 30 der Datei bbmaster.c.
Wird benutzt von ProcessBuffer().
| #define DEBUG | ( | x | ) |
if (find_player("zesstra"))\ tell_object(find_player("zesstra"),\ "EDBG: "+x+"\n")
Definiert in Zeile 22 der Datei bbmaster.c.
| #define DL_CMD 1 |
Definiert in Zeile 40 der Datei bbmaster.c.
| #define DL_ENV 2 |
Definiert in Zeile 41 der Datei bbmaster.c.
| #define DL_TIME 0 |
Definiert in Zeile 39 der Datei bbmaster.c.
| #define FL_PERMANENT 1 |
Definiert in Zeile 45 der Datei bbmaster.c.
Wird benutzt von ftpbb().
| #define FL_SYNC 2 |
Definiert in Zeile 46 der Datei bbmaster.c.
| #define FTPSAVE "/secure/ARCH/ftpd" |
Definiert in Zeile 15 der Datei bbmaster.c.
| #define LOGTIME 120 |
Definiert in Zeile 19 der Datei bbmaster.c.
| #define MAXBUFFSIZE 1000 |
Definiert in Zeile 20 der Datei bbmaster.c.
| #define MAXLOGSIZE 2000000 |
Definiert in Zeile 17 der Datei bbmaster.c.
| #define P_SECOND "second" |
Definiert in Zeile 49 der Datei bbmaster.c.
Wird benutzt von AddSin(), CheckSecond(), create(), create_wizard(), delete_player(), finger_single(), is_mage_second(), is_second(), QueryView(), scan_obj(), stat(), waehle() und waehle_2().
| #define SMALLLOGSIZE 200000 |
Definiert in Zeile 18 der Datei bbmaster.c.
| public int add | ( | string | user, | |
| int | timeout | |||
| ) |
Definiert in Zeile 347 der Datei bbmaster.c.
Benutzt ARCH_SECURITY, FTPSAVE, monitored, player_exists(), process_call() und save_object().
00348 { 00349 if ( !ARCH_SECURITY || process_call() ) 00350 return -1; 00351 00352 if( !stringp(user) || !player_exists(lower_case(user)) || !intp(timeout) || 00353 !timeout ) 00354 return -2; 00355 00356 monitored[lower_case(user)] = timeout; 00357 save_object( FTPSAVE ); 00358 00359 return 1; 00360 }

| private void AddTemporaryPlayer | ( | string | uid | ) |
Definiert in Zeile 156 der Datei bbmaster.c.
00156 { 00157 // natuerlich nur, wenn noch nix eingetragen. 00158 if (!member(ldata, uid)) { 00159 object ob = find_player(uid) || find_netdead(uid); 00160 00161 mixed erstie; 00162 if (ob) 00163 erstie = (string)ob->QueryProp(P_SECOND); 00164 00165 ldata += ([uid: time() + LOGTIME + random(LOGTIME/2); 00166 0; 00167 (stringp(erstie) ? erstie : 0); 00168 query_ip_number(ob); 00169 0; ({}) 00170 ]); 00171 } 00172 }
| public varargs void BBWrite | ( | string | msg, | |
| int | catmode | |||
| ) |
Definiert in Zeile 200 der Datei bbmaster.c.
00200 { 00201 00202 if ( !this_interactive() || 00203 (extern_call() && 00204 strstr(load_name(previous_object()), "/std/shells/") != 0 ) ) 00205 return; 00206 00207 string uid = getuid(this_interactive()); 00208 00209 if (!member(ldata, uid)) 00210 AddTemporaryPlayer(uid); 00211 else if (ldata[uid,D_LOGTIME] < time()) { 00212 // Logzeit abgelaufen. -> ENDE. 00213 if (ldata[uid,D_INDEX]) { 00214 this_interactive()->__set_bb(0); 00215 // es kann vorkommen, dass hier nen ProcessBuffer mit anderer uid 00216 // drinhaengt. Ist aber egal, dann wird der Puffer halt naechstesmal 00217 // geschrieben. 00218 if (find_call_out(#'ProcessBuffer) == -1) 00219 call_out(#'ProcessBuffer, 2, uid); 00220 } 00221 return; 00222 } 00223 00224 // im synchronen Modus direkt auf Platte schreiben. 00225 //DEBUG("BBWrite: Flags von +"+uid+": "+to_string(ldata[uid,D_FLAGS]) 00226 // +"\n"); 00227 if (ldata[uid,D_FLAGS] & FL_SYNC) { 00228 //DEBUG("BBWrite: Syncmodus\n"); 00229 if (!catmode) { 00230 msg = sprintf("%s: %s [%O]\n", strftime("%y%m%d-%H%M%S"), 00231 msg, environment(this_interactive())); 00232 } 00233 else 00234 msg = msg + "\n"; 00235 log_file( "ARCH/bb."+uid, msg, MAXLOGSIZE ); 00236 return; 00237 } 00238 00239 // alle anderen werden erstmal gepuffert. 00240 00241 // wenn catmode und nen Index > 0 wird der Kram an den vorherigen Eintragen 00242 // angehaengt. 00243 int index = ldata[uid,D_INDEX]; 00244 if (catmode && index > 0) { 00245 --index; 00246 ldata[uid,D_LOG][index][DL_CMD] += msg; 00247 } 00248 else { 00249 // Puffer vergroessern? 00250 if (index >= sizeof(ldata[uid,D_LOG])) 00251 ldata[uid,D_LOG]+=allocate(100); 00252 ldata[uid,D_LOG][index] = ({ time(), msg, 00253 object_name(environment(this_interactive())) 00254 }); 00255 ldata[uid,D_INDEX]++; 00256 // es kann vorkommen, dass hier nen ProcessBuffer mit anderer uid 00257 // drinhaengt. Ist aber egal, dann wird der Puffer halt naechstesmal 00258 // geschrieben. 00259 if (index > MAXBUFFSIZE 00260 && find_call_out(#'ProcessBuffer) == -1) 00261 call_out(#'ProcessBuffer, 2, uid); 00262 } 00263 }
| public void BBWrite | ( | string | msg | ) |
| public void create | ( | ) |
Definiert in Zeile 64 der Datei bbmaster.c.
Benutzt EVENTD, EVT_LIB_LOGIN, EVT_LIB_LOGOUT, FTPSAVE, log_file, restore_object(), scan_bb_opfer() und strftime().
00065 { 00066 seteuid( getuid(this_object()) ); 00067 restore_object( FTPSAVE ); 00068 scan_bb_opfer(); 00069 EVENTD->RegisterEvent(EVT_LIB_LOGIN, "Eventhandler", this_object()); 00070 EVENTD->RegisterEvent(EVT_LIB_LOGOUT, "Eventhandler", this_object()); 00071 log_file("ARCH/bbmaster.log", strftime("%c: bbmaster wurde geladen.\n")); 00072 }

| private void DumpData | ( | string | uid, | |
| string | erstie, | |||
| string | ip, | |||
| int | flags, | |||
| mixed | logdata | |||
| ) |
Definiert in Zeile 137 der Datei bbmaster.c.
Wird benutzt von ProcessAllBuffers().
00137 { 00138 string res = sprintf("\n%s%s, IP: %s\n", capitalize(uid), 00139 (stringp(erstie) ? " ("+capitalize(erstie)+")" : ""), 00140 (stringp(ip) ? ip : "Unbekannt")); 00141 logdata-=({0}); 00142 foreach(mixed arr : logdata) { 00143 res+=sprintf("%O: %O [%s]\n", 00144 strftime("%y%m%d-%H%M%S",arr[DL_TIME]), 00145 arr[DL_CMD], arr[DL_ENV]); 00146 } 00147 00148 //DEBUG("DumpData: "+res); 00149 if (flags & FL_PERMANENT) 00150 catch(log_file("ARCH/bb."+uid, res, MAXLOGSIZE)); 00151 else if (file_size(LIBLOGDIR"/ARCH/bbmaster") == FSIZE_DIR) 00152 catch(log_file("ARCH/bbmaster/"+uid, res, SMALLLOGSIZE)); 00153 // kein else, in anderen Faellen werden die Daten verworfen. 00154 }

| public void Eventhandler | ( | string | eid, | |
| object | trigob, | |||
| mixed | data | |||
| ) |
Definiert in Zeile 77 der Datei bbmaster.c.
Benutzt E_PLNAME, EVENTD, EVT_LIB_LOGOUT, ldata, ProcessBuffer() und RemoveTemporaryPlayer().
00077 { 00078 if (previous_object() == find_object(EVENTD)) { 00079 string uid; 00080 if (objectp(trigob) 00081 && strstr(load_name(trigob),"/std/shells/") == 0 00082 && !trigob->QueryGuest()) { 00083 // Bei Login und Logout den BBMode einschalten (weil der Loginevent ja 00084 // erst 1-2s nach Einloggen abgearbeitet wird. 00085 trigob->__set_bb(1); 00086 uid=getuid(trigob); 00087 } 00088 else { 00089 // kein Objekt mehr da. Vermutlich hat ein Spieler 'ende' gemacht, aber 00090 // es koennte auch sein, dass jemand mit nem Selbstzerstoerer den Event 00091 // gefakt hat. Aber selbst wenn, viel kann man damit nicht erreichen. 00092 uid = data[E_PLNAME]; 00093 if (!stringp(uid)) return; 00094 // Pruefung auf nicht-Anwesenheit von uid waere noch moeglich, hat aber 00095 // Probleme, wenn ein Spieler sehr schnell wieder einloggt. 00096 } 00097 00098 if (eid == EVT_LIB_LOGOUT && member(ldata,uid)) { 00099 // Wenn Logout und es gibt Daten im Puffer, koennte man die evtl. 00100 // wegschreiben oder loeschen. 00101 ProcessBuffer(uid); 00102 // auf jeden Fall temporaere Spieler entfernen. (Wichtig!) 00103 RemoveTemporaryPlayer(uid); 00104 } 00105 } 00106 }

| public void ftpbb | ( | string | user, | |
| string | msg | |||
| ) |
Definiert in Zeile 378 der Datei bbmaster.c.
Benutzt CHMASTER, D_FLAGS, FL_PERMANENT, ldata, log_file, monitored, ROOTID und sub().
00379 { 00380 if( getuid(previous_object()) != ROOTID ) 00381 return; 00382 00383 if ( ldata[user,D_FLAGS] & FL_PERMANENT ) 00384 log_file( "ARCH/bb."+user, msg, 2000000 ); 00385 00386 if ( monitored[user] ){ 00387 if ( monitored[user] > 0 && monitored[user] < time() ) 00388 sub( user ); 00389 else 00390 CHMASTER->send( "FTP", capitalize(user), msg ); 00391 } 00392 }

| private int player_exists | ( | string | user | ) |
Definiert in Zeile 339 der Datei bbmaster.c.
Wird benutzt von add() und sub().
00340 { 00341 if ( !stringp( user ) || strlen( user ) < 2 ) 00342 return 0; 00343 00344 return file_size( "/save/" + user[0..0] + "/" + user + ".o" ) > 0; 00345 }

| public int ProcessAllBuffers | ( | ) |
Definiert in Zeile 109 der Datei bbmaster.c.
Benutzt ARCH_SECURITY, D_INDEX, D_LOG, data, DumpData(), flags und ldata.
00109 { 00110 00111 if (extern_call() && !ARCH_SECURITY) 00112 return -1; 00113 00114 foreach(string uid, int logtime, int flags, string erstie, string ip, 00115 int index, mixed data: ldata) { 00116 if (index) { 00117 DumpData(uid, erstie, ip, flags, data); 00118 ldata[uid,D_LOG]=({}); 00119 ldata[uid,D_INDEX]=0; 00120 } 00121 } 00122 return 1; 00123 }

| private void ProcessBuffer | ( | string | uid | ) |
Definiert in Zeile 125 der Datei bbmaster.c.
Benutzt call_out(), D_INDEX, D_LOGTIME und ldata.
Wird benutzt von Eventhandler().
00125 { 00126 00127 if (time() <= ldata[uid,D_LOGTIME] 00128 && ldata[uid,D_INDEX]) { 00129 // Daten wegschreiben, wenn Logzeit nicht abgelaufen. Sonst nicht. 00130 call_out(#'DumpData, 2, uid, ldata[uid,D_ERSTIE], ldata[uid,D_IPSTRING], 00131 ldata[uid,D_FLAGS], ldata[uid,D_LOG]); 00132 } 00133 ldata[uid,D_LOG] = ({}); 00134 ldata[uid,D_INDEX] = 0; 00135 }


| public int query_bb | ( | ) |
Definiert in Zeile 182 der Datei bbmaster.c.
00183 { 00184 00185 if (load_name(previous_object())[0..11] != "/std/shells/") 00186 return 0; 00187 00188 // in jedem Fall wird nun (temporaer) der BB-Modus aktiviert. 00189 if (!previous_object()->QueryGuest()) 00190 previous_object()->__set_bb(1); 00191 00192 // nur fuer 'permanente' auch 1 zurueckgeben. 00193 return ldata[getuid(previous_object()),D_FLAGS] & FL_PERMANENT; 00194 }
| public varargs int remove | ( | int | silent | ) |
Definiert in Zeile 321 der Datei bbmaster.c.
00321 { 00322 00323 if (!ARCH_SECURITY) 00324 return 0; 00325 00326 log_file("ARCH/bbmaster.log", strftime("%c: remove() called.\n")); 00327 00328 // alle Puffer leeren... 00329 // ProcessAllBuffers() wird hierbei _ohne_ Limits aufgerufen! Kann fieses 00330 // Lag erzeugen, aber sonst wurde der Kram evtl. nicht ordentlich 00331 // geschrieben. 00332 limited(#'ProcessAllBuffers); 00333 destruct(this_object()); 00334 return 1; 00335 }
| private void RemoveTemporaryPlayer | ( | string | uid | ) |
Definiert in Zeile 174 der Datei bbmaster.c.
Wird benutzt von Eventhandler().
00174 { 00175 if (!(ldata[uid,D_FLAGS] & FL_PERMANENT)) { 00176 efun::m_delete(ldata, uid); 00177 } 00178 }

| private void scan_bb_opfer | ( | ) |
Definiert in Zeile 293 der Datei bbmaster.c.
Wird benutzt von create().
00294 { 00295 string* lines; 00296 object pl; 00297 string uid; 00298 00299 // diese user werden 'permanent' ueberwacht, nicht nur direkt nach dem 00300 // Einloggen. 00301 lines = explode( lower_case( read_file("/secure/ARCH/BB_OPFER.dump") 00302 || "" ), "\n" )[2..]; 00303 00304 foreach(string line : lines) { 00305 if( strlen(line) && line[0] != '#' ) { 00306 uid=line[0 .. member(line,' ')-1]; 00307 AddTemporaryPlayer(uid); 00308 ldata[uid,D_LOGTIME] = __INT_MAX__; 00309 ldata[uid,D_FLAGS] = FL_PERMANENT|FL_SYNC; 00310 pl = find_player(uid) || find_netdead(uid); 00311 if (pl) 00312 pl->__set_bb(1); 00313 } 00314 } 00315 }

| public int sub | ( | string | user | ) |
Definiert in Zeile 363 der Datei bbmaster.c.
Benutzt ARCH_SECURITY, FTPSAVE, m_delete(), monitored, process_call() und save_object().
Wird benutzt von ftpbb() und msg().
00364 { 00365 if ( !ARCH_SECURITY || process_call() ) 00366 return -1; 00367 00368 if( !stringp(user) || !member( monitored, lower_case(user) ) ) 00369 return -2; 00370 00371 efun::m_delete( monitored, lower_case(user) ); 00372 save_object( FTPSAVE ); 00373 00374 return 1; 00375 }


| public void writebb | ( | string | msg | ) |
Definiert in Zeile 268 der Datei bbmaster.c.
00269 { 00270 int catmode; 00271 00272 if ( !this_interactive() || 00273 (extern_call() && 00274 strstr(load_name(previous_object()), "/std/shells/") != 0 ) ) 00275 return; 00276 00277 // erstmal String bereinigen. 00278 msg = trim(msg,TRIM_RIGHT,"\n"); 00279 if (strstr(msg,"->") == 0) { 00280 catmode=1; 00281 msg= " -> " + msg[2..]; 00282 } 00283 else { 00284 // faengt mit Datumsstring an, erstes Leerzeichen ab dem zehnten Zeichen 00285 // suchen und von dort abschneiden. 00286 msg = msg[strstr(msg," ",10)+1 ..]; 00287 } 00288 00289 // Dann weitergeben 00290 BBWrite(msg, catmode); 00291 }
| private nosave mapping ldata = m_allocate(0,D_LOG) |
Definiert in Zeile 42 der Datei bbmaster.c.
Wird benutzt von Eventhandler(), ftpbb(), print_mssp_response(), ProcessAllBuffers() und ProcessBuffer().
1.6.3