map<string,bufferlist> caps;
std::string fn;
- global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY,
- CINIT_FLAG_NO_DEFAULT_CONFIG_FILE);
- std::vector<const char*>::iterator i;
- for (i = args.begin(); i != args.end(); ) {
- std::string val;
- if (ceph_argparse_double_dash(args, i)) {
- break;
- } else if (ceph_argparse_flag(args, i, "-g", "--gen-key", (char*)NULL)) {
- gen_key = true;
- } else if (ceph_argparse_flag(args, i, "--gen-print-key", (char*)NULL)) {
- gen_print_key = true;
- } else if (ceph_argparse_witharg(args, i, &val, "-a", "--add-key", (char*)NULL)) {
- add_key = val;
- } else if (ceph_argparse_flag(args, i, "-l", "--list", (char*)NULL)) {
- list = true;
- } else if (ceph_argparse_witharg(args, i, &val, "--caps", (char*)NULL)) {
- caps_fn = val;
- } else if (ceph_argparse_witharg(args, i, &val, "--cap", (char*)NULL)) {
- std::string my_key = val;
- if (i == args.end()) {
- cerr << "must give two arguments to --cap: key and val." << std::endl;
- exit(1);
+ try {
+ global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY,
+ CINIT_FLAG_NO_DEFAULT_CONFIG_FILE);
+ std::vector<const char*>::iterator i;
+ for (i = args.begin(); i != args.end(); ) {
+ std::string val;
+ if (ceph_argparse_double_dash(args, i)) {
+ break;
+ } else if (ceph_argparse_flag(args, i, "-g", "--gen-key", (char*)NULL)) {
+ gen_key = true;
+ } else if (ceph_argparse_flag(args, i, "--gen-print-key", (char*)NULL)) {
+ gen_print_key = true;
+ } else if (ceph_argparse_witharg(args, i, &val, "-a", "--add-key", (char*)NULL)) {
+ add_key = val;
+ } else if (ceph_argparse_flag(args, i, "-l", "--list", (char*)NULL)) {
+ list = true;
+ } else if (ceph_argparse_witharg(args, i, &val, "--caps", (char*)NULL)) {
+ caps_fn = val;
+ } else if (ceph_argparse_witharg(args, i, &val, "--cap", (char*)NULL)) {
+ std::string my_key = val;
+ if (i == args.end()) {
+ cerr << "must give two arguments to --cap: key and val." << std::endl;
+ exit(1);
+ }
+ std::string my_val = *i;
+ ++i;
+ ::encode(my_val, caps[my_key]);
+ } else if (ceph_argparse_flag(args, i, "-p", "--print-key", (char*)NULL)) {
+ print_key = true;
+ } else if (ceph_argparse_flag(args, i, "-C", "--create-keyring", (char*)NULL)) {
+ create_keyring = true;
+ } else if (ceph_argparse_witharg(args, i, &val, "--import-keyring", (char*)NULL)) {
+ import_keyring = val;
+ } else if (ceph_argparse_witharg(args, i, &val, "-u", "--set-uid", (char*)NULL)) {
+ std::string err;
+ auid = strict_strtoll(val.c_str(), 10, &err);
+ if (!err.empty()) {
+ cerr << "error parsing UID: " << err << std::endl;
+ exit(1);
+ }
+ set_auid = true;
+ } else if (fn.empty()) {
+ fn = *i++;
+ } else {
+ cerr << argv[0] << ": unexpected '" << *i << "'" << std::endl;
+ usage();
}
- std::string my_val = *i;
- ++i;
- ::encode(my_val, caps[my_key]);
- } else if (ceph_argparse_flag(args, i, "-p", "--print-key", (char*)NULL)) {
- print_key = true;
- } else if (ceph_argparse_flag(args, i, "-C", "--create-keyring", (char*)NULL)) {
- create_keyring = true;
- } else if (ceph_argparse_witharg(args, i, &val, "--import-keyring", (char*)NULL)) {
- import_keyring = val;
- } else if (ceph_argparse_witharg(args, i, &val, "-u", "--set-uid", (char*)NULL)) {
+ }
+ if (fn.empty() && !gen_print_key) {
+ cerr << argv[0] << ": must specify filename" << std::endl;
+ usage();
+ }
+ if (!(gen_key ||
+ gen_print_key ||
+ !add_key.empty() ||
+ list ||
+ !caps_fn.empty() ||
+ !caps.empty() ||
+ set_auid ||
+ print_key ||
+ create_keyring ||
+ !import_keyring.empty())) {
+ cerr << "no command specified" << std::endl;
+ usage();
+ }
+ if (gen_key && (!add_key.empty())) {
+ cerr << "can't both gen_key and add_key" << std::endl;
+ usage();
+ }
+
+ common_init_finish(g_ceph_context);
+ EntityName ename(g_conf->name);
+
+ if (gen_print_key) {
+ CryptoKey key;
+ key.create(g_ceph_context, CEPH_CRYPTO_AES);
+ cout << key << std::endl;
+ return 0;
+ }
+
+ // keyring --------
+ bool modified = false;
+ KeyRing keyring;
+
+ bufferlist bl;
+ int r = 0;
+ if (create_keyring) {
+ cout << "creating " << fn << std::endl;
+ modified = true;
+ } else {
std::string err;
- auid = strict_strtoll(val.c_str(), 10, &err);
- if (!err.empty()) {
- cerr << "error parsing UID: " << err << std::endl;
- exit(1);
+ r = bl.read_file(fn.c_str(), &err);
+ if (r >= 0) {
+ try {
+ bufferlist::iterator iter = bl.begin();
+ ::decode(keyring, iter);
+ } catch (const buffer::error &err) {
+ cerr << "error reading file " << fn << std::endl;
+ exit(1);
+ }
+ } else {
+ cerr << "can't open " << fn << ": " << err << std::endl;
+ exit(1);
}
- set_auid = true;
- } else if (fn.empty()) {
- fn = *i++;
- } else {
- cerr << argv[0] << ": unexpected '" << *i << "'" << std::endl;
- usage();
}
- }
- if (fn.empty() && !gen_print_key) {
- cerr << argv[0] << ": must specify filename" << std::endl;
- usage();
- }
- if (!(gen_key ||
- gen_print_key ||
- !add_key.empty() ||
- list ||
- !caps_fn.empty() ||
- !caps.empty() ||
- set_auid ||
- print_key ||
- create_keyring ||
- !import_keyring.empty())) {
- cerr << "no command specified" << std::endl;
- usage();
- }
- if (gen_key && (!add_key.empty())) {
- cerr << "can't both gen_key and add_key" << std::endl;
- usage();
- }
-
- common_init_finish(g_ceph_context);
- EntityName ename(g_conf->name);
-
- if (gen_print_key) {
- CryptoKey key;
- key.create(g_ceph_context, CEPH_CRYPTO_AES);
- cout << key << std::endl;
- return 0;
- }
-
- // keyring --------
- bool modified = false;
- KeyRing keyring;
-
- bufferlist bl;
- int r = 0;
- if (create_keyring) {
- cout << "creating " << fn << std::endl;
- modified = true;
- } else {
- std::string err;
- r = bl.read_file(fn.c_str(), &err);
- if (r >= 0) {
- try {
- bufferlist::iterator iter = bl.begin();
- ::decode(keyring, iter);
- } catch (const buffer::error &err) {
- cerr << "error reading file " << fn << std::endl;
- exit(1);
+
+ // write commands
+ if (!import_keyring.empty()) {
+ KeyRing other;
+ bufferlist obl;
+ std::string err;
+ int r = obl.read_file(import_keyring.c_str(), &err);
+ if (r >= 0) {
+ try {
+ bufferlist::iterator iter = obl.begin();
+ ::decode(other, iter);
+ } catch (const buffer::error &err) {
+ cerr << "error reading file " << import_keyring << std::endl;
+ exit(1);
+ }
+
+ cout << "importing contents of " << import_keyring << " into " << fn << std::endl;
+ //other.print(cout);
+ keyring.import(g_ceph_context, other);
+ modified = true;
+ } else {
+ cerr << "can't open " << import_keyring << ": " << err << std::endl;
+ exit(1);
}
- } else {
- cerr << "can't open " << fn << ": " << err << std::endl;
- exit(1);
}
- }
-
- // write commands
- if (!import_keyring.empty()) {
- KeyRing other;
- bufferlist obl;
- std::string err;
- int r = obl.read_file(import_keyring.c_str(), &err);
- if (r >= 0) {
+ if (gen_key) {
+ EntityAuth eauth;
+ eauth.key.create(g_ceph_context, CEPH_CRYPTO_AES);
+ keyring.add(ename, eauth);
+ modified = true;
+ }
+ if (!add_key.empty()) {
+ EntityAuth eauth;
try {
- bufferlist::iterator iter = obl.begin();
- ::decode(other, iter);
+ eauth.key.decode_base64(add_key);
} catch (const buffer::error &err) {
- cerr << "error reading file " << import_keyring << std::endl;
- exit(1);
+ cerr << "can't decode key '" << add_key << "'" << std::endl;
+ exit(1);
}
-
- cout << "importing contents of " << import_keyring << " into " << fn << std::endl;
- //other.print(cout);
- keyring.import(g_ceph_context, other);
+ keyring.add(ename, eauth);
modified = true;
- } else {
- cerr << "can't open " << import_keyring << ": " << err << std::endl;
- exit(1);
+ cout << "added entity " << ename << " auth " << eauth << std::endl;
}
- }
- if (gen_key) {
- EntityAuth eauth;
- eauth.key.create(g_ceph_context, CEPH_CRYPTO_AES);
- keyring.add(ename, eauth);
- modified = true;
- }
- if (!add_key.empty()) {
- EntityAuth eauth;
- try {
- eauth.key.decode_base64(add_key);
- } catch (const buffer::error &err) {
- cerr << "can't decode key '" << add_key << "'" << std::endl;
- exit(1);
+ if (!caps_fn.empty()) {
+ ConfFile cf;
+ std::deque<std::string> parse_errors;
+ if (cf.parse_file(caps_fn, &parse_errors, &cerr) != 0) {
+ cerr << "could not parse caps file " << caps_fn << std::endl;
+ exit(1);
+ }
+ complain_about_parse_errors(g_ceph_context, &parse_errors);
+ map<string, bufferlist> caps;
+ const char *key_names[] = { "mon", "osd", "mds", NULL };
+ for (int i=0; key_names[i]; i++) {
+ std::string val;
+ if (cf.read("global", key_names[i], val) == 0) {
+ bufferlist bl;
+ ::encode(val, bl);
+ string s(key_names[i]);
+ caps[s] = bl;
+ }
+ }
+ keyring.set_caps(ename, caps);
+ modified = true;
}
- keyring.add(ename, eauth);
- modified = true;
- cout << "added entity " << ename << " auth " << eauth << std::endl;
- }
- if (!caps_fn.empty()) {
- ConfFile cf;
- std::deque<std::string> parse_errors;
- if (cf.parse_file(caps_fn, &parse_errors, &cerr) != 0) {
- cerr << "could not parse caps file " << caps_fn << std::endl;
- exit(1);
+ if (!caps.empty()) {
+ keyring.set_caps(ename, caps);
+ modified = true;
}
- complain_about_parse_errors(g_ceph_context, &parse_errors);
- map<string, bufferlist> caps;
- const char *key_names[] = { "mon", "osd", "mds", NULL };
- for (int i=0; key_names[i]; i++) {
- std::string val;
- if (cf.read("global", key_names[i], val) == 0) {
- bufferlist bl;
- ::encode(val, bl);
- string s(key_names[i]);
- caps[s] = bl;
- }
+ if (set_auid) {
+ keyring.set_uid(ename, auid);
+ modified = true;
}
- keyring.set_caps(ename, caps);
- modified = true;
- }
- if (!caps.empty()) {
- keyring.set_caps(ename, caps);
- modified = true;
- }
- if (set_auid) {
- keyring.set_uid(ename, auid);
- modified = true;
- }
-
- // read commands
- if (list) {
- try {
- keyring.print(cout);
- } catch (ceph::buffer::end_of_buffer &eob) {
- cout << "Exception (end_of_buffer) in print(), exit." << std::endl;
- exit(1);
+
+ // read commands
+ if (list) {
+ try {
+ keyring.print(cout);
+ } catch (ceph::buffer::end_of_buffer &eob) {
+ cout << "Exception (end_of_buffer) in print(), exit." << std::endl;
+ exit(1);
+ }
}
- }
- if (print_key) {
- CryptoKey key;
- if (keyring.get_secret(ename, key)) {
- cout << key << std::endl;
- } else {
- cerr << "entity " << ename << " not found" << std::endl;
+ if (print_key) {
+ CryptoKey key;
+ if (keyring.get_secret(ename, key)) {
+ cout << key << std::endl;
+ } else {
+ cerr << "entity " << ename << " not found" << std::endl;
+ }
}
- }
-
- // write result?
- if (modified) {
- bufferlist bl;
- keyring.encode_plaintext(bl);
- r = bl.write_file(fn.c_str(), 0600);
- if (r < 0) {
- cerr << "could not write " << fn << std::endl;
+
+ // write result?
+ if (modified) {
+ bufferlist bl;
+ keyring.encode_plaintext(bl);
+ r = bl.write_file(fn.c_str(), 0600);
+ if (r < 0) {
+ cerr << "could not write " << fn << std::endl;
+ }
+ //cout << "wrote " << bl.length() << " bytes to " << fn << std::endl;
}
- //cout << "wrote " << bl.length() << " bytes to " << fn << std::endl;
- }
-
+ } catch (ceph::FailedAssertion &a) {
+ cout << "Failed assert, exit." << std::endl;
+ exit(1);
+ }
return 0;
}