Merge branch 'master' of git@lx-office.linet-services.de:lx-office-erp
[kivitendo-erp.git] / scripts / console
1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5 use 5.008;                          # too much magic in here to include perl 5.6
6
7 BEGIN {
8   unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
9   push    @INC, "modules/fallback"; # Only use our own versions of modules if there's no system version.
10 }
11
12 use Config::Std;
13 use Data::Dumper;
14 use Devel::REPL 1.002001;
15 use Term::ReadLine::Perl::Bind;     # use sane key binding for rxvt users
16
17 read_config 'config/console.conf' => my %config;# if -f 'config/console.conf';
18
19 my $login        = shift || $config{Console}{login}        || 'demo';
20 my $history_file =          $config{Console}{history_file} || '/tmp/lxoffice_console_history.log'; # fallback if users is not writable
21 my $autorun      =          $config{Console}{autorun};
22
23 # will be configed eventually
24 my @plugins      = qw(History LexEnv Colors MultiLine::PPI FancyPrompt PermanentHistory AutoloadModules);
25
26 my $repl = Devel::REPL->new;
27 $repl->load_plugin($_) for @plugins;
28 $repl->load_history($history_file);
29 $repl->eval('help');
30 $repl->print("trying to auto login as '$login'...");
31 $repl->print($repl->eval("lxinit '$login'"));
32 if ($autorun) {
33   my $result = $repl->eval($autorun);
34   $repl->print($result->message) if ref($result) eq 'Devel::REPL::Error';
35 }
36 $repl->run;
37
38 package Devel::REPL;
39
40 use utf8;
41 use CGI qw( -no_xhtml);
42 use DateTime;
43 use SL::Auth;
44 use SL::Form;
45 use SL::Helper::DateTime;
46 use SL::Locale;
47 use SL::LXDebug;
48 use Data::Dumper;
49
50 # this is a cleaned up version of am.pl
51 # it lacks redirection, some html setup and most of the authentication process.
52 # it is assumed that anyone with physical access and execution rights on this script
53 # won't be hindered by authentication anyway.
54 sub lxinit {
55   my $login = shift;
56
57   die 'need login' unless $login;
58
59   package main;
60
61   { no warnings 'once';
62     $::userspath  = "users";
63     $::templates  = "templates";
64     $::sendmail   = "| /usr/sbin/sendmail -t";
65   }
66
67   eval { require "config/lx-erp.conf"; };
68   eval { require "config/lx-erp-local.conf"; } if -f "config/lx-erp-local.conf";
69
70   $::lxdebug = LXDebug->new;
71   $::locale = Locale->new($::language);
72   $::cgi    = CGI->new qw();
73   $::form   = Form->new;
74   $::auth   = SL::Auth->new;
75
76   die 'cannot reach auth db'               unless $::auth->session_tables_present;
77
78   $::auth->restore_session;
79
80   require "bin/mozilla/common.pl";
81
82   die "cannot find user $login"            unless %::myconfig = $::auth->read_user($login);
83
84   $::form->{login} = $login; # normaly implicit at login
85
86   die "cannot find locale for user $login" unless $::locale   = Locale->new($::myconfig{countrycode});
87
88
89   return "logged in as $login";
90 }
91
92 # these function provides a load command to slurp in a lx-office module
93 # since it's seldomly useful, it's not documented in help
94 sub load {
95   my $module = shift;
96   $module =~ s/[^\w]//g;
97   require "bin/mozilla/$module.pl";
98 }
99
100 sub reload {
101   require Module::Reload;
102   Module::Reload->check();
103
104   return "modules reloaded";
105 }
106
107 sub quit {
108   exit;
109 }
110
111 sub help {
112   print <<EOL;
113
114   Lx-Office Konsole
115
116   ./scripts/console [login]
117
118 Spezielle Kommandos:
119
120   help                - zeigt diese Hilfe an.
121   lxinit 'login'      - lädt das Lx-Office Environment für den User 'login'.
122   reload              - lädt modifizierte Module neu.
123   pp DATA             - zeigt die Datenstruktur mit Data::Dumper an.
124   quit                - beendet die Konsole
125
126 EOL
127 #  load   'module'     - läd das angegebene Modul, d.h. bin/mozilla/module.pl und SL/Module.pm.
128 }
129
130 sub pp {
131   local $Data::Dumper::Indent   = 2;
132   local $Data::Dumper::Maxdepth = 2;
133   local $Data::Dumper::Sortkeys = 1;
134   Data::Dumper::Dumper(@_);
135 }
136
137 1;
138
139 __END__
140
141 =head1 NAME
142
143 scripts/console - Lx Office Console
144
145 =head1 SYNOPSIS
146
147   ./script/console
148   > help               # displays a brief documentation
149
150 =head1 DESCRIPTION
151
152 Users of Ruby on Rails will recognize this as a perl reimplementation of the
153 rails scripts/console. It's intend is to provide a shell environment to the
154 lx-office internals. This will mostly not interest you if you just want to do
155 your ERP stuff with lx-office, but will be invaluable for those who wish to
156 make changes to lx-office itself.
157
158 =head1 FUNCTIONS
159
160 You can do most things in the console that you could do in an actual perl
161 script. Certain helper functions will aid you in debugging the state of the
162 program:
163
164 =head2 pp C<DATA>
165
166 Named after the rails pretty print gem, this will call Data::Dumper on the
167 given C<DATA>. Use it to see what is going on.
168
169 Currently C<pp> will set the Data::Dumper depth to 2, so if you need a
170 different depth, you'll have to change that. A nice feature would be to
171 configure that, or at least to be able to change it at runtime.
172
173 =head2 lxinit C<login>
174
175 Login into lx-office using a specified login. No password will be required, and
176 security mechanisms will mostly be inactive. form, locale, myconfig will be
177 correctly set.
178
179 =head2 reload
180
181 Attempts to reload modules that changed since last reload (or inital startup).
182 This will mostly work just fine, except for Moose classes that have been made
183 immutable. Keep in mind that existing objects will continue to have the methods
184 of the classes they were created with.
185
186 =head1 BUGS
187
188  - Reload on immutable Moose classes is buggy.
189  - Logging in more than once is not supported by the program, and thus not by
190    the console. It seems to work, but strange things may happen.
191
192 =head1 SEE ALSO
193
194 Configuration of this script is located in:
195
196  config/console.conf
197  config/console.conf.default
198
199 See there for interesting options.
200
201 =head1 AUTHOR
202
203   Sven Schöling <s.schoeling@linet-services.de>
204
205 =cut