#include "osd/OSDMap.h"
#include "auth/AuthSupported.h"
+#include "auth/KeyRing.h"
#include "common/config.h"
shutdown();
}
-void Monitor::init()
+int Monitor::init()
{
lock.Lock();
KeyRing keyring;
bufferlist::iterator p = bl.begin();
::decode(keyring, p);
- key_server.bootstrap_keyring(keyring);
+ extract_save_mon_key(keyring);
+ }
+
+ ostringstream os;
+ os << g_conf->mon_data << "/keyring";
+ int r = keyring.load(cct, os.str());
+ if (r < 0) {
+ EntityName mon_name;
+ mon_name.set_type(CEPH_ENTITY_TYPE_MON);
+ EntityAuth mon_key;
+ if (key_server.get_auth(mon_name, mon_key)) {
+ dout(1) << "copying mon. key from old db to external keyring" << dendl;
+ keyring.add(mon_name, mon_key);
+ bufferlist bl;
+ keyring.encode_plaintext(bl);
+ store->put_bl_ss(bl, "keyring", NULL);
+ } else {
+ derr << "unable to load initial keyring " << g_conf->keyring << dendl;
+ return r;
+ }
}
admin_hook = new AdminHook(this);
AdminSocket* admin_socket = cct->get_admin_socket();
- int r = admin_socket->register_command("mon_status", admin_hook,
- "show current monitor status");
+ r = admin_socket->register_command("mon_status", admin_hook,
+ "show current monitor status");
assert(r == 0);
r = admin_socket->register_command("quorum_status", admin_hook,
"show current quorum status");
bootstrap();
lock.Unlock();
+ return 0;
}
void Monitor::register_cluster_logger()
derr << "unable to load initial keyring " << g_conf->keyring << dendl;
return r;
}
+
+ // put mon. key in external keyring; seed with everything else.
+ extract_save_mon_key(keyring);
+
bufferlist keyringbl;
- ::encode(keyring, keyringbl);
+ keyring.encode_plaintext(keyringbl);
store->put_bl_ss(keyringbl, "mkfs", "keyring");
return 0;
}
+void Monitor::extract_save_mon_key(KeyRing& keyring)
+{
+ EntityName mon_name;
+ mon_name.set_type(CEPH_ENTITY_TYPE_MON);
+ EntityAuth mon_key;
+ if (keyring.get_auth(mon_name, mon_key)) {
+ dout(10) << "extract_save_mon_key moving mon. key to separate keyring" << dendl;
+ KeyRing pkey;
+ pkey.add(mon_name, mon_key);
+ bufferlist bl;
+ pkey.encode_plaintext(bl);
+ store->put_bl_ss(bl, "keyring", NULL);
+ keyring.remove(mon_name);
+ }
+}
+
bool Monitor::ms_get_authorizer(int service_id, AuthAuthorizer **authorizer, bool force_new)
{
dout(10) << "ms_get_authorizer for " << ceph_entity_type_name(service_id) << dendl;
#include "auth/cephx/CephxKeyServer.h"
#include "auth/AuthSupported.h"
+#include "auth/KeyRing.h"
#include "perfglue/heap_profiler.h"
MonMap *monmap;
LogClient clog;
+ KeyRing keyring;
KeyServer key_server;
AuthSupported auth_supported;
bool ms_handle_reset(Connection *con);
void ms_handle_remote_reset(Connection *con) {}
+ void extract_save_mon_key(KeyRing& keyring);
+
public:
Monitor(CephContext *cct_, string nm, MonitorStore *s, Messenger *m, MonMap *map);
~Monitor();
- void init();
+ int init();
void shutdown();
void tick();