00001 
00002 
00003 #ifndef __ARC_USERCONFIG_H__
00004 #define __ARC_USERCONFIG_H__
00005 
00006 #include <list>
00007 #include <vector>
00008 #include <string>
00009 
00010 #include <arc/ArcConfig.h>
00011 #include <arc/DateTime.h>
00012 #include <arc/URL.h>
00013 #include <arc/User.h>
00014 
00015 namespace Arc {
00016 
00017   class Logger;
00018   class XMLNode;
00019 
00020   enum ServiceType {
00021     COMPUTING,
00022     INDEX
00023   };
00024 
00025   class ConfigEndpoint {
00026   public:
00027     enum Type { REGISTRY, COMPUTINGINFO, ANY };
00028 
00029     ConfigEndpoint(const std::string& URLString = "", const std::string& InterfaceName = "", ConfigEndpoint::Type type = ConfigEndpoint::ANY)
00030       : type(type), URLString(URLString), InterfaceName(InterfaceName) {}
00031     Type type;
00032     std::string URLString;
00033     std::string InterfaceName;
00034     std::string RequestedSubmissionInterfaceName;
00035 
00036     operator bool() const {
00037       return (!URLString.empty());
00038     }
00039 
00040     bool operator!() const {
00041       return (!URLString.empty());
00042     }
00043     
00044     bool operator==(ConfigEndpoint c) const {
00045       return (type == c.type) && (URLString == c.URLString) && (InterfaceName == c.InterfaceName) && (RequestedSubmissionInterfaceName == c.RequestedSubmissionInterfaceName);
00046     }
00047   };
00048 
00049   typedef std::list<std::string> ServiceList[2];
00050   
00051 
00052   std::string tostring(const ServiceType st);
00053 
00055 
00060   class initializeCredentialsType {
00061    public:
00062     typedef enum {
00063       SkipCredentials,
00064       NotTryCredentials,
00065       TryCredentials,
00066       RequireCredentials,
00067       SkipCANotTryCredentials,
00068       SkipCATryCredentials,
00069       SkipCARequireCredentials
00070     } initializeType;
00071     initializeCredentialsType(void):val(TryCredentials) { };
00072     initializeCredentialsType(initializeType v):val(v) { };
00073     bool operator==(initializeType v) { return (val == v); };
00074     bool operator!=(initializeType v) { return (val != v); };
00075     operator initializeType(void) { return val; };
00076    private:
00077     initializeType val;
00078   };
00079 
00081 
00131   class UserConfig {
00132   public:
00134 
00148     UserConfig(initializeCredentialsType initializeCredentials = initializeCredentialsType());
00150 
00179     UserConfig(const std::string& conffile,
00180                initializeCredentialsType initializeCredentials = initializeCredentialsType(),
00181                bool loadSysConfig = true);
00183 
00208     UserConfig(const std::string& conffile,
00209                const std::string& jfile,
00210                initializeCredentialsType initializeCredentials = initializeCredentialsType(),
00211                bool loadSysConfig = true);
00213 
00220     UserConfig(const long int& ptraddr);
00221     ~UserConfig() {}
00222 
00224 
00310     bool InitializeCredentials(initializeCredentialsType initializeCredentials);
00312 
00323     bool CredentialsFound() const {
00324       return !((proxyPath.empty() && (certificatePath.empty() || keyPath.empty())) || caCertificatesDirectory.empty());
00325     }
00326 
00328 
00390     bool LoadConfigurationFile(const std::string& conffile, bool ignoreJobListFile = true);
00391 
00393 
00403     bool SaveToFile(const std::string& filename) const;
00404 
00406 
00417     void ApplyToConfig(BaseConfig& ccfg) const;
00418 
00420 
00426     operator bool() const { return ok; }
00428 
00432     bool operator!() const { return !ok; }
00433 
00435 
00453     bool JobListFile(const std::string& path);
00455 
00463     const std::string& JobListFile() const { return joblistfile; }
00464 
00466 
00485     bool Timeout(int newTimeout);
00487 
00494     int  Timeout() const { return timeout; }
00495 
00497 
00510     bool Verbosity(const std::string& newVerbosity);
00512 
00521     const std::string& Verbosity() const { return verbosity; }
00522 
00524 
00542     bool Broker(const std::string& name);
00544 
00560     bool Broker(const std::string& name, const std::string& argument) { broker = std::make_pair<std::string, std::string>(name, argument); return true;}
00562 
00570     const std::pair<std::string, std::string>& Broker() const { return broker; }
00571 
00573 
00583     bool Bartender(const std::vector<URL>& urls) { bartenders = urls; return true; }
00585 
00593     void AddBartender(const URL& url) { bartenders.push_back(url); }
00595 
00602     const std::vector<URL>& Bartender() const { return bartenders; }
00603 
00605 
00617     bool VOMSESPath(const std::string& path) { vomsesPath = path; return true; }
00619 
00626     const std::string& VOMSESPath();
00627 
00629 
00639     bool UserName(const std::string& name) { username = name; return true; }
00641 
00648     const std::string& UserName() const { return username; }
00649 
00651 
00661     bool Password(const std::string& newPassword) { password = newPassword; return true; }
00663 
00670     const std::string& Password() const { return password; }
00671 
00673 
00686     bool ProxyPath(const std::string& newProxyPath) { proxyPath = newProxyPath; return true;}
00688 
00694     const std::string& ProxyPath() const { return proxyPath; }
00695 
00697 
00714     bool CertificatePath(const std::string& newCertificatePath) { certificatePath = newCertificatePath; return true; }
00716 
00724     const std::string& CertificatePath() const { return certificatePath; }
00725 
00727 
00745     bool KeyPath(const std::string& newKeyPath) { keyPath = newKeyPath; return true; }
00747 
00758     const std::string& KeyPath() const { return keyPath; }
00759 
00761 
00774     bool KeyPassword(const std::string& newKeyPassword) { keyPassword = newKeyPassword; return true; }
00776 
00785     const std::string& KeyPassword() const { return keyPassword; }
00786 
00788 
00800     bool KeySize(int newKeySize) { keySize = newKeySize; return true;}
00802 
00811     int KeySize() const { return keySize; }
00812 
00814 
00827     bool CACertificatePath(const std::string& newCACertificatePath) { caCertificatePath = newCACertificatePath; return true; }
00829 
00836     const std::string& CACertificatePath() const { return caCertificatePath; }
00837 
00839 
00855     bool CACertificatesDirectory(const std::string& newCACertificatesDirectory) { caCertificatesDirectory = newCACertificatesDirectory; return true; }
00857 
00865     const std::string& CACertificatesDirectory() const { return caCertificatesDirectory; }
00866 
00868 
00880     bool CertificateLifeTime(const Period& newCertificateLifeTime) { certificateLifeTime = newCertificateLifeTime; return true; }
00882 
00889     const Period& CertificateLifeTime() const { return certificateLifeTime; }
00890 
00892 
00900     bool SLCS(const URL& newSLCS) { slcs = newSLCS; return true; }
00902 
00907     const URL& SLCS() const { return slcs; }
00908 
00910 
00920     bool StoreDirectory(const std::string& newStoreDirectory) { storeDirectory = newStoreDirectory; return true; }
00922 
00929     const std::string& StoreDirectory() const { return storeDirectory; }
00930 
00932 
00942     bool JobDownloadDirectory(const std::string& newDownloadDirectory) { downloadDirectory = newDownloadDirectory; return true; }
00943 
00945 
00954     const std::string& JobDownloadDirectory() const { return downloadDirectory; }
00955 
00957 
00966     bool IdPName(const std::string& name) { idPName = name; return true; }
00968 
00974     const std::string& IdPName() const { return idPName; }
00975 
00977 
00991     bool OverlayFile(const std::string& path) { overlayfile = path; return true; }
00993 
00997     const std::string& OverlayFile() const { return overlayfile; }
00998 
01000 
01009     bool UtilsDirPath(const std::string& dir);
01011 
01015     const std::string& UtilsDirPath() const { return utilsdir; };
01016 
01018 
01025     void SetUser(const User& u) { user = u; };
01026 
01028 
01032     const User& GetUser() const { return user; };
01033 
01034 
01035     std::list<ConfigEndpoint> GetDefaultServices(ConfigEndpoint::Type type = ConfigEndpoint::ANY);
01036 
01037     ConfigEndpoint GetService(const std::string& alias);
01038 
01039     std::list<ConfigEndpoint> GetServices(const std::string& groupOrAlias, ConfigEndpoint::Type type = ConfigEndpoint::ANY);
01040 
01041     std::list<ConfigEndpoint> GetServicesInGroup(const std::string& group, ConfigEndpoint::Type type = ConfigEndpoint::ANY);
01042 
01043 
01044     const std::string& InfoInterface() const { return infointerface; };
01045 
01046     bool InfoInterface(const std::string& infointerface_) {
01047       infointerface = infointerface_;
01048       return true;
01049     }
01050 
01051 
01052     const std::string& SubmissionInterface() const { return submissioninterface; };
01053 
01054     bool SubmissionInterface(const std::string& submissioninterface_) {
01055       submissioninterface = submissioninterface_;
01056       return true;
01057     }
01058 
01059 
01060     const std::list<std::string>& RejectDiscoveryURLs() const { return rejectDiscoveryURLs; };
01061     const std::list<std::string>& RejectManagementURLs() const { return rejectManagementURLs; };
01062 
01063 
01065 
01071     static const std::string ARCUSERDIRECTORY;
01073 
01078     static const std::string SYSCONFIG;
01080 
01084     static const std::string SYSCONFIGARCLOC;
01086 
01092     static const std::string DEFAULTCONFIG;
01094 
01098     static const std::string EXAMPLECONFIG;
01099 
01101 
01108     static const int DEFAULT_TIMEOUT = 20;
01109 
01111 
01119     static const std::string DEFAULT_BROKER;
01120 
01121   private:
01122 
01123     static ConfigEndpoint ServiceFromLegacyString(std::string);
01124 
01125     void setDefaults();
01126     static bool makeDir(const std::string& path);
01127     static bool copyFile(const std::string& source,
01128                          const std::string& destination);
01129     bool CreateDefaultConfigurationFile() const;
01130 
01131     std::list<ConfigEndpoint> FilterServices(const std::list<ConfigEndpoint>&, ConfigEndpoint::Type);
01132 
01133 
01134     std::string joblistfile;
01135 
01136     int timeout;
01137 
01138     std::string verbosity;
01139 
01140     
01141     std::pair<std::string, std::string> broker;
01142 
01143     std::list<ConfigEndpoint> defaultServices;
01144     std::map<std::string, ConfigEndpoint> allServices;
01145     std::map<std::string, std::list<ConfigEndpoint> > groupMap;
01146     std::list<std::string> rejectDiscoveryURLs;
01147     std::list<std::string> rejectManagementURLs;
01148 
01149     
01150     std::vector<URL> bartenders;
01151 
01152     std::string proxyPath;
01153     std::string certificatePath;
01154     std::string keyPath;
01155     std::string keyPassword;
01156     int keySize;
01157     std::string caCertificatePath;
01158     std::string caCertificatesDirectory;
01159     Period certificateLifeTime;
01160 
01161     URL slcs;
01162 
01163     std::string vomsesPath;
01164 
01165     std::string storeDirectory;
01166     std::string downloadDirectory;
01167     std::string idPName;
01168 
01169     std::string username;
01170     std::string password;
01171 
01172     std::string overlayfile;
01173     std::string utilsdir;
01174 
01175     std::string submissioninterface;
01176     std::string infointerface;
01177     
01178     
01179     User user;
01180     
01181     bool ok;
01182 
01183     initializeCredentialsType initializeCredentials;
01184 
01185     static Logger logger;
01186   };
01187 
01188 
01189   class CertEnvLocker {
01190   public:
01191     CertEnvLocker(const UserConfig& cfg);
01192     ~CertEnvLocker(void);
01193 
01194   protected:
01195     std::string x509_user_key_old;
01196     std::string x509_user_key_new;
01197     bool x509_user_key_set;
01198     std::string x509_user_cert_old;
01199     std::string x509_user_cert_new;
01200     bool x509_user_cert_set;
01201     std::string x509_user_proxy_old;
01202     std::string x509_user_proxy_new;
01203     bool x509_user_proxy_set;
01204     std::string ca_cert_dir_old;
01205     bool ca_cert_dir_set;
01206   };
01207 
01208 } 
01209 
01210 #endif // __ARC_USERCONFIG_H__