summaryrefslogtreecommitdiff
path: root/utilities/installmgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utilities/installmgr.cpp')
-rw-r--r--utilities/installmgr.cpp287
1 files changed, 287 insertions, 0 deletions
diff --git a/utilities/installmgr.cpp b/utilities/installmgr.cpp
new file mode 100644
index 0000000..60fc7ce
--- /dev/null
+++ b/utilities/installmgr.cpp
@@ -0,0 +1,287 @@
+#include <swmgr.h>
+#include <installmgr.h>
+#include <filemgr.h>
+#include <iostream>
+#include <map>
+#include <swmodule.h>
+#include <stdio.h>
+#include <swlog.h>
+
+using namespace sword;
+using std::cout;
+using std::cerr;
+using std::cin;
+using std::map;
+
+
+SWMgr *mgr;
+InstallMgr *installMgr;
+
+
+void finish(int status) {
+ delete installMgr;
+ delete mgr;
+ cout << "\n";
+ exit(status);
+}
+
+
+void usage(const char *progName) {
+ fprintf(stderr, "usage: %s <option>\nOptions:\n"
+ "\t-init\t\t\t\tcreate a basic user config file.\n"
+ "\t\t\t\t\t\tWARNING: overwrites existing.\n"
+ "\t-l\t\t\t\tlist installed modules\n"
+ "\t-u <modName>\t\t\tuninstall module\n"
+ "\t-s\t\t\t\tlist remote sources\n"
+ "\t-r <remoteSrcName>\t\trefresh remote source\n"
+ "\t-rl <remoteSrcName>\t\tlist available modules from remote source\n"
+ "\t-rd <remoteSrcName>\t\tlist new/updated modules from remote source\n"
+ "\t-ri <remoteSrcName> <modName>\tinstall module from remote source\n"
+ "\t-ll <path>\t\t\tlist available modules at local path\n"
+ "\t-li <path> <modName>\t\tinstall module from local path\n"
+ , progName);
+ finish(-1);
+}
+
+
+void initConfig() {
+ cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
+ cout << " -=+* WARNING *+=- -=+* WARNING *+=-\n\n\n";
+ cout << "Although Install Manager provides a convenient way for installing\n";
+ cout << "and upgrading SWORD components, it also uses a systematic method\n";
+ cout << "for accessing sites which gives packet sniffers a target to lock\n";
+ cout << "into for singling out users. \n\n\n";
+ cout << "IF YOU LIVE IN A PERSECUTED COUNTRY AND DO NOT WISH TO RISK DETECTION,\n";
+ cout << "YOU SHOULD *NOT* USE INSTALL MANAGER'S REMOTE SOURCE FEATURES.\n\n\n";
+ cout << "if you understand this and are willing to enable remote source features\n";
+ cout << "then type yes at the prompt\n\n";
+ cout << "enable? [no] ";
+ char prompt[10];
+ fgets(prompt, 9, stdin);
+ bool enable = (!strcmp(prompt, "yes\n"));
+ char *envhomedir = getenv ("HOME");
+ SWBuf confPath = (envhomedir) ? envhomedir : ".";
+ confPath += "/.sword/InstallMgr/InstallMgr.conf";
+ FileMgr::createParent(confPath.c_str());
+ remove(confPath.c_str());
+
+ InstallSource is("FTP");
+ is.caption = "CrossWire";
+ is.source = "ftp.crosswire.org";
+ is.directory = "/pub/sword/raw";
+
+ SWConfig config(confPath.c_str());
+ config["General"]["PassiveFTP"] = "true";
+ if (enable) {
+ config["Sources"]["FTPSource"] = is.getConfEnt();
+ }
+ config.Save();
+ cout << "\n\nInitialized basic config file at [" << confPath << "]\n";
+ cout << "with remote source features " << ((enable) ? "ENABLED" : "DISABLED") << "\n";
+}
+
+
+void listModules(SWMgr *mgr) {
+ cout << "Installed Modules:\n\n";
+ SWModule *module;
+ for (ModMap::iterator it = mgr->Modules.begin(); it != mgr->Modules.end(); it++) {
+ module = it->second;
+ cout << "[" << module->Name() << "] \t- " << module->Description() << "\n";
+ }
+}
+
+
+void uninstallModule(const char *modName) {
+ SWModule *module;
+ ModMap::iterator it = mgr->Modules.find(modName);
+ if (it == mgr->Modules.end()) {
+ fprintf(stderr, "Couldn't find module [%s] to remove\n", modName);
+ finish(-2);
+ }
+ module = it->second;
+ installMgr->removeModule(mgr, module->Name());
+ cout << "Removed module: [" << modName << "]\n";
+}
+
+
+void listRemoteSources() {
+ cout << "Remote Sources:\n\n";
+ for (InstallSourceMap::iterator it = installMgr->sources.begin(); it != installMgr->sources.end(); it++) {
+ cout << "[" << it->second->caption << "]\n";
+ cout << "\tType ; " << it->second->type << "\n";
+ cout << "\tSource ; " << it->second->source << "\n";
+ cout << "\tDirectory; " << it->second->directory << "\n";
+ }
+}
+
+
+void refreshRemoteSource(const char *sourceName) {
+ InstallSourceMap::iterator source = installMgr->sources.find(sourceName);
+ if (source == installMgr->sources.end()) {
+ fprintf(stderr, "Couldn't find remote source [%s]\n", sourceName);
+ finish(-3);
+ }
+ if (!installMgr->refreshRemoteSource(source->second))
+ cout << "Remote Source Refreshed\n";
+ else cerr << "Error Refreshing Remote Source\n";
+}
+
+
+void remoteNewModules(const SWMgr *base, const char *sourceName) {
+ cout << "Updated and New Modules:\n(be sure to refresh remote source (-r) first for most current list)\n\n";
+ InstallSourceMap::iterator source = installMgr->sources.find(sourceName);
+ if (source == installMgr->sources.end()) {
+ fprintf(stderr, "Couldn't find remote source [%s]\n", sourceName);
+ finish(-3);
+ }
+ map<SWModule *, int> modStats = installMgr->getModuleStatus(*base, *source->second->getMgr());
+ SWModule *module;
+ int status;
+ bool updated;
+ for (map<SWModule *, int>::iterator it = modStats.begin(); it != modStats.end(); it++) {
+ module = it->first;
+ status = it->second;
+ updated = (status & InstallMgr::MODSTAT_UPDATED);
+ if ((status & InstallMgr::MODSTAT_NEW) || (updated)) {
+ cout << ((updated)?"U":"N") << " [" << module->Name() << "] \t- " << module->Description() << "\n";
+ }
+ }
+}
+
+
+void remoteListModules(const char *sourceName) {
+ cout << "Available Modules:\n(be sure to refresh remote source (-r) first for most current list)\n\n";
+ InstallSourceMap::iterator source = installMgr->sources.find(sourceName);
+ if (source == installMgr->sources.end()) {
+ fprintf(stderr, "Couldn't find remote source [%s]\n", sourceName);
+ finish(-3);
+ }
+ listModules(source->second->getMgr());
+}
+
+
+void localDirListModules(const char *dir) {
+ cout << "Available Modules:\n\n";
+ SWMgr mgr(dir);
+ listModules(&mgr);
+}
+
+
+void remoteInstallModule(const char *sourceName, const char *modName) {
+ InstallSourceMap::iterator source = installMgr->sources.find(sourceName);
+ if (source == installMgr->sources.end()) {
+ fprintf(stderr, "Couldn't find remote source [%s]\n", sourceName);
+ finish(-3);
+ }
+ InstallSource *is = source->second;
+ SWMgr *rmgr = is->getMgr();
+ SWModule *module;
+ ModMap::iterator it = rmgr->Modules.find(modName);
+ if (it == rmgr->Modules.end()) {
+ fprintf(stderr, "Remote source [%s] does not make available module [%s]\n", sourceName, modName);
+ finish(-4);
+ }
+ module = it->second;
+ int error = installMgr->installModule(mgr, 0, module->Name(), is);
+ if (error) {
+ cout << "Error installing module: [" << module->Name() << "] (write permissions?)\n";
+ } else cout << "Installed module: [" << module->Name() << "]\n";
+}
+
+
+void localDirInstallModule(const char *dir, const char *modName) {
+ SWMgr lmgr(dir);
+ SWModule *module;
+ ModMap::iterator it = lmgr.Modules.find(modName);
+ if (it == lmgr.Modules.end()) {
+ fprintf(stderr, "Module [%s] not available at path [%s]\n", modName, dir);
+ finish(-4);
+ }
+ module = it->second;
+ int error = installMgr->installModule(mgr, dir, module->Name());
+ if (error) {
+ cout << "Error installing module: [" << module->Name() << "] (write permissions?)\n";
+ } else cout << "Installed module: [" << module->Name() << "]\n";
+}
+
+
+int main(int argc, char **argv) {
+
+ mgr = new SWMgr();
+ char *envhomedir = getenv ("HOME");
+ SWBuf baseDir = (envhomedir) ? envhomedir : ".";
+ baseDir += "/.sword/InstallMgr";
+ installMgr = new InstallMgr(baseDir);
+
+ SWLog::getSystemLog()->setLogLevel(SWLog::LOG_DEBUG);
+
+ cout << "\n";
+
+ if (argc < 2)
+ usage(*argv);
+
+ switch (argv[1][1]) {
+ case 'i':
+ if (strcmp(argv[1], "-init"))
+ usage(*argv);
+ initConfig();
+ break;
+ case 'l':
+ switch (argv[1][2]) {
+ case 0: // -l list installed modules
+ listModules(mgr);
+ break;
+ case 'l': // -ll list from local directory
+ if (argc < 3)
+ usage(*argv);
+ localDirListModules(argv[2]);
+ break;
+ case 'i': // -li remote install
+ if (argc < 4)
+ usage(*argv);
+ localDirInstallModule(argv[2], argv[3]);
+ break;
+ default: usage(*argv);
+ }
+ break;
+ case 'u':
+ if (argc < 3)
+ usage(*argv);
+
+ uninstallModule(argv[2]);
+ break;
+ case 's':
+ listRemoteSources();
+ break;
+ case 'r': // remote option
+ switch (argv[1][2]) {
+ case 0: // -r refresh
+ if (argc < 3)
+ usage(*argv);
+ refreshRemoteSource(argv[2]);
+ break;
+ case 'l': // -rl remote list
+ if (argc < 3)
+ usage(*argv);
+ remoteListModules(argv[2]);
+ break;
+ case 'd': // -rl remote list
+ if (argc < 3)
+ usage(*argv);
+ remoteNewModules(mgr, argv[2]);
+ break;
+ case 'i': // -ri remote install
+ if (argc < 4)
+ usage(*argv);
+ remoteInstallModule(argv[2], argv[3]);
+ break;
+ default: usage(*argv);
+ }
+ break;
+ default: usage(*argv);
+ }
+
+ finish(0);
+
+ return 0;
+}