ds2.4.1/bin/
ds2.4.1/extra/creremote/
ds2.4.1/extra/wolfpaw/
ds2.4.1/lib/cmds/admins/
ds2.4.1/lib/cmds/common/
ds2.4.1/lib/cmds/creators/include/
ds2.4.1/lib/cmds/creators/include/SCCS/
ds2.4.1/lib/daemon/services/
ds2.4.1/lib/doc/
ds2.4.1/lib/doc/efun/all/
ds2.4.1/lib/doc/efun/arrays/
ds2.4.1/lib/doc/efun/buffers/
ds2.4.1/lib/doc/efun/compile/
ds2.4.1/lib/doc/efun/floats/
ds2.4.1/lib/doc/efun/functions/
ds2.4.1/lib/doc/efun/general/
ds2.4.1/lib/doc/efun/mixed/
ds2.4.1/lib/doc/efun/numbers/
ds2.4.1/lib/doc/efun/parsing/
ds2.4.1/lib/doc/faq/
ds2.4.1/lib/doc/hbook/
ds2.4.1/lib/doc/help/classes/
ds2.4.1/lib/doc/help/races/
ds2.4.1/lib/doc/lfun/
ds2.4.1/lib/doc/lfun/all/
ds2.4.1/lib/doc/lfun/lib/abilities/
ds2.4.1/lib/doc/lfun/lib/armor/
ds2.4.1/lib/doc/lfun/lib/bot/
ds2.4.1/lib/doc/lfun/lib/clay/
ds2.4.1/lib/doc/lfun/lib/clean/
ds2.4.1/lib/doc/lfun/lib/client/
ds2.4.1/lib/doc/lfun/lib/combat/
ds2.4.1/lib/doc/lfun/lib/connect/
ds2.4.1/lib/doc/lfun/lib/corpse/
ds2.4.1/lib/doc/lfun/lib/creator/
ds2.4.1/lib/doc/lfun/lib/daemon/
ds2.4.1/lib/doc/lfun/lib/damage/
ds2.4.1/lib/doc/lfun/lib/deterioration/
ds2.4.1/lib/doc/lfun/lib/donate/
ds2.4.1/lib/doc/lfun/lib/door/
ds2.4.1/lib/doc/lfun/lib/equip/
ds2.4.1/lib/doc/lfun/lib/file/
ds2.4.1/lib/doc/lfun/lib/fish/
ds2.4.1/lib/doc/lfun/lib/flashlight/
ds2.4.1/lib/doc/lfun/lib/follow/
ds2.4.1/lib/doc/lfun/lib/ftp_client/
ds2.4.1/lib/doc/lfun/lib/ftp_data_connection/
ds2.4.1/lib/doc/lfun/lib/fuel/
ds2.4.1/lib/doc/lfun/lib/genetics/
ds2.4.1/lib/doc/lfun/lib/id/
ds2.4.1/lib/doc/lfun/lib/interactive/
ds2.4.1/lib/doc/lfun/lib/lamp/
ds2.4.1/lib/doc/lfun/lib/leader/
ds2.4.1/lib/doc/lfun/lib/light/
ds2.4.1/lib/doc/lfun/lib/limb/
ds2.4.1/lib/doc/lfun/lib/living/
ds2.4.1/lib/doc/lfun/lib/look/
ds2.4.1/lib/doc/lfun/lib/manipulate/
ds2.4.1/lib/doc/lfun/lib/meal/
ds2.4.1/lib/doc/lfun/lib/messages/
ds2.4.1/lib/doc/lfun/lib/npc/
ds2.4.1/lib/doc/lfun/lib/player/
ds2.4.1/lib/doc/lfun/lib/poison/
ds2.4.1/lib/doc/lfun/lib/position/
ds2.4.1/lib/doc/lfun/lib/potion/
ds2.4.1/lib/doc/lfun/lib/room/
ds2.4.1/lib/doc/lfun/lib/server/
ds2.4.1/lib/doc/lfun/lib/spell/
ds2.4.1/lib/doc/lfun/lib/torch/
ds2.4.1/lib/doc/lfun/lib/vendor/
ds2.4.1/lib/doc/lfun/lib/virt_sky/
ds2.4.1/lib/doc/lfun/lib/weapon/
ds2.4.1/lib/doc/lfun/lib/worn_storage/
ds2.4.1/lib/doc/lpc/basic/
ds2.4.1/lib/doc/lpc/concepts/
ds2.4.1/lib/doc/lpc/constructs/
ds2.4.1/lib/doc/lpc/etc/
ds2.4.1/lib/doc/lpc/intermediate/
ds2.4.1/lib/doc/lpc/types/
ds2.4.1/lib/doc/misc/
ds2.4.1/lib/doc/old/
ds2.4.1/lib/domains/Praxis/adm/
ds2.4.1/lib/domains/Praxis/attic/
ds2.4.1/lib/domains/Praxis/cemetery/mon/
ds2.4.1/lib/domains/Praxis/data/
ds2.4.1/lib/domains/Praxis/death/
ds2.4.1/lib/domains/Praxis/mountains/
ds2.4.1/lib/domains/Praxis/obj/armour/
ds2.4.1/lib/domains/Praxis/obj/magic/
ds2.4.1/lib/domains/Praxis/obj/weapon/
ds2.4.1/lib/domains/Praxis/orc_valley/
ds2.4.1/lib/domains/Ylsrim/
ds2.4.1/lib/domains/Ylsrim/adm/
ds2.4.1/lib/domains/Ylsrim/armor/
ds2.4.1/lib/domains/Ylsrim/broken/
ds2.4.1/lib/domains/Ylsrim/fish/
ds2.4.1/lib/domains/Ylsrim/meal/
ds2.4.1/lib/domains/Ylsrim/npc/
ds2.4.1/lib/domains/Ylsrim/obj/
ds2.4.1/lib/domains/Ylsrim/virtual/
ds2.4.1/lib/domains/Ylsrim/weapon/
ds2.4.1/lib/domains/campus/adm/
ds2.4.1/lib/domains/campus/etc/
ds2.4.1/lib/domains/campus/meals/
ds2.4.1/lib/domains/campus/npc/
ds2.4.1/lib/domains/campus/save/
ds2.4.1/lib/domains/campus/txt/ai/charles/
ds2.4.1/lib/domains/campus/txt/ai/charles/bak2/
ds2.4.1/lib/domains/campus/txt/ai/charles/bak2/bak1/
ds2.4.1/lib/domains/campus/txt/ai/charly/
ds2.4.1/lib/domains/campus/txt/ai/charly/bak/
ds2.4.1/lib/domains/campus/txt/jenny/
ds2.4.1/lib/domains/default/creator/
ds2.4.1/lib/domains/default/doors/
ds2.4.1/lib/domains/default/etc/
ds2.4.1/lib/domains/default/weap/
ds2.4.1/lib/domains/town/doors/
ds2.4.1/lib/domains/town/txt/shame/
ds2.4.1/lib/domains/town/virtual/
ds2.4.1/lib/lib/comp/
ds2.4.1/lib/lib/lvs/
ds2.4.1/lib/lib/user/
ds2.4.1/lib/lib/virtual/
ds2.4.1/lib/log/
ds2.4.1/lib/obj/book_source/
ds2.4.1/lib/obj/include/
ds2.4.1/lib/realms/template/
ds2.4.1/lib/realms/template/adm/
ds2.4.1/lib/realms/template/area/armor/
ds2.4.1/lib/realms/template/area/npc/
ds2.4.1/lib/realms/template/area/obj/
ds2.4.1/lib/realms/template/area/room/
ds2.4.1/lib/realms/template/area/weap/
ds2.4.1/lib/realms/template/bak/
ds2.4.1/lib/realms/template/cmds/
ds2.4.1/lib/save/kills/o/
ds2.4.1/lib/secure/cfg/
ds2.4.1/lib/secure/cfg/classes/
ds2.4.1/lib/secure/cmds/creators/include/
ds2.4.1/lib/secure/cmds/players/
ds2.4.1/lib/secure/cmds/players/include/
ds2.4.1/lib/secure/daemon/include/
ds2.4.1/lib/secure/lib/
ds2.4.1/lib/secure/lib/include/
ds2.4.1/lib/secure/lib/net/include/
ds2.4.1/lib/secure/lib/std/
ds2.4.1/lib/secure/modules/
ds2.4.1/lib/secure/npc/
ds2.4.1/lib/secure/obj/include/
ds2.4.1/lib/secure/room/
ds2.4.1/lib/secure/save/
ds2.4.1/lib/secure/save/boards/
ds2.4.1/lib/secure/save/players/g/
ds2.4.1/lib/secure/scripts/
ds2.4.1/lib/secure/tmp/
ds2.4.1/lib/secure/upgrades/files/
ds2.4.1/lib/secure/verbs/creators/
ds2.4.1/lib/shadows/
ds2.4.1/lib/spells/
ds2.4.1/lib/std/board/
ds2.4.1/lib/std/lib/
ds2.4.1/lib/tmp/
ds2.4.1/lib/verbs/admins/include/
ds2.4.1/lib/verbs/common/
ds2.4.1/lib/verbs/common/include/
ds2.4.1/lib/verbs/creators/include/
ds2.4.1/lib/verbs/players/include/SCCS/
ds2.4.1/lib/verbs/rooms/
ds2.4.1/lib/verbs/rooms/include/
ds2.4.1/lib/www/errors/
ds2.4.1/lib/www/images/
ds2.4.1/v22.2b14/
ds2.4.1/v22.2b14/ChangeLog.old/
ds2.4.1/v22.2b14/Win32/
ds2.4.1/v22.2b14/compat/
ds2.4.1/v22.2b14/compat/simuls/
ds2.4.1/v22.2b14/include/
ds2.4.1/v22.2b14/testsuite/
ds2.4.1/v22.2b14/testsuite/clone/
ds2.4.1/v22.2b14/testsuite/command/
ds2.4.1/v22.2b14/testsuite/data/
ds2.4.1/v22.2b14/testsuite/etc/
ds2.4.1/v22.2b14/testsuite/include/
ds2.4.1/v22.2b14/testsuite/inherit/
ds2.4.1/v22.2b14/testsuite/inherit/master/
ds2.4.1/v22.2b14/testsuite/log/
ds2.4.1/v22.2b14/testsuite/single/
ds2.4.1/v22.2b14/testsuite/single/tests/compiler/
ds2.4.1/v22.2b14/testsuite/single/tests/efuns/
ds2.4.1/v22.2b14/testsuite/single/tests/operators/
ds2.4.1/v22.2b14/testsuite/u/
ds2.4.1/v22.2b14/tmp/
ds2.4.1/win32/
#include <lib.h>
#include <dirs.h>
#include <cfg.h>
#include <daemons.h>
#include <network.h>

