buffet: Add the ability to change command visibility

Now it is possible to change the visibility of command and make it
visible to cloud only, local only, both or none.

BUG=brillo:797
TEST=`FEATURES=test emerge-link buffet`

Change-Id: I81d526b3d43adf5d6cd03a4e31a31e1494ff5c1b
Reviewed-on: https://chromium-review.googlesource.com/266396
Trybot-Ready: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index 1c930a4..675b4dc 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -20,6 +20,7 @@
 #include <chromeos/dbus/data_serialization.h>
 #include <chromeos/dbus/dbus_method_invoker.h>
 #include <chromeos/errors/error.h>
+#include <chromeos/strings/string_utils.h>
 #include <chromeos/variant_dictionary.h>
 #include <dbus/bus.h>
 #include <dbus/message.h>
@@ -45,6 +46,7 @@
   - UpdateState prop_name prop_value
   - GetState
   - PendingCommands
+  - SetCommandVisibility pkg1.cmd1[,pkg2.cm2,...] [all|cloud|local|none]
 )");
 }
 
@@ -227,6 +229,12 @@
           base::Bind(&Daemon::CallGetPendingCommands,
                      weak_factory_.GetWeakPtr()),
           base::TimeDelta::FromMilliseconds(100));
+    } else if (command.compare("SetCommandVisibility") == 0 ||
+               command.compare("cv") == 0) {
+      if (!CheckArgs(command, args, 2))
+        return EX_USAGE;
+      job = base::Bind(&Daemon::CallSetCommandVisibility,
+                       weak_factory_.GetWeakPtr(), args.front(), args.back());
     } else {
       fprintf(stderr, "Unknown command: '%s'\n", command.c_str());
       return EX_USAGE;
@@ -374,6 +382,18 @@
     OnJobComplete();
   }
 
+  void CallSetCommandVisibility(const std::string& command_list,
+                                    const std::string& visibility,
+                                    ManagerProxy* manager_proxy) {
+    ErrorPtr error;
+    std::vector<std::string> commands =
+        chromeos::string_utils::Split(command_list, ",", true, true);
+    if (!manager_proxy->SetCommandVisibility(commands, visibility, &error)) {
+      return ReportError(error.get());
+    }
+    OnJobComplete();
+  }
+
   std::unique_ptr<org::chromium::Buffet::ObjectManagerProxy> object_manager_;
   int exit_code_{EX_OK};
   base::CancelableCallback<void()> timeout_task_;