CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
cmd_commit.cc
Go to the documentation of this file.
1 
6 #include "cmd_commit.h"
7 
8 #include <errno.h>
9 
10 #include <ctime>
11 #include <string>
12 #include <vector>
13 
14 #include "publish/cmd_util.h"
15 #include "publish/except.h"
16 #include "publish/repository.h"
17 #include "publish/settings.h"
18 #include "util/logging.h"
19 #include "util/posix.h"
20 #include "util/string.h"
21 #include "whitelist.h"
22 
23 namespace publish {
24 
25 int CmdCommit::Main(const Options &options) {
26  // Repository name and lease path are submitted as a single argument
27  // for historical reasons
28  std::string fqrn;
29 
30  if (!options.plain_args().empty()) {
31  std::vector<std::string> tokens = SplitStringBounded(
32  2, options.plain_args()[0].value_str, '/');
33  fqrn = tokens[0];
34  }
35 
36  SettingsBuilder builder;
37  const std::string session_dir = Env::GetEnterSessionDir();
38  builder.SetConfigPath(session_dir);
39 
41  try {
42  settings = builder.CreateSettingsPublisher(fqrn, true /* needs_managed */);
43  } catch (const EPublish &e) {
45  LogCvmfs(kLogCvmfs, kLogStderr | kLogSyslogErr, "CernVM-FS error: %s",
46  e.msg().c_str());
47  return 1;
48  }
49  throw;
50  }
51 
52  if (!SwitchCredentials(settings->owner_uid(), settings->owner_gid(),
53  false /* temporarily */)) {
54  throw EPublish("No write permission to repository");
55  }
56 
57  const FileSystemInfo fs_info = GetFileSystemInfo("/cvmfs");
58  if (fs_info.type == kFsTypeAutofs)
59  throw EPublish("Autofs on /cvmfs has to be disabled");
60 
61  UniquePtr<Publisher> publisher;
62  try {
63  publisher = new Publisher(*settings);
64  if (publisher->whitelist()->IsExpired()) {
65  throw EPublish("Repository whitelist for $name is expired",
67  }
68  } catch (const EPublish &e) {
71  LogCvmfs(kLogCvmfs, kLogStderr | kLogSyslogErr, "%s", e.msg().c_str());
72  return EINVAL;
73  }
74  }
75 
76  const double whitelist_valid_s =
77  difftime(publisher->whitelist()->expires(), time(NULL));
78  if (whitelist_valid_s < (12 * 60 * 60)) {
79  LogCvmfs(
81  "Warning: Repository whitelist stays valid for less than 12 hours!");
82  }
83 
84  publisher->Sync();
85  SafeWriteToFile("commit", session_dir + "/shellaction.marker", 0600);
86  LogCvmfs(kLogCvmfs, kLogStdout, "Changes saved!");
87  publisher->ExitShell();
88 
89  return 0;
90 }
91 
92 } // namespace publish
SettingsPublisher * CreateSettingsPublisher(const std::string &ident, bool needs_managed=false)
Definition: settings.cc:573
virtual int Main(const Options &options)
Definition: cmd_commit.cc:25
EFileSystemTypes type
Definition: posix.h:55
std::string msg() const
Definition: except.h:45
const SettingsPublisher & settings() const
Definition: repository.h:316
bool SafeWriteToFile(const std::string &content, const std::string &path, int mode)
Definition: posix.cc:2137
void SetConfigPath(const std::string &config_path)
Definition: settings.h:525
const std::vector< Argument > & plain_args() const
Definition: command.h:128
FileSystemInfo GetFileSystemInfo(const std::string &path)
Definition: posix.cc:179
vector< string > SplitStringBounded(unsigned max_chunks, const string &str, char delim)
Definition: string.cc:310
EFailures failure() const
Definition: except.h:44
bool SwitchCredentials(const uid_t uid, const gid_t gid, const bool temporarily)
Definition: posix.cc:773
Publisher(const SettingsPublisher &settings, const bool exists=true)
Definition: repository.cc:619
CVMFS_EXPORT void LogCvmfs(const LogSource source, const int mask, const char *format,...)
Definition: logging.cc:545