Rename spring-boot-starter-shell-crsh to spring-boot-starter-shell-remote
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package crash.commands.base;
|
||||
|
||||
import org.crsh.cli.Command;
|
||||
import org.crsh.cli.Usage;
|
||||
import org.crsh.command.BaseCommand;
|
||||
import org.crsh.command.DescriptionFormat;
|
||||
import org.crsh.command.InvocationContext;
|
||||
import org.crsh.command.ShellCommand;
|
||||
import org.crsh.shell.impl.command.CRaSH;
|
||||
import org.crsh.text.Color;
|
||||
import org.crsh.text.Decoration;
|
||||
import org.crsh.text.Style;
|
||||
import org.crsh.text.ui.LabelElement;
|
||||
import org.crsh.text.ui.RowElement;
|
||||
import org.crsh.text.ui.TableElement;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/** @author Julien Viet */
|
||||
public class help extends BaseCommand {
|
||||
|
||||
@Usage("provides basic help")
|
||||
@Command
|
||||
public void main(InvocationContext<Object> context) throws IOException {
|
||||
|
||||
//
|
||||
TableElement table = new TableElement().rightCellPadding(1);
|
||||
table.add(
|
||||
new RowElement().
|
||||
add(new LabelElement("NAME").style(Style.style(Decoration.bold))).
|
||||
add(new LabelElement("DESCRIPTION")));
|
||||
|
||||
//
|
||||
CRaSH crash = (CRaSH)context.getSession().get("crash");
|
||||
Iterable<String> names = crash.getCommandNames();
|
||||
for (String name : names) {
|
||||
try {
|
||||
ShellCommand cmd = crash.getCommand(name);
|
||||
if (cmd != null) {
|
||||
String desc = cmd.describe(name, DescriptionFormat.DESCRIBE);
|
||||
if (desc == null) {
|
||||
desc = "";
|
||||
}
|
||||
table.add(
|
||||
new RowElement().
|
||||
add(new LabelElement(name).style(Style.style(Color.red))).
|
||||
add(new LabelElement(desc)));
|
||||
}
|
||||
} catch (Exception ignore) {
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
context.provide(new LabelElement("Try one of these commands with the -h or --help switch:\n"));
|
||||
context.provide(table);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
package crash.commands.base;
|
||||
|
||||
import org.crsh.cli.Argument;
|
||||
import org.crsh.cli.Command;
|
||||
import org.crsh.cli.Option;
|
||||
import org.crsh.cli.Usage;
|
||||
import org.crsh.command.BaseCommand;
|
||||
import org.crsh.command.InvocationContext;
|
||||
import org.crsh.command.PipeCommand;
|
||||
import org.crsh.command.ScriptException;
|
||||
|
||||
import javax.management.JMException;
|
||||
import javax.management.MBeanAttributeInfo;
|
||||
import javax.management.MBeanInfo;
|
||||
import javax.management.MBeanServer;
|
||||
import javax.management.ObjectInstance;
|
||||
import javax.management.ObjectName;
|
||||
import java.io.IOException;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/** @author Julien Viet */
|
||||
@Usage("Java Management Extensions")
|
||||
public class jmx extends BaseCommand {
|
||||
|
||||
@Usage("find mbeans")
|
||||
@Command
|
||||
public void find(
|
||||
InvocationContext<ObjectName> context,
|
||||
@Usage("The object name pattern")
|
||||
@Option(names=["p", "pattern"])
|
||||
String pattern) throws Exception {
|
||||
|
||||
//
|
||||
ObjectName patternName = pattern != null ? ObjectName.getInstance(pattern) : null;
|
||||
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
|
||||
Set<ObjectInstance> instances = server.queryMBeans(patternName, null);
|
||||
for (ObjectInstance instance : instances) {
|
||||
context.provide(instance.getObjectName());
|
||||
}
|
||||
/*
|
||||
if (context.piped) {
|
||||
} else {
|
||||
UIBuilder ui = new UIBuilder()
|
||||
ui.table(columns: [1,3]) {
|
||||
row(bold: true, fg: black, bg: white) {
|
||||
label("CLASS NAME"); label("OBJECT NAME")
|
||||
}
|
||||
instances.each { instance ->
|
||||
row() {
|
||||
label(foreground: red, instance.getClassName()); label(instance.objectName)
|
||||
}
|
||||
}
|
||||
}
|
||||
out << ui;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@Command
|
||||
@Usage("return the attributes info of an MBean")
|
||||
public void attributes(InvocationContext<Map> context, @Argument ObjectName name) throws IOException {
|
||||
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
|
||||
try {
|
||||
MBeanInfo info = server.getMBeanInfo(name);
|
||||
for (MBeanAttributeInfo attributeInfo : info.getAttributes()) {
|
||||
HashMap<String, Object> tuple = new HashMap<String, Object>();
|
||||
tuple.put("name", attributeInfo.getName());
|
||||
tuple.put("type", attributeInfo.getType());
|
||||
tuple.put("description", attributeInfo.getDescription());
|
||||
context.provide(tuple);
|
||||
}
|
||||
}
|
||||
catch (JMException e) {
|
||||
throw new ScriptException("Could not access MBean meta data", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Usage("get attributes of an MBean")
|
||||
@Command
|
||||
public PipeCommand<ObjectName, Map> get(@Argument final List<String> attributes) {
|
||||
|
||||
// Determine common attributes from all names
|
||||
if (attributes == null || attributes.isEmpty()) {
|
||||
throw new ScriptException("Must provide JMX attributes");
|
||||
}
|
||||
|
||||
//
|
||||
return new PipeCommand<ObjectName, Map>() {
|
||||
|
||||
/** . */
|
||||
private MBeanServer server;
|
||||
|
||||
@Override
|
||||
public void open() throws ScriptException {
|
||||
server = ManagementFactory.getPlatformMBeanServer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void provide(ObjectName name) throws IOException {
|
||||
try {
|
||||
HashMap<String, Object> tuple = new HashMap<String, Object>();
|
||||
for (String attribute : attributes) {
|
||||
String prop = name.getKeyProperty(attribute);
|
||||
if (prop != null) {
|
||||
tuple.put(attribute, prop);
|
||||
}
|
||||
else {
|
||||
tuple.put(attribute, server.getAttribute(name, attribute));
|
||||
}
|
||||
}
|
||||
context.provide(tuple);
|
||||
}
|
||||
catch (JMException ignore) {
|
||||
//
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
welcome = { ->
|
||||
def hostName;
|
||||
try {
|
||||
hostName = java.net.InetAddress.getLocalHost().getHostName();
|
||||
} catch (java.net.UnknownHostException ignore) {
|
||||
hostName = "localhost";
|
||||
}
|
||||
def version = crash.context.attributes.get("spring.boot.version")
|
||||
return """\
|
||||
. ____ _ __ _ _
|
||||
/\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\
|
||||
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
|
||||
\\\\/ ___)| |_)| | | | | || (_| | ) ) ) )
|
||||
' |____| .__|_| |_|_| |_\\__, | / / / /
|
||||
=========|_|==============|___/=/_/_/_/
|
||||
:: Spring Boot :: (v$version) on $hostName
|
||||
""";
|
||||
}
|
||||
|
||||
prompt = { ->
|
||||
return "> ";
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package commands
|
||||
|
||||
import org.crsh.text.ui.UIBuilder
|
||||
import org.springframework.boot.actuate.endpoint.MetricsEndpoint
|
||||
|
||||
class metrics {
|
||||
|
||||
@Usage("Display metrics provided by Spring Boot")
|
||||
@Command
|
||||
public void main(InvocationContext context) {
|
||||
|
||||
context.takeAlternateBuffer();
|
||||
try {
|
||||
while (!Thread.interrupted()) {
|
||||
out.cls()
|
||||
out.show(new UIBuilder().table(columns:[1]) {
|
||||
header {
|
||||
table(columns:[1], separator: dashed) {
|
||||
header(bold: true, fg: black, bg: white) { label("metrics"); }
|
||||
}
|
||||
}
|
||||
row {
|
||||
table(columns:[1, 1]) {
|
||||
header(bold: true, fg: black, bg: white) {
|
||||
label("NAME")
|
||||
label("VALUE")
|
||||
}
|
||||
|
||||
context.attributes['spring.beanfactory'].getBeansOfType(MetricsEndpoint.class).each { name, metrics ->
|
||||
metrics.invoke().each { k, v ->
|
||||
row {
|
||||
label(k)
|
||||
label(v)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
out.flush();
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
context.releaseAlternateBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user