Improved installation checks again.
[openoffice-python:openoffice-python.git] / sample-scripts / check-installation
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 """
4 Check whether openoffice-python can talk to OpenOffice. If not, try to
5 find the problem.
6 """
7 #
8 # Copyright (c) 2008 by Hartmut Goebel <h.goebel@goebel-consult.de>
9 # Licenced under the GNU General Public License v3 (GPLv3)
10 # see file LICENSE-gpl-3.0.txt
11 #
12
13 import sys
14 import platform
15 import random
16 import pprint
17
18 pyver = '.'.join(map(str, sys.version_info[:2]))
19
20 def print_pythonpath():
21     print
22     print "Modules are searched in this places (aka sys.path, $PYTHONPATH)"
23     pprint.pprint(sys.path)
24     
25 #print_pythonpath()
26
27 try:
28     import uno
29 except ImportError:
30     print "Can't import the uno-bridge module 'uno'."
31     if platform.system == 'Windows':
32         print "Make sure you have a installed version of OpenOffice.org which"
33         print "is matching your Python version", pyver, "and the file uno.py is on"
34         print "your $PYTHONPATH."
35     else:
36         print "Make sure the package 'openoffice.org-pyuno' is installed,"
37         print "is matching your Python version", pyver, "and the file uno.py is on"
38         print "your $PYTHONPATH."
39         if platform.dist()[0] == 'debian':
40             print "For Debian, Ubuntu and related distributions, the package"
41             print "is called, eg. 'python-uno'."
42
43     print_pythonpath()
44     raise SystemExit(21)
45
46 openoffice = None
47
48 try:
49     import openoffice
50     import openoffice.interact
51     raise ImportError
52     import openoffice.officehelper as OH
53 except ImportError, e:
54     print "Can't import openoffice-python module 'openoffice.interact'."
55     print "Make sure the Python package 'openoffice.interact' is installed"
56     print "for your Python version", pyver
57     print "This was the error message:"
58     print e
59     print_pythonpath()
60     if openoffice:
61         print 'openoffice.__file__ :', openoffice.__file__
62     raise SystemExit(22)
63
64 def bootstrap(pipename=None, host=None, port=None):
65     if pipename or host or port:
66         print "Try connecting to already running OOo"
67         connectString = OH._build_connect_string(pipename=pipename,
68                                                  host=host, port=port)
69         print "using connection string", repr(connectString)
70     else:
71         # Generate a random pipe name.
72         pipename = "uno" + str(random.random())[2:]
73         connectString = OH._build_connect_string(pipename=pipename)
74         print "Starting OOo for listening on", connectString
75         print "Will use command",
76         print OH._build_cmd_args(connectString)
77         # start OOo listening on this named pipe
78         pid = OH._start_OOo(connectString)
79         print "Started OOo with process id", pid
80
81     print
82     print "Now trying to connect to OOo."
83     sys.stdout.flush()
84     try:
85         context = OH.connect(connectString)
86         print "Connecting with context", context
87     except OH.BootstrapException:
88         raise
89         print "Can not connect to OOo. Please check whether it is running at"
90         print "all."
91         print "Try starting it using this command:"
92         print 
93         
94     return context
95
96 if __name__ == '__main__':
97     import optparse
98     parser = optparse.OptionParser('%prog [options]')
99     group = parser.add_option_group('To connect to already running server use:')
100     group.add_option('--host',  #default='localhost',
101                      help="hostname/ip of server (default: %default)")
102     group.add_option('--port',  default=2002, type=int,
103                      help="port the server is listening on (default: %default)")
104
105     opts, args = parser.parse_args()
106     if not opts.host:
107         opts.port = None
108     context = bootstrap(host=opts.host, port=opts.port)
109
110     if context:
111         print
112         print "Looks good."
113         print
114     else:
115         print "When reporting problems, please give this OS information"
116         print platform.platform()
117         print "and this PYTHONPATH:"
118         for p in sys.path:
119             print '  ', repr(p)
120         print
121         raise SystemExit(20)