From e4f35357efd805407d596dd06b27183f71aba046 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Fri, 8 Nov 2013 16:34:02 -0800 Subject: [PATCH] Add support for plugin root level command Completely generic plugins can be now created: @RequiresCapability( value = GlobalCapability.ADMINISTRATE_SERVER, scope = CapabilityScope.CORE) public class ShellCommand extends SshCommand { @Override protected void parseCommandLine(Object options) throws UnloggedFailure { // No op: turn off parsing utility } @Override protected void run() throws UnloggedFailure, IOException { String command = getName().substring(getPluginName().length() + 1); List c = Lists.newArrayListWithCapacity(getArguments().length + 1); c.add(command); c.addAll(Arrays.asList(getArguments())); ProcessBuilder proc = new ProcessBuilder(c); proc.start(); [...] } } SSH module is bound as: public class SshModule extends SingleCommandPluginModule { @Override protected void configure(LinkedBindingBuilder b) { b.to(ShellCommand.class); } } If the plugin above is deployed under sh.jar file in $site/plugins directory, generic commands can be called without specifing the actually SSH command: $ ssh gerrit sh ls -all -R $ ssh gerrit sh ps -a -ef Inspired-by: David Ostrovsky Change-Id: If0bdce5db82b436723090e17088923c44b5e11eb --- .../sshd/SingleCommandPluginModule.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java new file mode 100644 index 0000000000..0c5fca3e72 --- /dev/null +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java @@ -0,0 +1,45 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.sshd; + +import com.google.common.base.Preconditions; +import com.google.gerrit.extensions.annotations.PluginName; +import com.google.inject.binder.LinkedBindingBuilder; + +import org.apache.sshd.server.Command; + +import javax.inject.Inject; + +/** + * Binds one SSH command to the plugin name itself. + *

+ * Cannot be combined with {@link PluginCommandModule}. + */ +public abstract class SingleCommandPluginModule extends CommandModule { + private CommandName command; + + @Inject + void setPluginName(@PluginName String name) { + this.command = Commands.named(name); + } + + @Override + protected final void configure() { + Preconditions.checkState(command != null, "@PluginName must be provided"); + configure(bind(Commands.key(command))); + } + + protected abstract void configure(LinkedBindingBuilder bind); +}