#define WGET_D "/secure/daemon/wget"
#define WEB_SOURCE "149.152.218.102"
//#define WEB_SOURCE "127.0.0.1"
#define WEB_SOURCE_NAME "dead-souls.net"
#define WEB_SOURCE_PORT 80

inherit LIB_DAEMON;

string array allnames = ({});
string array tmpnames;
string upgrade_prefix = "/code/upgrades/"+mudlib_version();
string upgrades_txt = "/secure/upgrades/txt";
string upgrades_files = "/secure/upgrades/files";
int i = 0;
int oob = 0;
object player = 0;

mixed cmd(string str) {
    string mud = "Dead Souls"; 
    string file;
    string orig_str = str;
    int foo, tmpint = 0;
    mapping NewFiles = ([]);
    object inet = find_object(INET_D);
    string *preload_file = explode(read_file(CFG_PRELOAD),"\n");
    mixed *socks = socket_status();

    foreach(mixed element in socks){
	if(element[1] == "DATA_XFER" && element[4] == WEB_SOURCE+"."+WEB_SOURCE_PORT &&
	  str != "cancel"){
	    player->eventPrint("A download is still in progress. Please wait until it is complete.");
	    return 1;
	}
    }

    if(!player && this_player()) player = this_player();
    allnames = ({});
    if(!player) return 0;

    if( !((int)master()->valid_apply(({ "SECURE" }))) )
	error("Illegal attempt to access liveupgrade: "+get_stack()+" "+identify(previous_object(-1)));

    if(!directory_exists("/secure/upgrades/bak")){
	mkdir("/secure/upgrades/bak");
    }

    i = sscanf(mudlib_version(),"2.3a%d",tmpint);
    if(i && tmpint < 12) oob = 1;
    else {
	if(!strsrch(str,"-o ")){
	    oob = 1;
	    str = replace_string(str,"-o ","");
	}
	else oob = 0;
    }

    i = 0;
    foo = sscanf(str,"%s %s",file, mud);
    if(!foo || foo < 2) file = str;
    if(str == "apply"){
	string *files = ({});
	player->eventPrint("I hope you backed up...\n");
	foreach(string element in get_dir(upgrades_files+"/")){
	    files += ({ upgrades_files+"/"+element });
	}
	foreach(string element in files){
	    string contents = "";
	    NewFiles[element] = replace_string(replace_string(element,"0^0","/"),
	      upgrades_files+"/","");
	    contents = read_file(element);
	    if(!contents) contents = "";
	    if(last(contents,1) != "\n") contents += "\n";
	    write_file(element, contents, 1);
	    load_object("/secure/cmds/creators/bk")->cmd(NewFiles[element]);
	    if(directory_exists(NewFiles[element])) rm(element);
	    else {
		string path = path_prefix(NewFiles[element]);
		if(!directory_exists(path)) mkdir(path);
		rename(element, NewFiles[element]);
	    }
	}
	if(member_array(INET_D,preload_file) == -1 && inet) inet->eventDestruct();
	reload(UPDATE_D);
	RELOAD_D->eventReload(this_object(), 2);
	reload(WGET_D);
	rm("/secure/upgrades/txt/list.txt");
	player->eventPrint("\nDone. It is now a very good time to reboot the mud.");
	player = 0;
	return 1;
    }
    if(str == "cancel"){
	string *files = ({});
	foreach(string element in get_dir(upgrades_files+"/")){
	    files += ({ upgrades_files+"/"+element });
	}
	foreach(string element in files){
	    rm(element);
	}
	rm("/secure/upgrades/txt/list.txt");
	player->eventPrint("Cancelled.");
	player = 0;
	RELOAD_D->eventReload(this_object(), 2);
	reload(WGET_D);
	return 1;
    }
    if(oob){
	if(!inet){
	    inet = load_object(INET_D);
	    player->eventPrint("Starting INET_D.");
	    if(member_array(INET_D,preload_file) == -1)
		player->eventPrint("When you complete the upgrade by using the \"apply\" keyword, the "
		  "inet daemon will be shut down, since you do not have it enabled by "
		  "default. Please remember to either apply the upgrades when the downloading "
		  "is complete, or manually shut down INET_D with the command: mudconfig inet stop\n");
	}
	if(!inet){
	    player->eventPrint("There is a problem with INET_D. The upgrade will not proceed.");
	    return 1;
	}

	if(!INET_D->GetService("oob")){
	    player->eventPrint("The OOB service is not enabled. Enabling it now.");
	    INET_D->AddService("oob",OFFSET_OOB,LIB_OOB,0);
	}

	if(!INET_D->GetService("oob")){
	    player->eventPrint("There was a problem enabling the OOB service. The upgrade will not proceed.");
	    return 1;
	}

	if(!INET_D->GetServer("oob")){
	    player->eventPrint("The OOB service is not started. Starting it now.");
	    INET_D->eventStartServer("oob");
	}

	if(!INET_D->GetServer("oob")){
	    player->eventPrint("There was a problem starting the OOB service. The upgrade will not proceed.");
	    return 1;
	}

	if(foo < 2) {
	    mud = LIVEUPGRADE_SERVER;
	    file = str;
	}
	if(!file){
	    return this_object()->GetHelp();
	}

	mud = INTERMUD_D->GetMudName(mud);
	if(!mud){
	    player->eventPrint("That liveupgrade server appears unavailable.");
	    return 1;
	}
    }
    if(file == "all"){
	string tmp = replace_string(upgrades_txt+"/upgrades.txt","/","0^0");
	if(player && this_player() && player != this_player()){
	    this_player()->eventPrint("This command is currently locked and in use by "+capitalize(player->GetKeyName())+".");
	    return 1;
	}
	else if(this_player()) player = this_player();
	else player = this_object();

	if(WGET_D->GetUpgrading()){
	    player->eventPrint("An upgrade in already occurring. Please wait for it to complete.");
	    return 1;
	}

	if(!file_exists(upgrades_txt+"/list.txt")){
	    player->eventPrint("Downloading updates table. Please wait...");
	    rename("/secure/upgrades/files","/secure/upgrades/bak/"+time());
	    mkdir("/secure/upgrades/files");
	    if(oob){
		OOB_D->GetFile(mud,upgrades_txt+"/upgrades.txt");
	    }
	    else {
		WGET_D->GetFile(WEB_SOURCE, upgrade_prefix+"/upgrades.txt",WEB_SOURCE_NAME,
		  "/secure/upgrades/txt/list.txt",WEB_SOURCE_PORT);
	    }
	    call_out( (: cmd :), 5, orig_str);
	    return 1;
	}

	tmpnames = explode(read_file(upgrades_txt+"/list.txt"),"\n");
	foreach(string element in tmpnames){
	    if(!oob) allnames += ({ "/code/upgrades/"+mudlib_version()+element });
	    else allnames += ({ element });
	}

	if(oob){
	    OOB_D->eventMajorUpgrade(mud, allnames);
	}
	else {
	    WGET_D->eventMajorUpgrade(WEB_SOURCE, allnames,WEB_SOURCE_NAME);
	}
	rm(upgrades_txt+"/list.txt");
	player->eventPrint("Full upgrade begun.");
	player->eventPrint("Please wait until you receive a completion message,  "+
	  "then issue the command: liveupgrade apply\n\n");
	player->eventPrint("%^FLASH%^RED%^WARNING! %^BLACK%^WARNING! %^YELLOW%^WARNING! %^RESET%^WARNING!");
	player->eventPrint("You must *always* do a full backup before applying the liveupgrade. "+
	  "If the liveupgrade screwed up, and you get garbage files because of connection "+
	  "problems, it may be necessary for you to restore from backup to be able to "+
	  "start the mud again. You've been warned.");
	return 1;
    }
    if(oob){
	OOB_D->GetFile(mud,file);
	player->eventPrint("Requesting the file \""+file+"\" from "+INTERMUD_D->GetMudName(mud)+".");
    }
    else {
	player->eventPrint("Requesting the file \""+file+"\" from "+WEB_SOURCE);
	WGET_D->GetFile(WEB_SOURCE, upgrade_prefix+file);
    }
    return 1;
}

void eventReceiveReport(string str){
    if(player) player->eventPrint(str);
}

string GetHelp() {
    return ("Syntax: liveupgrade [-o] all\n"
      "        liveupgrade apply\n"
      "        liveupgrade cancel\n"
      "To use oob updates (not recommended), use the -o flag. The default "
      "is currently an http connection to dead-souls.net, which is vastly "
      "faster and more secure than oob.\n"
      "To upgrade all files to the next appropriate level for your lib version:\n"
      "liveupgrade all\n"
      "Wait until you receive the completion message before finalizing the upgrade. "
      "You can finalize the upgrade by typing:\n"
      "liveupgrade apply\n"
      "This will delete your old copies of files and copy the newly downloaded "
      "ones in their place.\n"
      "NEVER EVER do a liveupgrade without a full backup first."
      "");
}