tools: ndnsec-delete reports success or failure

Change-Id: I9b53fcc030fbca34acdf0c7dc3afc8ae8e8d523d
Refs: #2275
diff --git a/tools/ndnsec/delete.hpp b/tools/ndnsec/delete.hpp
index 629440f..bd871bc 100644
--- a/tools/ndnsec/delete.hpp
+++ b/tools/ndnsec/delete.hpp
@@ -32,12 +32,13 @@
   using namespace ndn;
   namespace po = boost::program_options;
 
-  // bool deleteId = true;
   bool isDeleteKey = false;
   bool isDeleteCert = false;
   std::string name;
 
-  po::options_description description("General Usage\n  ndnsec delete [-h] [-k|c] name\nGeneral options");
+  po::options_description description("General Usage\n"
+                                      "ndnsec delete [-h] [-k|c] name\n"
+                                      "General options");
   description.add_options()
     ("help,h", "produce help message")
     ("delete-key,k", "(Optional) delete a key if specified.")
@@ -53,57 +54,78 @@
   p.add("name", 1);
 
   po::variables_map vm;
-  try
-    {
-      po::store(po::command_line_parser(argc, argv).options(description).positional(p).run(),
-                vm);
-      po::notify(vm);
-    }
-  catch (const std::exception& e)
-    {
-      std::cerr << "ERROR: " << e.what() << std::endl;
-      std::cerr << description << std::endl;
-      return 1;
-    }
+  try {
+    po::store(po::command_line_parser(argc, argv).options(description).positional(p).run(),
+              vm);
+    po::notify(vm);
+  }
+  catch (const std::exception& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    std::cerr << description << std::endl;
+    return 2;
+  }
 
-  if (vm.count("help") != 0)
-    {
-      std::cerr << description << std::endl;;
-      return 0;
-    }
+  if (vm.count("help") != 0) {
+    std::cerr << description << std::endl;;
+    return 0;
+  }
 
-  if (vm.count("name") == 0)
-    {
-      std::cerr << "ERROR: name must be specified" << std::endl;
-      std::cerr << description << std::endl;
-      return 1;
-    }
+  if (vm.count("name") == 0) {
+    std::cerr << "ERROR: name must be specified" << std::endl;
+    std::cerr << description << std::endl;
+    return 2;
+  }
 
   if (vm.count("delete-cert") != 0 || vm.count("delete-cert2") != 0)
-    {
-      isDeleteCert = true;
-      // deleteId = false;
-    }
+    isDeleteCert = true;
+
   else if (vm.count("delete-key") != 0 || vm.count("delete-key2") != 0)
-    {
-      isDeleteKey = true;
-      // deleteId = false;
-    }
+    isDeleteKey = true;
 
   KeyChain keyChain;
 
-  if (isDeleteCert)
-    {
+  try {
+    if (isDeleteCert) {
+      if (!keyChain.doesCertificateExist(name)) {
+        std::cerr << "ERROR: Certificate does not exist: " << name << std::endl;
+        return 1;
+      }
+
       keyChain.deleteCertificate(name);
+      std::cerr << "OK: Delete certificate: " << name << std::endl;
     }
-  else if (isDeleteKey)
-    {
+    else if (isDeleteKey) {
+      if (!keyChain.doesPublicKeyExist(name) &&
+          !keyChain.doesKeyExistInTpm(name, KEY_CLASS_PRIVATE)) {
+        std::cerr << "ERROR: Key does not exist: " << name << std::endl;
+        return 1;
+      }
+
       keyChain.deleteKey(name);
+      std::cerr << "OK: Delete key: " << name << std::endl;
     }
-  else
-    {
+    else {
+      if (!keyChain.doesIdentityExist(name)) {
+        std::cerr << "ERROR: Identity does not exist: " << name << std::endl;
+        return 1;
+      }
+
       keyChain.deleteIdentity(name);
+      std::cerr << "OK: Delete identity: " << name << std::endl;
     }
+  }
+  catch (const SecPublicInfo::Error& e) {
+    std::cerr << "ERROR: Cannot delete the item: " << e.what() << std::endl;
+    return 2;
+  }
+  catch (const SecTpm::Error& e) {
+    std::cerr << "ERROR: Cannot delete the item: " << e.what() << std::endl;
+    return 2;
+  }
+  catch (const KeyChain::Error& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    return 2;
+  }
 
   return 0;
 }