$ ceph-conf -n osd.0 --show-config-value INVALID -c /dev/null
failed to get config option 'INVALID': option not found
[1]
- $ echo '[global]' > $TESTDIR/ceph.conf
- $ echo 'mon_host=$public_network' >> $TESTDIR/ceph.conf
- $ echo 'public_network=$mon_host' >> $TESTDIR/ceph.conf
+
+ $ cat > $TESTDIR/ceph.conf <<EOF
+ > [global]
+ > mon_host = \$public_network
+ > public_network = \$mon_host
+ > EOF
$ ceph-conf --show-config-value mon_host -c $TESTDIR/ceph.conf
variable expansion loop at mon_host=$public_network
expansion stack:
mon_host=$public_network
$mon_host
$ rm $TESTDIR/ceph.conf
+
+Name option test to strip the PID
+=================================
+ $ cat > $TESTDIR/ceph.conf <<EOF
+ > [client]
+ > admin socket = \$name.\$pid.asok
+ > [global]
+ > admin socket = \$name.asok
+ > EOF
+ $ ceph-conf --name client.admin.133423 --show-config-value admin_socket -c $TESTDIR/ceph.conf
+ client.admin.133423.asok
+ $ ceph-conf --name mds.a --show-config-value admin_socket -c $TESTDIR/ceph.conf
+ mds.a.asok
+ $ ceph-conf --name osd.0 --show-config-value admin_socket -c $TESTDIR/ceph.conf
+ osd.0.asok
+ $ rm $TESTDIR/ceph.conf
}
}
+bool is_name_pid(std::string name, std::string& id)
+{
+ if (id.empty()) {
+ return false;
+ }
+ static const char* daemon_types[] = {"mon", "osd", "mds", "mgr"};
+ if (std::find(std::begin(daemon_types), std::end(daemon_types), name) !=
+ std::end(daemon_types)) {
+ // only override name and pid for non-daemon names
+ return false;
+ }
+ try {
+ std::stoi(id);
+ } catch (const std::logic_error&) {
+ // only override pid for $id which looks like pid
+ return false;
+ }
+ return true;
+}
+
+std::pair<std::string, std::string>
+maybe_override_name_pid(vector<const char*> args)
+{
+ for (auto i = args.begin(); i != args.end(); ++i) {
+ string val;
+ if (ceph_argparse_witharg(args, i, &val, "--name", "-n", (char*)NULL)) {
+ size_t dot_pos = val.rfind('.');
+ if (dot_pos != val.npos) {
+ string name = val.substr(0, dot_pos);
+ string id = val.substr(dot_pos + 1);
+ if (is_name_pid(name, id)) {
+ // override name
+ return {name, id};
+ }
+ }
+ return {val, ""};
+ }
+ }
+ return {};
+}
+
int main(int argc, const char **argv)
{
vector<const char*> args;
std::string dump_format;
argv_to_vec(argc, argv, args);
+
auto orig_args = args;
auto cct = [&args] {
+ // override the name and PID for non-daemon names
+ auto [name, pid] = maybe_override_name_pid(args);
+ if (!name.empty()) {
+ // push the name option back
+ args.push_back("--name");
+ args.push_back(name.c_str());
+ }
+ if (!pid.empty()) {
+ setenv("PID", pid.c_str(), 1);
+ }
std::map<std::string,std::string> defaults = {{"log_to_file", "false"}};
return global_init(&defaults, args, CEPH_ENTITY_TYPE_CLIENT,
CODE_ENVIRONMENT_DAEMON,