コード例 #1
0
ファイル: local_package.cpp プロジェクト: SirAnthony/mpkg
int LocalPackage::fill_filelist(PACKAGE *package, bool)
{
	if (!package) package=&data;
	//mDebug("fill_filelist start");
	// Retrieving regular files
	// For setup mode, we can try to enable cached filelists
	vector<string> file_names;
	string fname;
	bool fname_temp = false;
	if (setupMode && FileExists(getAbsolutePath(getDirectory(filename))+"/.fcache/" + getFilename(filename) + "/flist")) {
		fname = getAbsolutePath(getDirectory(filename))+"/.fcache/" + getFilename(filename) + "/flist";
	}
	else {
		fname = get_tmp_file();
		fname_temp = true;
		system("tar tf "+filename+" --exclude install " +" > "+fname + " 2>/dev/null");
	}
	// Parsing file list
	file_names=ReadFileStrings(fname);
	if (fname_temp) unlink(fname.c_str());
	if (file_names.size()>2) file_names.erase(file_names.begin(), file_names.begin()+2);
	else {
		mWarning("Empty file list in package " + package->get_name());
		file_names.clear();
	}
	package->set_files(file_names);
	// Retrieving symlinks (from doinst.sh).
	string dt;
	bool dt_temp=false;
	// Extracting file to the temp dir
	if (setupMode && FileExists(getAbsolutePath(getDirectory(filename))+"/.fcache/" + getFilename(filename) + "/doinst.sh")) {
		dt = getAbsolutePath(getDirectory(filename))+"/.fcache/" + getFilename(filename) + "/doinst.sh";
	}
	else if (!setupMode || !FileExists(getAbsolutePath(getDirectory(filename))+"/.fcache/" + getFilename(filename) + "/flist")) { // Assuming that doinst.sh isn't present if flist is cached
		dt = get_tmp_file();
		extractFromTgz(filename, "install/doinst.sh", dt);
		dt_temp = true;
	}

	
	if (!dt.empty() && FileExists(dt)) {
		string lnfname=get_tmp_file();
		string sed_cmd = "sed -n 's,^( *cd \\([^ ;][^ ;]*\\) *; *rm -rf \\([^ )][^ )]*\\) *) *$,\\1/\\2,p' < ";
		sed_cmd += dt + " > " + lnfname;
		system(sed_cmd);
		vector<string>link_names=ReadFileStrings(lnfname);
		for (size_t i=0; i<link_names.size(); ++i) {
			if (!link_names[i].empty()) package->get_files_ptr()->push_back(link_names[i]);
		}
		if (dt_temp) unlink(dt.c_str());
		unlink(lnfname.c_str());
	}

	delete_tmp_files();
	return 0;
}
コード例 #2
0
ファイル: nvidia_drivers.cpp プロジェクト: SirAnthony/mpkg
int driverSelectionMenu(CursesInterface &ncInterface) {
	// First, detect hardware for which we have to install drivers.
	string tmp_hw = get_tmp_file();
	system("lspci > " + tmp_hw);
	vector<string> hw = ReadFileStrings(tmp_hw);
	// Check for VirtualBox
	bool hasVirtualBox=false;
	int hasNvidia=-1;
	int hasRadeon=-1;
	for(size_t i=0; i<hw.size(); ++i) {
		if (hw[i].find("VirtualBox")!=std::string::npos) hasVirtualBox = true;
		if (hw[i].find("VGA compatible controller")!=std::string::npos && hw[i].find("nVidia")!=std::string::npos) hasNvidia = i;
		if (hw[i].find("VGA compatible controller")!=std::string::npos && hw[i].find("Radeon")!=std::string::npos) hasRadeon = i;
	}
	if (hasNvidia==-1) return 1;
	vector<MenuItem> menuItems;
	menuItems.push_back(MenuItem(_("Latest"), _("Latest GeForce (series 6xxx and later)")));
	menuItems.push_back(MenuItem("173", _("GeForce FX series")));
	menuItems.push_back(MenuItem("96", _("GeForce 4 series")));
	menuItems.push_back(MenuItem(_("Skip"), _("Do not install driver")));

	string ret = ncInterface.showMenu2(_("Videocard detected: ") + hw[hasNvidia] + _("\nChoose driver for it:"), menuItems);
	if (!ret.empty() && ret != _("Skip")) {
		if (ret!=_("Latest")) {
			WriteFile(SETUPCONFIG_NVIDIA, string("legacy" + ret));
		}
		else {
			WriteFile(SETUPCONFIG_NVIDIA, "generic");
			
		}
	}
	return 0;
}
コード例 #3
0
ファイル: file_routines.cpp プロジェクト: SirAnthony/mpkg
string getCdromVolname(string *rep_location)
{
	bool hasMountedHere=false;
	if (!isMounted(CDROM_MOUNTPOINT))
	{
		system("mount " + CDROM_DEVICE + " " + CDROM_MOUNTPOINT + " 2>/dev/null >/dev/null");
		hasMountedHere=true;
	}
	string Svolname, repLoc;
	// check_volname:
	if (FileExists(CDROM_MOUNTPOINT + "/.volume_id")) {
		vector<string> tmp = ReadFileStrings(CDROM_MOUNTPOINT + "/.volume_id");
		if (!tmp.empty()) {
			Svolname = cutSpaces(tmp[0]);
		}
	}
	if (rep_location!=NULL)
	{
		if (FileExists(CDROM_MOUNTPOINT + "/.repository")) {
			vector<string> tmp = ReadFileStrings(CDROM_MOUNTPOINT + "/.repository");
			if (!tmp.empty()) {
				repLoc = cutSpaces(tmp[0]);
			}
		}
	}
	if (hasMountedHere) system("umount " + CDROM_MOUNTPOINT + " 2>/dev/null >/dev/null");
	// Validating
	if (Svolname.find_first_of("\n\t/><| !@#$%%^&*()`\"\'")!=std::string::npos)
	{
		return "";
	}
	if (rep_location!=NULL)
	{
		*rep_location = repLoc;
	}
	
	return Svolname;

}
コード例 #4
0
ファイル: textsetup.cpp プロジェクト: SirAnthony/mpkg
int TextSetup::setAdditionalRepositories() {
	if (repositories.empty() && !ncInterface.showYesNo(_("Do you want to specify additional repositories?"))) return 0;
	ncInterface.showMsgBox(_("Edit file and place each repository on separate line"));
	string tmp_file = get_tmp_file();
	WriteFileStrings(tmp_file, repositories);
	ncInterface.uninit();
	system("mcedit " + tmp_file);
	vector<string> reps = ReadFileStrings(tmp_file);
	for (size_t i=0; i<reps.size(); ++i) {
		if (cutSpaces(reps[i]).empty()) continue;
		if (cutSpaces(reps[i])[0]=='#') continue;
		repositories.push_back(reps[i]);
	}
	unlink(tmp_file.c_str());
	return 0;
}
コード例 #5
0
ファイル: mechanics.cpp プロジェクト: SirAnthony/mpkg
bool TextSetupMechanics::checkNvidiaLoad() {
	int hasNvidia = -1;

	if (hasNvidia==-1) {
		string tmp_hw = get_tmp_file();
		system("lspci > " + tmp_hw);
		vector<string> hw = ReadFileStrings(tmp_hw);
		for(size_t i=0; i<hw.size(); ++i) {
			if (hw[i].find("VGA compatible controller")!=std::string::npos && hw[i].find("nVidia")!=std::string::npos) hasNvidia = i;
		}
		if (hasNvidia == -1) hasNvidia = 0;
	}
	// For debugging reasons, check for /tmp/nvidia_force file
	if (FileExists("/tmp/nvidia_force")) hasNvidia = 1;

	return hasNvidia > 0;
}
コード例 #6
0
ファイル: textsetup.cpp プロジェクト: SirAnthony/mpkg
int TextSetup::setTimezone() {
	// TODO: implement some easy way to find your timezone from this f****n' large list
	string tmpfile = get_tmp_file();
	system("( cd /usr/share/zoneinfo && find . -type f | sed -e 's/\\.\\///g') > " + tmpfile);
	vector<string> tz = ReadFileStrings(tmpfile);
	unlink(tmpfile.c_str());
	vector<MenuItem> m;
	for (size_t i=0; i<tz.size(); ++i) {
		m.push_back(MenuItem(tz[i], ""));
	}
	settings["timezone"] = ncInterface.showMenu2(_("Select your timezone:"), m, "Europe/Moscow");

	if (ncInterface.showYesNo(_("Does your hardware clock stores time in UTC instead of localtime?"))) settings["time_utc"]="1";
	else settings["time_utc"]="0";

	return 0;
}
コード例 #7
0
ファイル: maintainer.cpp プロジェクト: SirAnthony/mpkg
int main(int argc, char **argv) {
	int mode = MODE_HELP;
	if (argc==2 && string(argv[1])=="--show") mode = MODE_SHOW;
	if (argc>3 && string(argv[1])=="--set") mode = MODE_SET;

	string mName = mConfig.getValue("maintainer_name");
	string mEmail = mConfig.getValue("maintainer_email");

	if (getuid() && FileExists(getenv("HOME") + string("/.mpkg-maintainer"))) {
		vector<string> mdata = ReadFileStrings(getenv("HOME") + string("/.mpkg-maintainer"));
		if (mdata.size()>0) mName=cutSpaces(mdata[0]);
		if (mdata.size()>1) mEmail=cutSpaces(mdata[1]);
	}

	switch (mode) {
		case MODE_HELP:
			fprintf(stderr, _("%s: shows or sets maintainer name and email\nSyntax:\n"), argv[0]);
			fprintf(stderr, _("%s --help              show this help\n"), argv[0]);
			fprintf(stderr, _("%s --show              show maintainer name and email\n"), argv[0]);
			fprintf(stderr, _("%s --set NAME EMAIL    set name and email appropriately\n"), argv[0]);
			return 1;
		case MODE_SET:
			mName = argv[2];
			mEmail = argv[3];
			if (getuid()) {
				printf("Writing user maintainer\n");
				system("echo " + mName + " > ~/.mpkg-maintainer");
				system("echo " + mEmail + " >> ~/.mpkg-maintainer");
			}
			else {
				mConfig.setValue("maintainer_name", mName);
				mConfig.setValue("maintainer_email", mEmail);
			}
			// Doesn't break here, let's show data

		case MODE_SHOW:
			printf("MaintainerName: %s\nMaintainerEmail: %s\n", mName.c_str(), mEmail.c_str());
			return 0;

	}
	return 0;

}
コード例 #8
0
ファイル: raidtool.cpp プロジェクト: khvalera/mpkg
vector<RaidArray> getActiveRaidArrays() {
    vector<RaidArray> ret;
    string raw = get_tmp_file();
    system("cat /proc/mdstat | grep md | grep active > " + raw);
    vector<string> mdstat = ReadFileStrings(raw);
    vector<string> extra;
    RaidArray *array;
    string tmp;
    for (unsigned int i=0; i<mdstat.size(); ++i) {
        if (mdstat[i].find("md")==0) {
            ret.push_back(RaidArray());
            array = &ret[ret.size()-1];
            array->md_dev = "/dev/" + mdstat[i].substr(0, mdstat[i].find(" : "));
            tmp = mdstat[i].substr(mdstat[i].find(" active ") + strlen(" active "));
            array->level = tmp.substr(0, tmp.find(" "));
            array->extra_description = tmp.substr(tmp.find(" "));
            if (array->extra_description.empty()) continue;
            tmp = array->extra_description.substr(1);
            tmp = cutSpaces(tmp);
            while(!tmp.empty() && tmp.find_first_not_of("][ ")!=std::string::npos) {
                tmp = tmp.substr(tmp.find_first_not_of("][ "));
                if (tmp.find("[")==std::string::npos) break;
                array->devices.push_back("/dev/" + tmp.substr(0, tmp.find("[")));
                if (tmp.find(" ")==std::string::npos) break;
                else {
                    tmp = tmp.substr(tmp.find(" "));
                }
            }

        }
    }
    for (unsigned int i=0; i<ret.size(); ++i) {
        ret[i].extra_description = "RAID-массив " + ret[i].level + " [";
        for (unsigned int d=0; d<ret[i].devices.size(); ++d) {
            if (ret[i].devices[d].length()>strlen("/dev/")) ret[i].extra_description += ret[i].devices[d].substr(strlen("/dev/"));
            else ret[i].extra_description += ret[i].devices[d];
            if (d != ret[i].devices.size()-1) ret[i].extra_description += "|";
        }
        ret[i].extra_description += "]";
    }
    return ret;
}
コード例 #9
0
ファイル: parser.cpp プロジェクト: SirAnthony/mpkg
int loadSettings(const string& filename, map<string, string> &settings, vector<string> &repositories, map<string, map<string, string> > &partitions) {
	// Load settings until we found brackets
	vector<string> conf = ReadFileStrings(filename);
	string name, value;
	for (size_t i=0; i<conf.size(); ++i) {
		if (conf[i].empty()) continue;
		if (cutSpaces(conf[i])[0]=='#') continue;
		if (cutSpaces(conf[i])[0]=='[') break;
		if (parseConfString(conf[i], name, value)) settings[name]=value;
	}

	// Now, find repos
	bool found = false;
	for (size_t i=0; i<conf.size(); ++i) {
		if (conf[i].empty()) continue;
		if (cutSpaces(conf[i])[0]=='#') continue;
		if (!found) {
			if (cutSpaces(conf[i])=="[repositories]") found = true;
			continue;
		}
		if (cutSpaces(conf[i])[0]=='[') break;
		repositories.push_back(cutSpaces(conf[i]));
	}

	// Partitions
	found = false;
	name.clear();
	value.clear();
	string part;
	for (size_t i=0; i<conf.size(); ++i) {
		if (conf[i].empty()) continue;
		if (cutSpaces(conf[i])[0]=='#') continue;
		if (cutSpaces(conf[i]).find("[/")==0 && cutSpaces(conf[i]).size()>2) {
			found = true;	
			part = cutSpaces(conf[i]).substr(1, cutSpaces(conf[i]).size()-2);
			continue;
		}
		if (found && parseConfString(conf[i], name, value)) partitions[part][name]=value;
	}
	return 0;
}
コード例 #10
0
ファイル: raidtool.cpp プロジェクト: khvalera/mpkg
vector<RaidArray> detectRaidArrays() {
    vector<string> gp;
    vector<pEntry> pList;
    vector<string> raw;
    vector<RaidArray> ret;
    RaidArray *array = NULL;
    string tmp;
    pList= getGoodPartitions(gp);
    string mdout = get_tmp_file();
    for (unsigned int i=0; i<pList.size(); ++i) {
        if (!pList[i].raid) continue;
        system("mdadm -Q " + pList[i].devname + " | grep undetected | grep /dev/md > " + mdout + " 2>/dev/tty4");
        raw = ReadFileStrings(mdout);
        if (raw.empty()) continue;
        if (raw[0].find("/dev/md")==std::string::npos) continue;
        tmp = raw[0].substr(raw[0].find("/dev/md"));
        if (tmp.find(".")==std::string::npos) continue;
        tmp = tmp.substr(0, tmp.find_first_of("."));
        //ncInterface.showMsgBox("FOUND: " + tmp);
        array = NULL;
        for (unsigned int r=0; r<ret.size(); ++r) {
            if (ret[r].md_dev == tmp) {
                array = &ret[r];
                break;
            }
        }

        //ncInterface.showMsgBox("Total ret: " + IntToStr(ret.size()) + " but can't find " + tmp);
        if (!array) {
            ret.push_back(RaidArray());
            array = &ret[ret.size()-1];
            array->md_dev = tmp;
        }
        array->devices.push_back(pList[i].devname);
        //ncInterface.showMsgBox("Total ret: " + IntToStr(ret.size()) + " found li " + tmp);
    }
    return ret;
}
コード例 #11
0
ファイル: language.cpp プロジェクト: SirAnthony/mpkg
int main(int, char **) {
	dialogMode = true;
	CursesInterface ncInterface;
	ncInterface.setTitle(_("AgiliaLinux setup"));
	ncInterface.setSubtitle(_("Language selection"));
	vector<string> availableLanguages = ReadFileStrings(SETUP_LANGUAGES);
	vector<MenuItem> menuItems;
	string arg, value;
	for (size_t i=1; i<availableLanguages.size(); i=i+2) {
		arg=availableLanguages[i-1];
		value=availableLanguages[i];
		menuItems.push_back(MenuItem(arg, value));
	}
	if (menuItems.empty()) {
		ncInterface.showMsgBox(_("No languages available to select. Choosing english (en_US) as default option"));
		WriteFile(SETUP_LANGUAGES, "en_US");
		return 0;
	}
	string language = ncInterface.showMenu2(_("Select language:"), menuItems);
	if (language.empty()) return 1;
	WriteFile(SETUPCONFIG_LANGUAGE, language);
	return 0;
}
コード例 #12
0
ファイル: config.cpp プロジェクト: BackupTheBerlios/mops
int loadGlobalConfig(string config_file)
{
#ifdef HTTP_LIB
    mError("error: core running non-core code\n");
#endif

    currentStatus = "Loading configuration...";
    removeBlacklist = ReadFileStrings("/etc/mpkg-remove-blacklist");
    string run_scripts="yes";
    string cdrom_device="/dev/cdrom";
    string cdrom_mountpoint="/mnt/cdrom";
    string check_files = "preinstall";
    string sys_root="/";
    string sys_cache="/var/mpkg/cache/";
    string db_url="sqlite:///var/log/mpkg/packages.db";
    string scripts_dir="/var/log/mpkg/scripts/";
    string sql_type;
    vector<string> repository_list;
    vector<string> disabled_repository_list;
    bool conf_init=false;
    XMLResults xmlErrCode;
    if (access(config_file.c_str(), R_OK)==0)
    {
        XMLNode config=XMLNode::parseFile(config_file.c_str(), "mpkgconfig", &xmlErrCode);

        if (xmlErrCode.error != eXMLErrorNone)
        {
            mError("config parse error!\n");
            mpkgErrorReturn errRet = waitResponce(MPKG_SUBSYS_XMLCONFIG_READ_ERROR);
            if (errRet == MPKG_RETURN_REINIT)
            {
                conf_init = true;
            }
        }

        if (!conf_init)
        {
            if (config.nChildNode("run_scripts")!=0)
                run_scripts=(string) config.getChildNode("run_scripts").getText();
            if (config.nChildNode("checkFileConflicts")!=0)
                check_files = (string) config.getChildNode("checkFileConflicts").getText();
            if (config.nChildNode("sys_root")!=0)
                sys_root=(string) config.getChildNode("sys_root").getText();
            if (config.nChildNode("sys_cache")!=0)
                sys_cache=(string) config.getChildNode("sys_cache").getText();
            if (config.nChildNode("cdrom_device")!=0)
                cdrom_device=(string) config.getChildNode("cdrom_device").getText();
            if (config.nChildNode("cdrom_mountpoint")!=0)
                cdrom_mountpoint = (string) config.getChildNode("cdrom_mountpoint").getText();
            if (config.nChildNode("database_url")!=0)
                db_url=(string) config.getChildNode("database_url").getText();
            if (config.nChildNode("repository_list")!=0)
            {
                string tmp_r;
                for (int i=0; i<config.getChildNode("repository_list").nChildNode("repository"); i++)
                {
                    tmp_r = (string) config.getChildNode("repository_list").getChildNode("repository",i).getText();
                    if (tmp_r[tmp_r.length()-1]!='/') tmp_r += "/";
                    repository_list.push_back(tmp_r);
                }
                for (int i=0; i<config.getChildNode("repository_list").nChildNode("disabled_repository"); i++)
                {
                    disabled_repository_list.push_back((string) config.getChildNode("repository_list").getChildNode("disabled_repository",i).getText());
                }
            }
            if (config.nChildNode("scripts_dir")!=0)
            {
                scripts_dir = (string) config.getChildNode("scripts_dir").getText();
            }
        }

    }
    else
    {
        conf_init=true;
        mError("Configuration file /etc/mpkg.xml not found, using defaults and creating config\n");
    }
    // parsing results

    // run_scripts
    if (run_scripts=="yes")
        DO_NOT_RUN_SCRIPTS=false;
    if (run_scripts=="no")
        DO_NOT_RUN_SCRIPTS=true;
    if (run_scripts!="yes" && run_scripts!="no")
    {
        mError("Error in config file, option <run_scripts> should be \"yes\" or \"no\", without quotes");
        return -1; // CONFIG ERROR in scripts
    }
    if (check_files == "preinstall")
        fileConflictChecking = CHECKFILES_PREINSTALL;
    if (check_files == "postinstall")
        fileConflictChecking = CHECKFILES_POSTINSTALL;
    if (check_files == "disable")
        fileConflictChecking = CHECKFILES_DISABLE;
    if (cdrom_device.empty())
    {
        mError("empty cd-rom, using default\n");
#ifndef HTTP_LIB
        CDROM_DEVICE="/dev/cdrom";
#else
        DL_CDROM_DEVICE="/dev/cdrom";
#endif
    }
    else
    {
#ifndef HTTP_LIB
        CDROM_DEVICE=cdrom_device;
#else
        DL_CDROM_DEVICE=cdrom_device;
#endif
    }

    if (cdrom_mountpoint.empty())
    {
#ifndef HTTP_LIB
        CDROM_MOUNTPOINT="/mnt/cdrom";
#else
        DL_CDROM_MOUNTPOINT="/mnt/cdrom";
#endif
    }

    else
    {
#ifndef HTTP_LIB
        CDROM_MOUNTPOINT=cdrom_mountpoint;
#else
        DL_CDROM_MOUNTPOINT=cdrom_mountpoint;
#endif
    }

    // sys_root
    SYS_ROOT=sys_root;
    //sys_cache
    SYS_CACHE=sys_cache;
    SCRIPTS_DIR=scripts_dir;
    SYS_BACKUP = mConfig.getValue("sys_backup");
    if (SYS_BACKUP.empty()) {
        SYS_BACKUP = "/var/mpkg/backup/";
        mConfig.setValue("sys_backup", SYS_BACKUP);
    }
    if (db_url.find("sqlite://")==0)
    {
        sql_type="sqlite://";

        DATABASE=DB_SQLITE_LOCAL;
        DB_FILENAME=db_url.substr(strlen("sqlite:/"));
    }
    else {
        mError("CRITICAL: cannot find database, check config!");
        abort();
    }
    REPOSITORY_LIST=repository_list;
    DISABLED_REPOSITORY_LIST = disabled_repository_list;
#ifdef DEBUG
    say("System configuration:\n\trun_scripts: %s\n\tsys_root: %s\n\tsys_cache: %s\n\tSQL type: %s\n\tSQL filename: %s\n", \
        run_scripts.c_str(), sys_root.c_str(), sys_cache.c_str(), sql_type.c_str(), db_url.c_str());
#endif
    if (conf_init) mpkgconfig::initConfig();

    currentStatus = "Settings loaded";
    initDirectoryStructure();
    return 0;
}
コード例 #13
0
ファイル: config.cpp プロジェクト: BackupTheBerlios/mops
XMLNode mpkgconfig::getXMLConfig(string conf_file)
{
    mDebug("getXMLConfig");
    XMLNode config;
    XMLResults xmlErrCode;
    bool conf_init = false;
    removeBlacklist = ReadFileStrings("/etc/mpkg-remove-blacklist");
    if (access(conf_file.c_str(), R_OK)==0)
    {
        config=XMLNode::parseFile(conf_file.c_str(), "mpkgconfig", &xmlErrCode);
        if (xmlErrCode.error != eXMLErrorNone)
        {
            mError("config parse error!\n");
            mpkgErrorReturn errRet = waitResponce(MPKG_SUBSYS_XMLCONFIG_READ_ERROR);
            if (errRet == MPKG_RETURN_REINIT)
            {
                conf_init = true;
            }
        }

    }
    else conf_init = true;
    if (conf_init) config=XMLNode::createXMLTopNode("mpkgconfig");

    if (config.nChildNode("run_scripts")==0)
    {
        config.addChild("run_scripts");
        if (get_runscripts()) config.getChildNode("run_scripts").addText("yes");
        else config.getChildNode("run_scripts").addText("no");
    }
    if (config.nChildNode("checkFileConflicts")==0)
    {
        config.addChild("checkFileConflicts");
        if (get_checkFiles()==CHECKFILES_PREINSTALL) config.getChildNode("checkFileConflicts").addText("preinstall");
        if (get_checkFiles()==CHECKFILES_POSTINSTALL) config.getChildNode("checkFileConflicts").addText("postinstall");
        if (get_checkFiles()==CHECKFILES_DISABLE) config.getChildNode("checkFileConflicts").addText("disable");

    }

    if (config.nChildNode("sys_root")==0)
    {
        config.addChild("sys_root");
        config.getChildNode("sys_root").addText(get_sysroot().c_str());
    }

    if (config.nChildNode("sys_cache")==0)
    {
        config.addChild("sys_cache");
        config.getChildNode("sys_cache").addText(get_syscache().c_str());
    }

    if (config.nChildNode("database_url")==0)
    {
        config.addChild("database_url");
        config.getChildNode("database_url").addText(get_dburl().c_str());
    }

    if (config.nChildNode("repository_list")==0)
    {
        config.addChild("repository_list");
    }

    if (config.nChildNode("cdrom_device")==0)
    {
        mError("CD not detected\n");
        config.addChild("cdrom_device");
        config.getChildNode("cdrom_device").addText(get_cdromdevice().c_str());
    }


    if (config.nChildNode("cdrom_mountpoint")==0)
    {
        config.addChild("cdrom_mountpoint");
        config.getChildNode("cdrom_mountpoint").addText(get_cdrommountpoint().c_str());
    }

    if (config.nChildNode("scripts_dir")==0)
    {
        config.addChild("scripts_dir");
        config.getChildNode("scripts_dir").addText(get_scriptsdir().c_str());
    }
    mDebug("getXMLConfig end");
    return config;
}
コード例 #14
0
ファイル: libmpkg.cpp プロジェクト: BackupTheBerlios/mops
void generateDeps(string tgz_filename, bool updateOnly)
{
	if (mConfig.getValue("add_deps_in_build")=="yes") updateOnly=false;
	if (tgz_filename.empty()) {
		mError("No filename specified");
		return;
	}
	say("Generating dependencies for %s\n",tgz_filename.c_str());
	string current_dir = (string) get_current_dir_name();
	// Create a temporary directory
	string tmpdir = get_tmp_file();
	string dep_out = get_tmp_file();
	unlink(tmpdir.c_str());
	system("mkdir -p " + tmpdir);
	say("Extracting\n");
	system("tar zxf " + tgz_filename + " -C " + tmpdir);
	PackageConfig *p = new PackageConfig(tmpdir+"/install/data.xml");
	PACKAGE pkg;
	if (p->parseOk) xml2package(p->getXMLNode(), &pkg);
	delete p;
	say("Building dependencies\n");
	
	system("env LC_ALL=C requiredbuilder -n -v " + tgz_filename + " > "+ dep_out);
	vector<string> data = ReadFileStrings(dep_out);
	
	string tmp;
	string tail;
	DEPENDENCY d;
	//pkg.get_dependencies()->clear();
	string condptr;
	for (unsigned int i=0; i<data.size(); i++)
	{
		tmp = data[i].substr(0,data[i].find_first_of(" "));
		tail = data[i].substr(tmp.length()+1);
		d.set_package_name(&tmp);

		tmp = tail.substr(0, tail.find_first_of(" "));
		tail = tail.substr(tmp.length()+1);
		condptr=IntToStr(condition2int(hcondition2xml(tmp)));
		d.set_condition(&condptr);

		tmp = tail.substr(0,tail.find_first_of("-"));
		d.set_package_version(&tmp);
		if (*d.get_package_name()!=*pkg.get_name()) {
			// Checking existing dependencies
			bool added=false;
			for (unsigned int t=0; t<pkg.get_dependencies()->size(); t++) {
				if (*d.get_package_name()==*pkg.get_dependencies()->at(t).get_package_name()) {
					pkg.get_dependencies()->at(t) = d;
					added=true;
				}
			}
			if (!added) {
				if (updateOnly) mWarning("Found (possible) missing dependencies: " + d.getDepInfo());
				else pkg.get_dependencies()->push_back(d);
			}
		}
	}
	say(_("Got %d dependencies\n"), pkg.get_dependencies()->size());
	p = new PackageConfig(tmpdir+"/install/data.xml");
	dumpPackage(&pkg, p, tmpdir+"/install/data.xml");
	delete p;
	if (tgz_filename[0]!='/') tgz_filename = current_dir + "/"+getDirectory(tgz_filename);
	system ("cd " + tmpdir + "; buildpkg " + tgz_filename );
	system("rm -rf " + tmpdir);
	delete_tmp_files();
}