bbmaster.c-Dateireferenz

#include <wizlevels.h>
#include <daemon.h>
#include <events.h>
#include <strings.h>
#include <files.h>
Include-Abhängigkeitsdiagramm für bbmaster.c:

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)

Makro-Dokumentation

#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   ) 
Wert:
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.

Wird benutzt von add(), create() und sub().

#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"
#define SMALLLOGSIZE   200000

Definiert in Zeile 18 der Datei bbmaster.c.


Dokumentation der Funktionen

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

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 }


Variablen-Dokumentation

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().

private mapping monitored

Definiert in Zeile 27 der Datei bbmaster.c.

Wird benutzt von add(), create(), ftpbb(), list(), msg() und sub().

Erzeugt am Thu Jun 3 14:41:08 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3