From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 11 Sep 2007 18:59:43 -0000 Subject: [Cluster-devel] conga/ricci/modules/rpm PackageHandler.cpp Pac ... Message-ID: <20070911185943.801.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Changes by: rmccabe at sourceware.org 2007-09-11 18:59:42 Modified files: ricci/modules/rpm: PackageHandler.cpp PackageHandler.h RpmModule.cpp RpmModule.h main.cpp Log message: - More cleanup - Recognize F7 by name ("Moonshine") as having the RHEL5 cluster bits. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/rpm/PackageHandler.cpp.diff?cvsroot=cluster&r1=1.15&r2=1.16 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/rpm/PackageHandler.h.diff?cvsroot=cluster&r1=1.6&r2=1.7 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/rpm/RpmModule.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/rpm/RpmModule.h.diff?cvsroot=cluster&r1=1.2&r2=1.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/rpm/main.cpp.diff?cvsroot=cluster&r1=1.5&r2=1.6 --- conga/ricci/modules/rpm/PackageHandler.cpp 2007/09/11 02:45:28 1.15 +++ conga/ricci/modules/rpm/PackageHandler.cpp 2007/09/11 18:59:42 1.16 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2006 + Copyright Red Hat, Inc. 2006-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -28,222 +28,244 @@ #include #include - using namespace std; +#define RPM_PATH "/bin/rpm" +#define UP2DATE_PATH "/usr/sbin/up2date-nox" +#define YUM_PATH "/usr/bin/yum" -#define RPM_PATH "/bin/rpm" -#define UP2DATE_PATH "/usr/sbin/up2date-nox" -#define YUM_PATH "/usr/bin/yum" - - -static bool -RHEL4=false, RHEL5=false, FC5=false, FC6=false; -static void -set_release(); - - +static bool RHEL4=false, RHEL5=false, FC5=false, FC6=false; +static void set_release(); // class PackageInstaller - - PackageInstaller::PackageInstaller() { - set_release(); + set_release(); } PackageInstaller::~PackageInstaller() {} - bool PackageInstaller::available() { - if (RHEL4) { - bool rhn_available = true; - // check existence of /etc/sysconfig/rhn/systemid - if (access("/etc/sysconfig/rhn/systemid", F_OK)) - rhn_available = false; - // check for subscribed channels - if (rhn_available) { - String out, err; - int status; - vector args; - args.push_back("--show-channels"); - if (utils::execute(UP2DATE_PATH, args, out, err, status, false)) - throw command_not_found_error_msg(UP2DATE_PATH); - if (status != 0) - rhn_available = false; - } - return rhn_available; - } else if (FC5 || FC6 || RHEL5) { - // nothing to check for, maybe ping repositories??? - return true; - } else - return false; + if (RHEL4) { + bool rhn_available = true; + // check existence of /etc/sysconfig/rhn/systemid + if (access("/etc/sysconfig/rhn/systemid", F_OK)) + rhn_available = false; + + // check for subscribed channels + if (rhn_available) { + String out, err; + int status; + vector args; + + args.push_back("--show-channels"); + if (utils::execute(UP2DATE_PATH, args, out, err, status, false)) + throw command_not_found_error_msg(UP2DATE_PATH); + if (status != 0) + rhn_available = false; + } + return rhn_available; + } else if (FC5 || FC6 || RHEL5) { + // use yum + // nothing to check for, maybe ping repositories? + return true; + } else + return false; } map PackageInstaller::available_rpms() { - map rpms; + map rpms; - if (!available()) - return rpms; + if (!available()) + return rpms; - if (RHEL4) { - String out, err; - int status; - vector args; - args.push_back("--showall"); - if (utils::execute(UP2DATE_PATH, args, out, err, status, false)) - throw command_not_found_error_msg(UP2DATE_PATH); - vector lines = utils::split(utils::strip(out), "\n"); - for (vector::const_iterator iter = lines.begin(); - iter != lines.end(); - iter++) { - String line(*iter); - line = utils::strip(line); - vector words = utils::split(line, "-"); - vector::size_type l = words.size(); - if (l < 3) - continue; - String name = words[0]; - for (unsigned int i=1; i args; - args.push_back("-y"); - args.push_back("list"); - args.push_back("all"); - if (utils::execute(YUM_PATH, args, out, err, status, false)) - throw command_not_found_error_msg(YUM_PATH); - vector lines = utils::split(utils::strip(out), "\n"); - for (vector::const_iterator iter = lines.begin(); - iter != lines.end(); - iter++) { - String line(*iter); - line = utils::strip(line); - vector words = utils::split(line); - vector::size_type l = words.size(); - if (l < 3) - continue; - String name = words[0]; - String::size_type idx = name.rfind('.'); - if (idx == String::npos) - continue; - name = name.substr(0, idx); - String version = words[1]; - rpms[name] = version; - } - } + if (RHEL4) { + String out, err; + int status; + vector args; + + args.push_back("--showall"); + if (utils::execute(UP2DATE_PATH, args, out, err, status, false)) + throw command_not_found_error_msg(UP2DATE_PATH); + vector lines = utils::split(utils::strip(out), "\n"); + + for (vector::const_iterator + iter = lines.begin() ; + iter != lines.end() ; + iter++) + { + String line(*iter); + line = utils::strip(line); + vector words = utils::split(line, "-"); + vector::size_type l = words.size(); + if (l < 3) + continue; + + String name = words[0]; + for (unsigned int i = 1 ; i < l - 2 ; i++) + name += "-" + words[i]; + String version = words[l - 2] + "-" + words[l - 1].substr(0, words[l - 1].rfind(".")); + rpms[name] = version; + } + } else if (FC5 || FC6 || RHEL5) { + String out, err; + int status; + vector args; + + args.push_back("-y"); + args.push_back("list"); + args.push_back("all"); + + if (utils::execute(YUM_PATH, args, out, err, status, false)) + throw command_not_found_error_msg(YUM_PATH); + + vector lines = utils::split(utils::strip(out), "\n"); + + for (vector::const_iterator + iter = lines.begin() ; + iter != lines.end() ; + iter++) + { + String line(*iter); + line = utils::strip(line); + vector words = utils::split(line); + vector::size_type l = words.size(); + if (l < 3) + continue; + + String name = words[0]; + String::size_type idx = name.rfind('.'); + if (idx == String::npos) + continue; + name = name.substr(0, idx); + String version = words[1]; + rpms[name] = version; + } + } - return rpms; + return rpms; } bool PackageInstaller::install(vector rpms) { - if (rpms.empty()) - return true; + if (rpms.empty()) + return true; - if (RHEL4) { - String out, err; - int status; - vector args; - for (vector::size_type i=0; i rpms_to_install, rpms_to_upgrade; - String out, err; - int status; - vector args; - args.push_back("-y"); - args.push_back("list"); - args.push_back("installed"); - if (utils::execute(YUM_PATH, args, out, err, status, false)) - throw command_not_found_error_msg(YUM_PATH); - if (status) - return false; - vector lines = utils::split(utils::strip(out), "\n"); - for (vector::const_iterator rpm = rpms.begin(); - rpm != rpms.end(); - rpm++) { - bool install = true; - for (vector::const_iterator iter = lines.begin(); - iter != lines.end(); - iter++) { - String line(*iter); - line = utils::strip(line); - if (line.find(*rpm + ".") == 0) - install = false; - } - if (install) - rpms_to_install.push_back(*rpm); - else - rpms_to_upgrade.push_back(*rpm); - } - if (!rpms_to_install.empty()) { - out = err = ""; - args.clear(); - args.push_back("-y"); - args.push_back("install"); - for (vector::const_iterator rpm = rpms_to_install.begin(); - rpm != rpms_to_install.end(); - rpm++) - args.push_back(*rpm); - if (utils::execute(YUM_PATH, args, out, err, status, false)) - throw command_not_found_error_msg(YUM_PATH); - if (status) - return false; - } - if (!rpms_to_upgrade.empty()) { - out = err = ""; - args.clear(); - args.push_back("-y"); - args.push_back("update"); - for (vector::const_iterator rpm = rpms_to_upgrade.begin(); - rpm != rpms_to_upgrade.end(); - rpm++) - args.push_back(*rpm); - if (utils::execute(YUM_PATH, args, out, err, status, false)) - throw command_not_found_error_msg(YUM_PATH); - if (status) - return false; - } - return true; - } else - return false; + if (RHEL4) { + String out, err; + int status; + vector args; + + for (vector::size_type i = 0 ; i < rpms.size() ; i++) + args.push_back(rpms[i]); + + if (utils::execute(UP2DATE_PATH, args, out, err, status, true)) + throw command_not_found_error_msg(UP2DATE_PATH); + + if (status != 0) + throw String(UP2DATE_PATH) + " failed: " + err; + return true; + } else if (FC5 || FC6 || RHEL5) { + vector rpms_to_install, rpms_to_upgrade; + String out, err; + int status; + vector args; + + args.push_back("-y"); + args.push_back("list"); + args.push_back("installed"); + + if (utils::execute(YUM_PATH, args, out, err, status, false)) + throw command_not_found_error_msg(YUM_PATH); + if (status) + return false; + + vector lines = utils::split(utils::strip(out), "\n"); + for (vector::const_iterator + rpm = rpms.begin() ; + rpm != rpms.end() ; + rpm++) + { + bool install = true; + for (vector::const_iterator + iter = lines.begin() ; + iter != lines.end() ; + iter++) + { + String line(*iter); + line = utils::strip(line); + if (line.find(*rpm + ".") == 0) + install = false; + } + + if (install) + rpms_to_install.push_back(*rpm); + else + rpms_to_upgrade.push_back(*rpm); + } + + if (!rpms_to_install.empty()) { + out = err = ""; + args.clear(); + + args.push_back("-y"); + args.push_back("install"); + for (vector::const_iterator + rpm = rpms_to_install.begin() ; + rpm != rpms_to_install.end() ; + rpm++) + { + args.push_back(*rpm); + } + + if (utils::execute(YUM_PATH, args, out, err, status, false)) + throw command_not_found_error_msg(YUM_PATH); + if (status) + return false; + } + + if (!rpms_to_upgrade.empty()) { + out = err = ""; + args.clear(); + + args.push_back("-y"); + args.push_back("update"); + for (vector::const_iterator + rpm = rpms_to_upgrade.begin() ; + rpm != rpms_to_upgrade.end() ; + rpm++) + { + args.push_back(*rpm); + } + + if (utils::execute(YUM_PATH, args, out, err, status, false)) + throw command_not_found_error_msg(YUM_PATH); + if (status) + return false; + } + return true; + } else + return false; } - - - // #### class Package #### - Package::Package() { - set_release(); + set_release(); } Package::Package(const String& name) : - name(name) + name(name) { - set_release(); + set_release(); } Package::~Package() @@ -252,34 +274,32 @@ XMLObject Package::xml() const { - XMLObject xml("rpm"); - xml.set_attr("name", name); - xml.set_attr("summary", summary); - xml.set_attr("description", description); - xml.set_attr("version", version); - xml.set_attr("repo_version", repo_version); - return xml; + XMLObject xml("rpm"); + xml.set_attr("name", name); + xml.set_attr("summary", summary); + xml.set_attr("description", description); + xml.set_attr("version", version); + xml.set_attr("repo_version", repo_version); + return xml; } - // #### class PackageSet #### - PackageSet::PackageSet() : - installed(false), - in_repo(false), - upgradeable(false) + installed(false), + in_repo(false), + upgradeable(false) { - set_release(); + set_release(); } PackageSet::PackageSet(const String& name) : - name(name), - installed(false), - in_repo(false), - upgradeable(false) + name(name), + installed(false), + in_repo(false), + upgradeable(false) { - set_release(); + set_release(); } PackageSet::~PackageSet() @@ -288,358 +308,381 @@ XMLObject PackageSet::xml() const { - XMLObject xml("set"); - xml.set_attr("name", name); - xml.set_attr("summary", summary); - xml.set_attr("description", description); - xml.set_attr("installed", installed?"true":"false"); - xml.set_attr("in_repository", in_repo?"true":"false"); - xml.set_attr("installable", upgradeable?"true":"false"); - return xml; + XMLObject xml("set"); + xml.set_attr("name", name); + xml.set_attr("summary", summary); + xml.set_attr("description", description); + xml.set_attr("installed", installed ? "true" : "false"); + xml.set_attr("in_repository", in_repo ? "true" : "false"); + xml.set_attr("installable", upgradeable ? "true" : "false"); + return xml; } - - // #### class PackageHandler #### - PackageInstaller PackageHandler::_pi; PackageHandler::PackageHandler() { - set_release(); + set_release(); - // get installed packages + // get installed packages + String out, err; + int status; + vector args; + + args.push_back("-qa"); + if (utils::execute(RPM_PATH, args, out, err, status, false)) + throw command_not_found_error_msg(RPM_PATH); + if (status != 0) + throw String("rpm -qa failed: " + err); + + vector lines = utils::split(out, "\n"); + for (vector::const_iterator + iter = lines.begin() ; + iter != lines.end() ; + iter++) + { + String line(*iter); + line = utils::strip(line); + + vector words = utils::split(line, "-"); + vector::size_type l = words.size(); + if (l < 3) + continue; + String name = words[0]; + + for (unsigned int i = 1; i < l - 2 ; i++) + name += "-" + words[i]; + + Package pack(name); + pack.version = words[l - 2] + "-" + words[l - 1]; + _packages[name] = pack; + } + + // probe repositories + if (repo_available()) { + map avail_rpms = _pi.available_rpms(); + for (map::const_iterator + iter = avail_rpms.begin() ; + iter != avail_rpms.end() ; + iter++) + { + String name = iter->first; + String version = iter->second; + Package& pack = _packages[name]; + pack.name = name; + pack.repo_version = version; + } + } - String out, err; - int status; - vector args; - args.push_back("-qa"); - if (utils::execute(RPM_PATH, args, out, err, status, false)) - throw command_not_found_error_msg(RPM_PATH); - if (status != 0) - throw String("rpm -qa failed"); - vector lines = utils::split(out, "\n"); - for (vector::const_iterator iter = lines.begin(); - iter != lines.end(); - iter++) { - String line(*iter); - line = utils::strip(line); - vector words = utils::split(line, "-"); - vector::size_type l = words.size(); - if (l < 3) - continue; - String name = words[0]; - for (unsigned int i=1; i avail_rpms = _pi.available_rpms(); - for (map::const_iterator iter = avail_rpms.begin(); - iter != avail_rpms.end(); - iter++) { - String name = iter->first; - String version = iter->second; - Package& pack = _packages[name]; - pack.name = name; - pack.repo_version = version; - } - } - - - // build sets - _sets = build_sets(); - for (map::iterator iter = _sets.begin(); - iter != _sets.end(); - iter++) - populate_set(iter->second); + // build sets + _sets = build_sets(); + for (map::iterator + iter = _sets.begin() ; + iter != _sets.end() ; + iter++) + { + populate_set(iter->second); + } } PackageHandler::~PackageHandler() {} - std::map& PackageHandler::packages() { - return _packages; + return _packages; } std::map& PackageHandler::sets() { - return _sets; + return _sets; } - std::map PackageHandler::build_sets() { - map sets; + map sets; - PackageSet set = build_cluster_base_set(); - sets[set.name] = set; + PackageSet set = build_cluster_base_set(); + sets[set.name] = set; - if (RHEL4 || FC5) { - set = build_cluster_base_gulm_set(); - sets[set.name] = set; - } + if (RHEL4 || FC5) { + set = build_cluster_base_gulm_set(); + sets[set.name] = set; + } - set = build_cluster_services_set(); - sets[set.name] = set; + set = build_cluster_services_set(); + sets[set.name] = set; - set = build_cluster_storage_set(); - sets[set.name] = set; + set = build_cluster_storage_set(); + sets[set.name] = set; - set = build_linux_virtual_server_set(); - sets[set.name] = set; + set = build_linux_virtual_server_set(); + sets[set.name] = set; - return sets; + return sets; } PackageSet PackageHandler::build_cluster_base_set() { - PackageSet set("Cluster Base"); + PackageSet set("Cluster Base"); - if (RHEL4 || FC5) { - set.packages.push_back("ccs"); - set.packages.push_back("cman"); - set.packages.push_back("dlm"); - set.packages.push_back("fence"); - - struct utsname uts; - uname(&uts); - String kernel(uts.release); - if (kernel.find("smp") != kernel.npos) { - set.packages.push_back("cman-kernel-smp"); - set.packages.push_back("dlm-kernel-smp"); - } else if (kernel.find("hugemem") != kernel.npos) { - set.packages.push_back("cman-kernel-hugemen"); - set.packages.push_back("dlm-kernel-hugemem"); - } else { - set.packages.push_back("cman-kernel"); - set.packages.push_back("dlm-kernel"); - } - } else if (RHEL5 || FC6) { - set.packages.push_back("cman"); - } + if (RHEL4 || FC5) { + set.packages.push_back("ccs"); + set.packages.push_back("cman"); + set.packages.push_back("dlm"); + set.packages.push_back("fence"); + + struct utsname uts; + uname(&uts); + String kernel(uts.release); + + if (kernel.find("smp") != kernel.npos) { + set.packages.push_back("cman-kernel-smp"); + set.packages.push_back("dlm-kernel-smp"); + } else if (kernel.find("hugemem") != kernel.npos) { + set.packages.push_back("cman-kernel-hugemen"); + set.packages.push_back("dlm-kernel-hugemem"); + } else { + set.packages.push_back("cman-kernel"); + set.packages.push_back("dlm-kernel"); + } + } else if (RHEL5 || FC6) { + set.packages.push_back("cman"); + } - return set; + return set; } PackageSet PackageHandler::build_cluster_base_gulm_set() { - PackageSet set("Cluster Base - Gulm"); + PackageSet set("Cluster Base - Gulm"); - if (RHEL4 || FC5) { - set.packages.push_back("ccs"); - set.packages.push_back("gulm"); - } else - throw String("GULM not available in CS5"); + if (RHEL4 || FC5) { + set.packages.push_back("ccs"); + set.packages.push_back("gulm"); + } else + throw String("GULM is not available in Red Hat Cluster Suite 5"); - return set; + return set; } PackageSet PackageHandler::build_cluster_services_set() { - PackageSet set("Cluster Service Manager"); - set.packages.push_back("rgmanager"); - if (RHEL4 || FC5) { - set.packages.push_back("magma"); - set.packages.push_back("magma-plugins"); - } - return set; + PackageSet set("Cluster Service Manager"); + set.packages.push_back("rgmanager"); + if (RHEL4 || FC5) { + set.packages.push_back("magma"); + set.packages.push_back("magma-plugins"); + } + return set; } PackageSet PackageHandler::build_cluster_storage_set() { - struct utsname uts; - uname(&uts); - String kernel(uts.release); - - PackageSet set("Clustered Storage"); - set.packages.push_back("lvm2-cluster"); - - if (RHEL4 || FC5) { - set.packages.push_back("GFS"); - if (kernel.find("smp") != kernel.npos) { - set.packages.push_back("GFS-kernel-smp"); - } else if (kernel.find("hugemem") != kernel.npos) { - set.packages.push_back("GFS-kernel-hugemem"); - } else { - set.packages.push_back("GFS-kernel"); - } - } else if (RHEL5 || FC6) { - set.packages.push_back("gfs2-utils"); - if (RHEL5) { - set.packages.push_back("gfs-utils"); - if (kernel.find("xen") == kernel.npos) - set.packages.push_back("kmod-gfs"); - else - set.packages.push_back("kmod-gfs-xen"); - } - } + struct utsname uts; + uname(&uts); + String kernel(uts.release); + + PackageSet set("Clustered Storage"); + set.packages.push_back("lvm2-cluster"); + + if (RHEL4 || FC5) { + set.packages.push_back("GFS"); + if (kernel.find("smp") != kernel.npos) { + set.packages.push_back("GFS-kernel-smp"); + } else if (kernel.find("hugemem") != kernel.npos) { + set.packages.push_back("GFS-kernel-hugemem"); + } else { + set.packages.push_back("GFS-kernel"); + } + } else if (RHEL5 || FC6) { + set.packages.push_back("gfs2-utils"); + if (RHEL5) { + set.packages.push_back("gfs-utils"); + if (kernel.find("xen") == kernel.npos) + set.packages.push_back("kmod-gfs"); + else + set.packages.push_back("kmod-gfs-xen"); + } + } - return set; + return set; } PackageSet PackageHandler::build_linux_virtual_server_set() { - PackageSet set("Linux Virtual Server"); - set.packages.push_back("ipvsadm"); - set.packages.push_back("piranha"); - return set; + PackageSet set("Linux Virtual Server"); + set.packages.push_back("ipvsadm"); + set.packages.push_back("piranha"); + return set; } - void PackageHandler::populate_set(PackageSet& set) { - set.installed = true; - set.in_repo = true; - set.upgradeable = false; - - for (list::const_iterator name_iter = set.packages.begin(); - name_iter != set.packages.end(); - name_iter++) { - const String& name = *name_iter; - map::const_iterator iter = _packages.find(name); - if (iter == _packages.end()) { - set.installed = false; - set.in_repo = false; - set.upgradeable = false; - break; - } else { - const Package& pack = iter->second; - if (pack.version.empty()) - set.installed = false; - if (pack.repo_version.empty()) - set.in_repo = false; - else if (pack.repo_version > pack.version) - set.upgradeable = true; - } - } - if (set.in_repo == false) - set.upgradeable = false; + set.installed = true; + set.in_repo = true; + set.upgradeable = false; + + for (list::const_iterator + name_iter = set.packages.begin() ; + name_iter != set.packages.end() ; + name_iter++) + { + const String& name = *name_iter; + map::const_iterator iter = _packages.find(name); + if (iter == _packages.end()) { + set.installed = false; + set.in_repo = false; + set.upgradeable = false; + break; + } else { + const Package& pack = iter->second; + if (pack.version.empty()) + set.installed = false; + if (pack.repo_version.empty()) + set.in_repo = false; + else if (pack.repo_version > pack.version) + set.upgradeable = true; + } + } + + if (set.in_repo == false) + set.upgradeable = false; } void PackageHandler::install(const std::list& packages, - const std::list& sets, - bool upgrade) + const std::list& sets, + bool upgrade) { - vector rpms; + vector rpms; - PackageHandler h_pre; - for (list::const_iterator iter = packages.begin(); - iter != packages.end(); - iter++) { - String name(iter->name); - map::iterator pack_iter = h_pre.packages().find(name); - if (pack_iter == h_pre.packages().end()) - throw String("package ") + name + " present neither locally nor in repository"; - else { - String curr_ver(pack_iter->second.version); - String repo_ver(pack_iter->second.repo_version); - if (curr_ver.empty()) { - // not installed - if (repo_ver.empty()) - throw String("package ") + name + " not present in repository"; - else - rpms.push_back(name); - } else { - // already installed - if (upgrade) { - if (repo_ver.empty()) - throw String("package ") + name + " not present in repository"; - else if (repo_ver > curr_ver) - rpms.push_back(name); - } - } - } - } - - for (list::const_iterator iter = sets.begin(); - iter != sets.end(); - iter++) { - String name(iter->name); - map::iterator set_iter = h_pre.sets().find(name); - if (set_iter == h_pre.sets().end()) - throw String("packages of set ") + name + " present neither locally nor in repository"; - else { - PackageSet& p_set = set_iter->second; - if (p_set.installed) { - // already installed - if (upgrade) { - if (p_set.in_repo) { - if (p_set.upgradeable) - for (list::const_iterator name_iter = p_set.packages.begin(); - name_iter != p_set.packages.end(); - name_iter++) - rpms.push_back(*name_iter); - } else - throw String("packages of set ") + name + " not present in repository"; - } - } else { - // not installed - if (p_set.in_repo) - for (list::const_iterator name_iter = p_set.packages.begin(); - name_iter != p_set.packages.end(); - name_iter++) - rpms.push_back(*name_iter); - else - throw String("packages of set ") + name + " not present in repository"; - } - } - } - - if (!_pi.install(rpms)) { - String msg("Failed to install packages"); - if (!repo_available()) - msg += ": System not configured to use repositories"; - throw msg; - } -} + PackageHandler h_pre; + for (list::const_iterator + iter = packages.begin() ; + iter != packages.end() ; + iter++) + { + String name(iter->name); + map::iterator pack_iter = h_pre.packages().find(name); + if (pack_iter == h_pre.packages().end()) { + throw String("package ") + name + + " is present neither locally nor in repository"; + } else { + String curr_ver(pack_iter->second.version); + String repo_ver(pack_iter->second.repo_version); + if (curr_ver.empty()) { + // not installed + if (repo_ver.empty()) { + throw String("package ") + name + + " is not present in repository"; + } else + rpms.push_back(name); + } else { + // already installed + if (upgrade) { + if (repo_ver.empty()) { + throw String("package ") + name + + " is not present in repository"; + } else if (repo_ver > curr_ver) + rpms.push_back(name); + } + } + } + } + + for (list::const_iterator + iter = sets.begin() ; + iter != sets.end() ; + iter++) + { + String name(iter->name); + map::iterator set_iter = h_pre.sets().find(name); + + if (set_iter == h_pre.sets().end()) + throw String("packages of set ") + name + " present neither locally nor in repository"; + else { + PackageSet& p_set = set_iter->second; + if (p_set.installed) { + // already installed + if (upgrade) { + if (p_set.in_repo) { + if (p_set.upgradeable) { + for (list::const_iterator + name_iter = p_set.packages.begin() ; + name_iter != p_set.packages.end() ; + name_iter++) + { + rpms.push_back(*name_iter); + } else { + throw String("packages of set ") + name + " are not present in any available repository"; + } + } + } + } + } else { + // not installed + if (p_set.in_repo) { + for (list::const_iterator + name_iter = p_set.packages.begin() ; + name_iter != p_set.packages.end() ; + name_iter++) + { + rpms.push_back(*name_iter); + } + } else { + throw String("packages of set ") + name + + " are not present in any available repository"; + } + } + } + } + if (!_pi.install(rpms)) { + String msg("Failed to install packages"); + if (!repo_available()) + msg += ": System not configured to use repositories"; + throw msg; + } +} bool PackageHandler::repo_available() { - return _pi.available(); + return _pi.available(); } - - - - void set_release() { - static bool release_set = false; - if (!release_set) { - String release(utils::strip(File::open("/etc/redhat-release"))); - - if (release.find("Nahant") != release.npos) - RHEL4 = true; - else if (release.find("Bordeaux") != release.npos) - FC5 = true; - else if (release.find("Zod") != release.npos) - FC6 = true; - else if (release.find("Tikanga") != release.npos) - RHEL5 = true; - else - throw String("Unsupported OS"); + static bool release_set = false; + if (!release_set) { + String release(utils::strip(File::open("/etc/redhat-release"))); + + if (release.find("Nahant") != release.npos) + RHEL4 = true; + else if (release.find("Bordeaux") != release.npos) + FC5 = true; + else if (release.find("Zod") != release.npos) + FC6 = true; + else if (release.find("Moonshine") != release.npos) + FC6 = true; + else if (release.find("Tikanga") != release.npos) + RHEL5 = true; + else + throw String("Unsupported OS: " + release); - release_set = true; - } + release_set = true; + } } --- conga/ricci/modules/rpm/PackageHandler.h 2007/09/11 02:45:28 1.6 +++ conga/ricci/modules/rpm/PackageHandler.h 2007/09/11 18:59:42 1.7 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2006 + Copyright Red Hat, Inc. 2006-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -21,105 +21,92 @@ */ -#ifndef PackageHandler_h -#define PackageHandler_h +#ifndef __CONGA_MODRPM_PACKAGEHANDLER_H +#define __CONGA_MODRPM_PACKAGEHANDLER_H #include "XML.h" #include "String.h" #include #include - class Package { - public: - Package(); - Package(const String& name); - virtual ~Package(); - - String name; - String summary; - String description; - String version; - String repo_version; - - XMLObject xml() const; - - private: + public: + Package(); + Package(const String& name); + virtual ~Package(); + + String name; + String summary; + String description; + String version; + String repo_version; -}; // class Package + XMLObject xml() const; + private: +}; class PackageSet { - public: - PackageSet(); - PackageSet(const String& name); - virtual ~PackageSet(); - - String name; - String summary; - String description; - bool installed; - bool in_repo; - bool upgradeable; - - std::list packages; + public: + PackageSet(); + PackageSet(const String& name); + virtual ~PackageSet(); + + String name; + String summary; + String description; + bool installed; + bool in_repo; + bool upgradeable; - XMLObject xml() const; + std::list packages; - private: - -}; // class PackageSet + XMLObject xml() const; + private: +}; class PackageInstaller { - public: - PackageInstaller(); - virtual ~PackageInstaller(); - - bool available(); - std::map available_rpms(); - bool install(std::vector rpm_names); - + public: + PackageInstaller(); + virtual ~PackageInstaller(); + + bool available(); + std::map available_rpms(); + bool install(std::vector rpm_names); }; - class PackageHandler { - public: - PackageHandler(); - virtual ~PackageHandler(); - - std::map& packages(); - std::map& sets(); - - void populate_set(PackageSet& set); - - - static bool repo_available(); - - static std::map build_sets(); - static PackageSet build_cluster_base_set(); - static PackageSet build_cluster_base_gulm_set(); - static PackageSet build_cluster_services_set(); - static PackageSet build_cluster_storage_set(); - static PackageSet build_linux_virtual_server_set(); - - static void install(const std::list& packages, - const std::list& sets, - bool upgrade=true); - - private: - - std::map _packages; - std::map _sets; - - static PackageInstaller _pi; - - -}; // class PackageHandler - + public: + PackageHandler(); + virtual ~PackageHandler(); + + std::map& packages(); + std::map& sets(); + + void populate_set(PackageSet& set); + + static bool repo_available(); + + static std::map build_sets(); + static PackageSet build_cluster_base_set(); + static PackageSet build_cluster_base_gulm_set(); + static PackageSet build_cluster_services_set(); + static PackageSet build_cluster_storage_set(); + static PackageSet build_linux_virtual_server_set(); + + static void install(const std::list& packages, + const std::list& sets, + bool upgrade=true); + + private: + std::map _packages; + std::map _sets; + static PackageInstaller _pi; +}; -#endif // PackageHandler_h +#endif --- conga/ricci/modules/rpm/RpmModule.cpp 2007/09/11 02:45:28 1.4 +++ conga/ricci/modules/rpm/RpmModule.cpp 2007/09/11 18:59:42 1.5 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2006 + Copyright Red Hat, Inc. 2006-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -24,10 +24,8 @@ #include "RpmModule.h" #include "PackageHandler.h" - using namespace std; - static VarMap lists(const VarMap& args); static VarMap query(const VarMap& args); static VarMap repository_configured(const VarMap& args); @@ -35,224 +33,253 @@ static ApiFcnMap build_fcn_map(); - RpmModule::RpmModule() : - Module(build_fcn_map()) + Module(build_fcn_map()) {} RpmModule::~RpmModule() {} - ApiFcnMap build_fcn_map() { - FcnMap api_1_0; - api_1_0["list"] = lists; - api_1_0["query"] = query; - api_1_0["install"] = install; - api_1_0["repository_configured"] = repository_configured; + FcnMap api_1_0; - ApiFcnMap api_fcn_map; - api_fcn_map["1.0"] = api_1_0; - - return api_fcn_map; + api_1_0["list"] = lists; + api_1_0["query"] = query; + api_1_0["install"] = install; + api_1_0["repository_configured"] = repository_configured; + + ApiFcnMap api_fcn_map; + api_fcn_map["1.0"] = api_1_0; + return api_fcn_map; } VarMap install(const VarMap& args) { - list rpms_list, sets_list; - bool upgrade; - try{ - VarMap::const_iterator iter = args.find("rpms"); - if (iter != args.end()) - rpms_list = iter->second.get_list_XML(); - - iter = args.find("sets"); - if (iter != args.end()) - sets_list = iter->second.get_list_XML(); - - upgrade = true; - iter = args.find("upgrade"); - if (iter != args.end()) - upgrade = iter->second.get_bool(); - } catch ( String e ) { - throw APIerror(e); - } - - // command - list rpms; - for (list::const_iterator iter = rpms_list.begin(); - iter != rpms_list.end(); - iter++) - if (iter->tag() == "rpm") { - String name(iter->get_attr("name")); - if (name.size()) { - Package pack(name); - rpms.push_back(pack); - } - } - - list sets; - for (list::const_iterator iter = sets_list.begin(); - iter != sets_list.end(); - iter++) - if (iter->tag() == "set") { - String name(iter->get_attr("name")); - if (name.size()) { - PackageSet set(name); - sets.push_back(set); - } - } + list rpms_list, sets_list; + bool upgrade; + + try { + VarMap::const_iterator iter = args.find("rpms"); + if (iter != args.end()) + rpms_list = iter->second.get_list_XML(); + + iter = args.find("sets"); + if (iter != args.end()) + sets_list = iter->second.get_list_XML(); + + upgrade = true; + iter = args.find("upgrade"); + if (iter != args.end()) + upgrade = iter->second.get_bool(); + } catch ( String e ) { + throw APIerror(e); + } + + // command + list rpms; + for (list::const_iterator + iter = rpms_list.begin() ; + iter != rpms_list.end() ; + iter++) + { + if (iter->tag() == "rpm") { + String name(iter->get_attr("name")); + if (name.size()) { + Package pack(name); + rpms.push_back(pack); + } + } + + list sets; + for (list::const_iterator + iter = sets_list.begin() ; + iter != sets_list.end() ; + iter++) + { + if (iter->tag() == "set") { + String name(iter->get_attr("name")); + if (name.size()) { + PackageSet set(name); + sets.push_back(set); + } + } + } - PackageHandler::install(rpms, sets, upgrade); - return VarMap(); + PackageHandler::install(rpms, sets, upgrade); + return VarMap(); } VarMap repository_configured(const VarMap& args) { - Variable var("repository_configured", PackageHandler::repo_available()); + Variable var("repository_configured", PackageHandler::repo_available()); - VarMap ret; - ret.insert(pair(var.name(), var)); - return ret; + VarMap ret; + ret.insert(pair(var.name(), var)); + return ret; } VarMap lists(const VarMap& args) { - bool rpms, sets, installed, installable, upgradeable; - try { - rpms = false; - VarMap::const_iterator iter = args.find("rpms"); - if (iter != args.end()) - rpms = iter->second.get_bool(); - - sets = false; - iter = args.find("sets"); - if (iter != args.end()) - sets = iter->second.get_bool(); - - installed = false; - iter = args.find("installed"); - if (iter != args.end()) - installed = iter->second.get_bool(); - - installable = false; - iter = args.find("installable"); - if (iter != args.end()) - installable = iter->second.get_bool(); - - upgradeable = false; - iter = args.find("upgradeable"); - if (iter != args.end()) - upgradeable = iter->second.get_bool(); - } catch ( String e ) { - throw APIerror(e); - } - - - VarMap ret; - - if (sets || rpms) { - PackageHandler handler; - - if (rpms) { - list rpm_list; - for (map::const_iterator iter = handler.packages().begin(); - iter != handler.packages().end(); - iter++ ) { - const Package& pack = iter->second; - bool add = false; - if (installed) - if (pack.version.size()) - add = true; - if (installable) - if (pack.repo_version > pack.version && - pack.version.empty()) - add = true; - if (upgradeable) - if (pack.repo_version > pack.version && - pack.version.size()) - add = true; - if (add) - rpm_list.push_back(pack.xml()); - } - Variable var("rpms", rpm_list); - ret.insert(pair(var.name(), var)); - } - - if (sets) { - list set_list; - for (map::const_iterator iter = handler.sets().begin(); - iter != handler.sets().end(); - iter++ ) { - const PackageSet& set = iter->second; - bool add = false; - if (installed) - if (set.installed) - add = true; - if (installable) - if (!set.installed && - set.in_repo) - add = true; - if (upgradeable) - if (set.installed && - set.upgradeable) - add = true; - if (add) - set_list.push_back(set.xml()); - } - Variable var("sets", set_list); - ret.insert(pair(var.name(), var)); - } - } + bool rpms, sets, installed, installable, upgradeable; - return ret; + try { + rpms = false; + VarMap::const_iterator iter = args.find("rpms"); + + if (iter != args.end()) + rpms = iter->second.get_bool(); + + sets = false; + iter = args.find("sets"); + if (iter != args.end()) + sets = iter->second.get_bool(); + + installed = false; + iter = args.find("installed"); + + if (iter != args.end()) + installed = iter->second.get_bool(); + + installable = false; + iter = args.find("installable"); + if (iter != args.end()) + installable = iter->second.get_bool(); + + upgradeable = false; + iter = args.find("upgradeable"); + if (iter != args.end()) + upgradeable = iter->second.get_bool(); + } catch ( String e ) { + throw APIerror(e); + } + + VarMap ret; + + if (sets || rpms) { + PackageHandler handler; + + if (rpms) { + list rpm_list; + for (map::const_iterator + iter = handler.packages().begin() ; + iter != handler.packages().end() ; + iter++) + { + const Package& pack = iter->second; + bool add = false; + + if (installed) { + if (pack.version.size()) + add = true; + } + + if (installable) { + if (pack.repo_version > pack.version && + pack.version.empty()) + { + add = true; + } + } + + if (upgradeable) { + if (pack.repo_version > pack.version && + pack.version.size()) + { + add = true; + } + } + + if (add) + rpm_list.push_back(pack.xml()); + } + + Variable var("rpms", rpm_list); + ret.insert(pair(var.name(), var)); + } + + if (sets) { + list set_list; + for (map::const_iterator + iter = handler.sets().begin() ; + iter != handler.sets().end() ; + iter++) + { + const PackageSet& set = iter->second; + bool add = false; + + if (installed) { + if (set.installed) + add = true; + } + + if (installable) { + if (!set.installed && set.in_repo) + add = true; + } + + if (upgradeable) { + if (set.installed && set.upgradeable) + add = true; + } + + if (add) + set_list.push_back(set.xml()); + } + + Variable var("sets", set_list); + ret.insert(pair(var.name(), var)); + } + } + + return ret; } VarMap query(const VarMap& args) { - list search_list; - try { - VarMap::const_iterator iter = args.find("search"); - if (iter == args.end()) - throw APIerror("missing search variable"); - search_list = iter->second.get_list_XML(); - } catch ( String e ) { - throw APIerror(e); - } - - - list result_list; - PackageHandler handler; - for (list::const_iterator iter = search_list.begin(); - iter != search_list.end(); - iter++) { - if (iter->tag() == "rpm") { - String name(iter->get_attr("name")); - if (name.size()) { - Package& pack = handler.packages()[name]; - pack.name = name; - result_list.push_back(pack.xml()); - } - } else if (iter->tag() == "set") { - String name(iter->get_attr("name")); - if (name.size()) { - PackageSet& set = handler.sets()[name]; - set.name = name; - result_list.push_back(set.xml()); - } - } - } - - Variable var("result", result_list); - - VarMap ret; - ret.insert(pair(var.name(), var)); - return ret; + list search_list; + + try { + VarMap::const_iterator iter = args.find("search"); + if (iter == args.end()) + throw APIerror("missing search variable"); + search_list = iter->second.get_list_XML(); + } catch ( String e ) { + throw APIerror(e); + } + + list result_list; + PackageHandler handler; + for (list::const_iterator + iter = search_list.begin() ; + iter != search_list.end() ; + iter++) + { + if (iter->tag() == "rpm") { + String name(iter->get_attr("name")); + if (name.size()) { + Package& pack = handler.packages()[name]; + pack.name = name; + result_list.push_back(pack.xml()); + } + } else if (iter->tag() == "set") { + String name(iter->get_attr("name")); + if (name.size()) { + PackageSet& set = handler.sets()[name]; + set.name = name; + result_list.push_back(set.xml()); + } + } + } + + Variable var("result", result_list); + VarMap ret; + ret.insert(pair(var.name(), var)); + return ret; } --- conga/ricci/modules/rpm/RpmModule.h 2007/09/11 02:45:28 1.2 +++ conga/ricci/modules/rpm/RpmModule.h 2007/09/11 18:59:42 1.3 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2006 + Copyright Red Hat, Inc. 2006-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -20,22 +20,18 @@ * Author: Stanko Kupcevic */ - -#ifndef RpmModule_h -#define RpmModule_h +#ifndef __CONGA_MODRPM_RPMMODULE_H +#define __CONGA_MODRPM_RPMMODULE_H #include "Module.h" - class RpmModule : public Module { - public: - RpmModule(); - virtual ~RpmModule(); - - private: + public: + RpmModule(); + virtual ~RpmModule(); + private: }; - -#endif // RpmModule_h +#endif --- conga/ricci/modules/rpm/main.cpp 2007/09/11 02:45:28 1.5 +++ conga/ricci/modules/rpm/main.cpp 2007/09/11 18:59:42 1.6 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2005 + Copyright Red Hat, Inc. 2005-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -24,18 +24,22 @@ #include "RpmModule.h" #include + using namespace std; int -main(int argc, char** argv) +main(int argc, char **argv) { - try { - RpmModule m; - return stdin_out_module_driver(m, - argc, - argv); - } catch (String e) { - cerr << e << endl; - return 1; - } + try { + RpmModule m; + return stdin_out_module_driver(m, argc, argv); + } catch (String e) { + cerr << e << endl; + return 1; + } catch (...) { + cerr << "unknown error" << endl; + return 1; + } + + return 0; }