crash
CRaSH remote shell: connect and monitor JVM resources via HTTP, SSH or telnet.</a>
dependency
<dependency>
<groupId>org.jooby</groupId>
<artifactId>jooby-crash</artifactId>
<version>1.6.6</version>
</dependency>
usage
import org.jooby.crash;
{
use(new Crash());
}
Just drop your commands in the cmd
folder and CRaSH will pick up all them.
Now let’s see how to connect and interact with the CRaSH shell.
connectors
HTTP connector
The HTTP connector is a simple yet powerful collection of HTTP endpoints where you can run a CRaSH command:
{
use(new Crash()
.plugin(HttpShellPlugin.class)
);
}
Try it:
GET /api/shell/thread/ls
OR:
GET /api/shell/thread ls
The connector is listening at /api/shell
. If you want to mount the connector some where else just set the property: crash.httpshell.path
.
SSH connector
Just add the crash.connectors.ssh dependency to your project.
Try it:
ssh -p 2000 admin@localhost
Default user and password is: admin
. See how to provide a custom authentication plugin.
telnet connector
Just add the crash.connectors.telnet dependency to your project.
Try it:
telnet localhost 5000
Checkout complete telnet connector configuration.
web connector
Just add the crash.connectors.web dependency to your project.
Try it:
GET /shell
A web shell console will be ready to go at /shell
. If you want to mount the connector some where else just set the property: crash.webshell.path
.
commands
You can write additional shell commands using Groovy or Java, see the CRaSH documentation for details. CRaSH search for commands in the cmd
folder.
Here is a simple ‘hello’ command that could be loaded from cmd/hello.groovy
folder:
package commands
import org.crsh.cli.Command
import org.crsh.cli.Usage
import org.crsh.command.InvocationContext
class hello {
@Usage("Say Hello")
@Command
def main(InvocationContext context) {
return "Hello"
}
}
Jooby adds some additional attributes and commands to InvocationContext
that you can access from your command:
- registry: Access to Registry.
- conf: Access to
Config
.
Example:
package commands
import org.crsh.cli.Command
import org.crsh.cli.Usage
import org.crsh.command.InvocationContext
class HelloMyService {
@Usage("MySerivce.doSomething")
@Command
def execute(InvocationContext context) {
def registry = context.registry
return registry.require(MySerivce.class).doSomething()
}
}
routes command
The routes
print all the application routes.
dev> routes
order method pattern consumes produces name source
-------------------------------------------------------------------------------------------------
0 GET /shell/css/** [*/*] [*/*] /anonymous org.jooby.crash.WebShellPlugin:41
0 GET /shell/js/** [*/*] [*/*] /anonymous org.jooby.crash.WebShellPlugin:42
0 GET /shell [*/*] [*/*] /anonymous org.jooby.crash.WebShellPlugin:45
0 GET /api/shell/{cmd:.*} [*/*] [*/*] /anonymous org.jooby.crash.HttpShellPlugin:43
0 * {before}/path [*/*] [*/*] /anonymous app.CrashApp:21
0 * {after}/path [*/*] [*/*] /anonymous app.CrashApp:24
0 * {complete}/path [*/*] [*/*] /anonymous app.CrashApp:28
0 GET / [*/*] [*/*] /anonymous app.CrashApp:31
method pattern consumes produces
-------------------------------------------------
WS /shell application/json application/json
conf command
The conf tree
print the application configuration tree (configuration precedence):
dev> conf tree
merge of system properties
org/jooby/crash/crash.conf @ file:/jooby-crash/target/classes/org/jooby/crash/crash.conf
org/jooby/spi/server.conf @ file:/jooby-netty/target/classes/org/jooby/spi/server.conf
org/jooby/mime.properties @ file:/jooby/target/classes/org/jooby/mime.properties
org/jooby/jooby.conf @ file:/jooby/target/classes/org/jooby/jooby.conf: 1
The conf props [path]
print all the application properties, sub-tree or a single property if path
argument is present.
dev> conf props
name value
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mime.pgn application/x-chess-pgn
os.version 10.11.6
mime.ttf font/truetype
err.java.io.FileNotFoundException 404
sun.cpu.isalist
mime.wtls-ca-certificate application/vnd.wap.wtls-ca-certificate
mime.texinfo application/x-texinfo
runtime.concurrencyLevel 8
.....
dev> conf props application
name value
--------------------------------------------------------------------------------
application.tmpdir /var/folders/9l/fyb_j4l553z6ql4443yttbj40000gn/T/app
application.version 0.0.0
application.ns app
application.port 8080
application.charset UTF-8
application.redirect_https
application.class app.CrashApp
application.tz America/Argentina/Buenos_Aires
application.numberFormat #,##0.###
application.dateFormat dd-MMM-yyyy
application.env dev
application.host localhost
application.name app
application.path /
application.lang en-US
dev> conf props application.port
name value
-----------------------
application.port 8080
fancy banner
Just add the jooby-banner to your project and all the CRaSH
shell will use it.
{
use(new Banner("crash me!"));
use(new Crash());
}
telnet localhost 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
_____ _____
__________________ __________ /_ ______ ___ ____ __ /
___/_ ___/ __ `/_ ___/_ __ \ _ __ `__ \ _ \_ /
/__ / /_/ / (__ ) / / / / / / / / __//_/
___/ _/ __,_/ ____/ _/ /_/ _/ /_/ /_/ ___/ _) v0.0.0
dev>
Simple and easy!!