mirror of
https://github.com/tennc/webshell
synced 2024-11-29 22:50:18 +00:00
125 lines
2.9 KiB
Text
125 lines
2.9 KiB
Text
|
package enigma.shells.jython;
|
||
|
|
||
|
import java.io.*;
|
||
|
import java.awt.*;
|
||
|
import javax.swing.*;
|
||
|
|
||
|
import enigma.console.*;
|
||
|
import enigma.console.java2d.*;
|
||
|
|
||
|
import org.python.core.*;
|
||
|
import org.python.util.*;
|
||
|
|
||
|
public class JythonShell extends JPanel implements Runnable {
|
||
|
public static int DEFAULT_ROWS = 20;
|
||
|
public static int DEFAULT_COLUMNS = 80;
|
||
|
public static int DEFAULT_SCROLLBACK = 100;
|
||
|
|
||
|
public PrintStream out;
|
||
|
|
||
|
public Console console;
|
||
|
public Java2DTextWindow text;
|
||
|
public JScrollPane scrollPane;
|
||
|
public PythonInterpreter interp;
|
||
|
|
||
|
private Color colorBackground = new Color(0, 0, 0);
|
||
|
private Color colorForeground = new Color(187, 187, 187);
|
||
|
private Color colorError = new Color(187, 0, 0);
|
||
|
private Color colorCursor = new Color(187, 187, 0);
|
||
|
|
||
|
public JythonShell() {
|
||
|
this(null, Py.getSystemState());
|
||
|
}
|
||
|
|
||
|
public JythonShell(PyObject dict) {
|
||
|
this(dict, Py.getSystemState());
|
||
|
}
|
||
|
|
||
|
public JythonShell(int columns, int rows, int scrollback) {
|
||
|
this(null, Py.getSystemState(), columns, rows, scrollback);
|
||
|
}
|
||
|
|
||
|
public JythonShell(PyObject dict, PySystemState systemState) {
|
||
|
this(dict, systemState, DEFAULT_COLUMNS, DEFAULT_ROWS, DEFAULT_SCROLLBACK);
|
||
|
}
|
||
|
|
||
|
public JythonShell(PyObject dict, PySystemState systemState, int columns, int rows, int scrollback) {
|
||
|
super(new BorderLayout());
|
||
|
|
||
|
text = new Java2DTextWindow(columns, rows, scrollback);
|
||
|
text.setBackground(colorBackground);
|
||
|
|
||
|
scrollPane = new JScrollPane();
|
||
|
scrollPane.setViewportView(text);
|
||
|
|
||
|
add(scrollPane, BorderLayout.CENTER);
|
||
|
|
||
|
console = new DefaultConsoleImpl(text);
|
||
|
out = console.getOutputStream();
|
||
|
|
||
|
interp = new PythonInterpreter(dict, systemState);
|
||
|
interp.setOut(out);
|
||
|
interp.setErr(out);
|
||
|
}
|
||
|
|
||
|
public void run() {
|
||
|
int pos = 0;
|
||
|
int tbs = 4;
|
||
|
|
||
|
String line = "";
|
||
|
String command = "";
|
||
|
|
||
|
for (;;) {
|
||
|
String space = "";
|
||
|
for (int i = 0; i < pos * tbs; i++) {
|
||
|
space += " ";
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
console.setTextAttributes(new TextAttributes(colorCursor));
|
||
|
|
||
|
if (pos > 0) {
|
||
|
out.print(space + "... ");
|
||
|
} else {
|
||
|
out.print(">> ");
|
||
|
}
|
||
|
|
||
|
console.setTextAttributes(new TextAttributes(colorForeground));
|
||
|
|
||
|
line = console.readLine().trim();
|
||
|
if (line.length() == 0 && pos > 0) {
|
||
|
pos--;
|
||
|
} else if (line.endsWith(":")) {
|
||
|
command += space + line + "\n";
|
||
|
pos++;
|
||
|
} else {
|
||
|
command += space + line + "\n";
|
||
|
}
|
||
|
|
||
|
if (pos == 0) {
|
||
|
interp.exec(command);
|
||
|
command = "";
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
console.setTextAttributes(new TextAttributes(colorError));
|
||
|
|
||
|
e.printStackTrace();
|
||
|
command = "";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void main(String[] argv) {
|
||
|
PySystemState.initialize(System.getProperties(), null, argv);
|
||
|
|
||
|
JFrame frame = new JFrame("Jython Console");
|
||
|
JythonShell console = new JythonShell();
|
||
|
|
||
|
frame.add(console, BorderLayout.CENTER);
|
||
|
frame.pack();
|
||
|
frame.setVisible(true);
|
||
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||
|
|
||
|
console.run();
|
||
|
}
|
||
|
}
|