/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.ambari.shell;
import org.apache.ambari.groovy.client.AmbariClient;
import org.apache.ambari.shell.model.AmbariContext;
import org.apache.ambari.shell.model.Hints;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.shell.CommandLine;
import org.springframework.shell.core.JLineShellComponent;
import org.springframework.shell.event.ShellStatus;
import org.springframework.shell.event.ShellStatusListener;
/**
* Shell bootstrap.
*/
@Configuration
@ComponentScan(basePackageClasses = {AmbariShell.class})
public class AmbariShell implements CommandLineRunner, ShellStatusListener {
@Autowired
private CommandLine commandLine;
@Autowired
private JLineShellComponent shell;
@Autowired
private AmbariContext context;
@Autowired
private AmbariClient client;
@Override
public void run(String... arg) throws Exception {
String[] shellCommandsToExecute = commandLine.getShellCommandsToExecute();
if (shellCommandsToExecute != null) {
for (String cmd : shellCommandsToExecute) {
if (!shell.executeScriptLine(cmd)) {
break;
}
}
} else {
shell.addShellStatusListener(this);
shell.start();
shell.promptLoop();
shell.waitForComplete();
}
}
@Override
public void onShellStatusChange(ShellStatus oldStatus, ShellStatus newStatus) {
if (newStatus.getStatus() == ShellStatus.Status.STARTED) {
try {
String cluster = client.getClusterName();
boolean available = client.isBlueprintAvailable();
if (cluster == null) {
if (available) {
context.setHint(Hints.BUILD_CLUSTER);
} else {
context.setHint(Hints.ADD_BLUEPRINT);
}
} else {
context.setHint(Hints.PROGRESS);
}
context.setCluster(cluster);
context.setBlueprintsAvailable(available);
} catch (Exception e) {
System.out.println(e.getMessage());
shell.executeCommand("quit");
}
}
}
public static void main(String[] args) {
if (args.length == 0) {
System.out.println(
"\nAmbari Shell: Interactive command line tool for managing Apache Ambari.\n\n" +
"Usage:\n" +
" java -jar ambari-shell.jar : Starts Ambari Shell in interactive mode.\n" +
" java -jar ambari-shell.jar --cmdfile=<FILE> : Ambari Shell executes commands read from the file.\n\n" +
"Options:\n" +
" --ambari.host=<HOSTNAME> Hostname of the Ambari Server [default: localhost].\n" +
" --ambari.port=<PORT> Port of the Ambari Server [default: 8080].\n" +
" --ambari.user=<USER> Username of the Ambari admin [default: admin].\n" +
" --ambari.password=<PASSWORD> Password of the Ambari admin [default: admin].\n\n" +
"Note:\n" +
" At least one option is mandatory."
);
System.exit(1);
}
new SpringApplicationBuilder(AmbariShell.class).showBanner(false).run(args);
}
}