| :linkattrs: | |
| = Gerrit Inspector | |
| == NAME | |
| Gerrit Inspector - Interactive Jython environment for Gerrit | |
| == SYNOPSIS | |
| [verse] | |
| -- | |
| _java_ -jar gerrit.war _daemon_ | |
| -d <SITE_PATH> | |
| [--enable-httpd | --disable-httpd] | |
| [--enable-sshd | --disable-sshd] | |
| [--console-log] | |
| [--replica] | |
| -s | |
| -- | |
| == DESCRIPTION | |
| Runs the Gerrit network daemon on the local system as described | |
| in the link:pgm-daemon.html[Daemon documentation], additionally | |
| starting an interactive Jython shell for inspection | |
| and troubleshooting of live data of the Gerrit instance. | |
| CAUTION: Gerrit Inspector works directly on instances of Java Virtual | |
| Machine objects and it is possible to read and write instance | |
| members as well as invoke Java functions. Access is granted | |
| also to 'private' and 'protected' members. Therefore it is possible | |
| to introduce changes to the internal state of the system in | |
| an inconsistent way. Care must be taken not to break the running system | |
| and/or destroy the data. | |
| == INSTALLATION | |
| Gerrit Inspector requires Jython library ('jython.jar') to be installed | |
| in the '$site_path/lib' directory. Jython, a Python interpreter for | |
| the Java Virtual Machine, can be obtained from the http://www.jython.org/[role=external,window=_blank] | |
| website. Only 'jython.jar' file is needed, installation of Jython libraries | |
| is optional. Gerrit Inspector has been tested with Jython 2.5.2 but | |
| might work an earlier version. | |
| == STARTUP | |
| During startup Jython examines Java libraries found on the classpath. | |
| While libraries are inspected a large amount of messages is displayed on the console: | |
| ---- | |
| *sys-package-mgr*: processing new jar, '/home/user/.gerritcodereview/tmp/gerrit_4890671371398741854_app/sshd-core-0.5.1-r1095809.jar' | |
| ---- | |
| After this a system-wide embedded initialization script is started. This script | |
| is contained in the gerrit's WAR archive. This script produces output similar to | |
| the following on the console: | |
| ---- | |
| "Shell" is "com.google.gerrit.pgm.shell.JythonShell@61644f2d" | |
| "m" is "com.google.gerrit.lifecycle.LifecycleManager@6f03b248" | |
| Welcome to the Gerrit Inspector | |
| Enter help() to see the above again, EOF to quit and stop Gerrit | |
| ---- | |
| Then an optional user startup script is processed. It should be | |
| located in the gerrit user home directory as '.gerritcodereview/Startup.py'. | |
| This script can access all variables defined in the system (such | |
| as the ones displayed by the initialization script as shown above). | |
| Variables and functions defined by the startup scripts are available for | |
| the interactive interpreter. | |
| When interactive interpreter exits (by issuing EOF on the command line), | |
| a whole Gerrit instance is shut down gracefully. | |
| == USING THE INTERPRETER | |
| Gerrit Inspector launches Jython interpreter in the context of the Gerrit | |
| Java Virtual Machine. All core facilities of the Jython (and Python) | |
| language are available to the user. | |
| Additional facilities can be provided, for example a 'Lib' directory from the | |
| Jython distribution can be installed under '$site_path/lib/Lib' to provide | |
| access to many standard Python modules. Jython can also use additional Java | |
| classes and libraries and most of the Python modules and scripts. | |
| The Inspector has by default access to classes and object instances available | |
| in the Java Virtual Machine. Objects are introspected and *private* and *protected* | |
| members are also available. | |
| For more information on using Jython, especially with regards to its limitations | |
| in interfacing to the Java Virtual Machine, please refer to the | |
| http://www.jython.org/[Jython documentation,role=external,window=_blank]. | |
| After successful initialization it is possible to examine components of | |
| Java packages, classes and live instances. | |
| ---- | |
| >>> import com.google.inject | |
| >>> dir(com.google.inject) | |
| ['AbstractModule', 'Binder', 'Binding', 'BindingAnnotation', 'ConfigurationException', 'CreationException', 'Exposed', 'Guice', 'ImplementedBy', 'Inject', 'Injector', 'Key', 'MembersInjector', 'Module', 'OutOfScopeException', 'PrivateBinder', 'PrivateModule', 'ProvidedBy', 'Provider', 'Provides', 'ProvisionException', 'Scope', 'ScopeAnnotation', 'Scopes', 'Singleton', 'Stage', 'TypeLiteral', '__name__', 'assistedinject', 'binder', 'internal', 'matcher', 'name', 'servlet', 'spi', 'util'] | |
| >>> type(com.google.inject) | |
| <type 'javapackage'> | |
| >>> dir(com.google.inject.Guice) | |
| ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', | |
| '__eq__', '__getattribute__', '__hash__', '__init__', '__ne__', | |
| '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', | |
| '__str__', '__unicode__', 'class', 'clone', 'createInjector', | |
| 'equals', 'finalize', 'getClass', 'hashCode', 'notify', 'notifyAll', | |
| 'registerNatives', 'toString', 'wait'] | |
| ---- | |
| A built-in *help()* function provides values of global variables | |
| defined in the interpreter: | |
| ---- | |
| >>> help() | |
| "m" is "com.google.gerrit.lifecycle.LifecycleManager@6f03b248" | |
| "Shell" is "com.google.gerrit.pgm.shell.JythonShell@61644f2d" | |
| "d" is "com.google.gerrit.pgm.Daemon@28a3f689" | |
| Welcome to the Gerrit Inspector | |
| Enter help() to see the above again, EOF to quit and stop Gerrit | |
| ---- | |
| Java and Python exceptions are intercepted by the Inspector: | |
| ---- | |
| >>> import java.lang.RuntimeException | |
| >>> raise java.lang.RuntimeException("Exiting") | |
| Traceback (most recent call last): | |
| File "<stdin>", line 1, in <module> | |
| at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) | |
| at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) | |
| at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) | |
| at java.lang.reflect.Constructor.newInstance(Constructor.java:532) | |
| at org.python.core.PyReflectedConstructor.constructProxy(PyReflectedConstructor.java:210) | |
| java.lang.RuntimeException: java.lang.RuntimeException: Exiting | |
| >>> | |
| ---- | |
| To exit the interpreter, use EOF character (Ctrl-D on Unix systems, Ctrl-Z on Windows). | |
| It is also possible to shut down the JVM by using *System.exit()* | |
| ---- | |
| >>> import java.lang.System | |
| >>> java.lang.System.exit(1) | |
| ---- | |
| And Gerrit should shut down all its subsystems and exit: | |
| ---- | |
| [2012-04-17 15:31:08,458] INFO com.google.gerrit.pgm.Daemon : caught shutdown, cleaning up | |
| ---- | |
| == TROUBLESHOOTING | |
| Gerrit Inspector is logging to the Gerrit error log. | |
| A successful startup is indicated in the logfile: | |
| ---- | |
| [2012-04-17 13:43:44,888] INFO com.google.gerrit.pgm.shell.JythonShell : Jython shell instance created. | |
| ---- | |
| If 'jython.jar' library is not available, Gerrit refuses to start when given *-s* option: | |
| ---- | |
| [2012-04-17 13:57:29,611] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon | |
| com.google.inject.ProvisionException: Guice provision errors: | |
| 1) Error injecting constructor, java.lang.UnsupportedOperationException: Cannot create Jython shell: Class org.python.util.InteractiveConsole not found | |
| (You might need to install jython.jar in the lib directory) | |
| at com.google.gerrit.pgm.shell.JythonShell.<init>(JythonShell.java:47) | |
| while locating com.google.gerrit.pgm.shell.JythonShell | |
| while locating com.google.gerrit.pgm.shell.InteractiveShell | |
| ---- | |
| Errors during processing of the startup script, 'Startup.py', are logged | |
| to the error log: | |
| ---- | |
| [2012-04-17 14:20:30,558] INFO com.google.gerrit.pgm.shell.JythonShell : Jython shell instance created. | |
| [2012-04-17 14:20:38,005] ERROR com.google.gerrit.pgm.shell.JythonShell : Exception occurred while loading file Startup.py : | |
| java.lang.reflect.InvocationTargetException | |
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) | |
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |
| at java.lang.reflect.Method.invoke(Method.java:616) | |
| at com.google.gerrit.pgm.shell.JythonShell.runMethod0(JythonShell.java:112) | |
| at com.google.gerrit.pgm.shell.JythonShell.execFile(JythonShell.java:194) | |
| at com.google.gerrit.pgm.shell.JythonShell.reload(JythonShell.java:178) | |
| at com.google.gerrit.pgm.shell.JythonShell.run(JythonShell.java:152) | |
| at com.google.gerrit.pgm.Daemon.run(Daemon.java:190) | |
| at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:67) | |
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) | |
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |
| at java.lang.reflect.Method.invoke(Method.java:616) | |
| at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:167) | |
| at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:91) | |
| at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:49) | |
| at Main.main(Main.java:25) | |
| Caused by: Traceback (most recent call last): | |
| File "/home/user/.gerritcodereview/Startup.py", line 1, in <module> | |
| Test | |
| NameError: name 'Test' is not defined | |
| ---- | |
| Those errors are non-fatal. System and user scripts can be loaded again | |
| by issuing the following command in the Gerrit Inspector console: | |
| ---- | |
| Shell.reload() | |
| ---- | |
| == LOGGING | |
| Error and warning messages from the server are automatically written | |
| to the log file under '$site_path/logs/error_log'. | |
| Output and error messages (including Java and Python exceptions) | |
| resulting from interactive work are logged to the console. | |
| == KNOWN ISSUES | |
| The Inspector does not yet recognize Google Guice bindings. | |
| [IMPORTANT] | |
| Using the Inspector may void your warranty. | |
| GERRIT | |
| ------ | |
| Part of link:index.html[Gerrit Code Review] | |
| SEARCHBOX | |
| --------- |