OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """Makes changes to mounted Chromium OS image to allow it to run with VMs | 7 """Makes changes to mounted Chromium OS image to allow it to run with VMs |
8 | 8 |
9 This script changes two files within the Chromium OS image to let the image | 9 This script changes two files within the Chromium OS image to let the image |
10 work with VMs, particularly QEMU | 10 work with VMs, particularly QEMU |
11 | 11 |
12 Currently this script does the following, | 12 Currently this script does the following, |
13 1.) Modify the post install script to remove EFI fixup section; the VM's we | 13 1.) Modify the post install script to remove EFI fixup section; the VM's we |
14 support don't have EFI support anyway and this section of the script needs | 14 support don't have EFI support anyway and this section of the script needs |
15 access to the actual device drives | 15 access to the actual device drives |
16 | 16 |
17 2.) For QEMU/KVM, we change the xorg.conf to remove mouse support and instead | 17 2.) For QEMU/KVM, we change the xorg.conf to remove mouse support and instead |
18 change it to complete tablet support. This is done to provide better mouse | 18 change it to complete tablet support. This is done to provide better mouse |
19 response in the VM since tablets work of absolute coordinates while the mouse | 19 response in the VM since tablets work of absolute coordinates while the mouse |
20 works of relative. In a screen that doesn't support a mouse grab (e.g., VNC), | 20 works of relative. In a screen that doesn't support a mouse grab (e.g., VNC), |
21 relative coordinates can cause the mouse to be flaky | 21 relative coordinates can cause the mouse to be flaky |
22 | 22 |
23 """ | 23 """ |
24 | 24 |
25 from optparse import OptionParser | 25 from optparse import OptionParser |
26 import os | 26 import os |
27 import stat | 27 import stat |
28 import sys | 28 import sys |
29 | 29 |
30 USAGE = "usage: %prog --mounted_dir=directory --for_qemu=[true]" | 30 USAGE = "usage: %prog --mounted_dir=directory --enable_tablet=[true]" |
31 | |
32 POST_INST_IN_FILENAME = 'usr/sbin/chromeos-postinst' | |
33 POST_INST_OUT_FILENAME = 'postinst_vm' | |
34 XORG_CONF_FILENAME = os.path.join('etc', 'X11', 'xorg.conf') | |
35 | |
36 EFI_CODE_MARKER_START = r'echo "Updating grub target for EFI BIOS"' | |
37 EFI_CODE_MARKER_END = \ | |
38 r"""sh "${INSTALL_ROOT}"/usr/sbin/chromeos-firmwareupdate | |
39 fi | |
40 else""" | |
41 | 31 |
42 INPUT_SECTION_MARKER = r'Section "InputDevice"' | 32 INPUT_SECTION_MARKER = r'Section "InputDevice"' |
43 SECTION_END_MARKER = r'EndSection' | 33 SECTION_END_MARKER = r'EndSection' |
44 | 34 |
45 MOUSE_SECTION_IDENTIFIERS = [] | 35 MOUSE_SECTION_IDENTIFIERS = [] |
46 MOUSE_SECTION_IDENTIFIERS += ['Identifier "Mouse'] | 36 MOUSE_SECTION_IDENTIFIERS += ['Identifier "Mouse'] |
47 MOUSE_SECTION_IDENTIFIERS += ['Identifier "USBMouse'] | 37 MOUSE_SECTION_IDENTIFIERS += ['Identifier "USBMouse'] |
48 | 38 |
49 REPLACE_USB_MOUSE_PAIR = ('InputDevice "USBMouse" "AlwaysCore"', | 39 REPLACE_USB_MOUSE_PAIR = ('InputDevice "USBMouse" "AlwaysCore"', '') |
50 '') | 40 XORG_CONF_FILENAME = os.path.join('etc', 'X11', 'xorg.conf') |
51 | 41 |
52 | 42 |
53 TABLET_DEVICE_CONFIG = """ | 43 TABLET_DEVICE_CONFIG = """ |
54 Section "InputDevice" | 44 Section "InputDevice" |
55 Identifier "Mouse1" | 45 Identifier "Mouse1" |
56 Driver "evdev" | 46 Driver "evdev" |
57 Option "Device" "/dev/input/event2" | 47 Option "Device" "/dev/input/event2" |
58 Option "CorePointer" "true" | 48 Option "CorePointer" "true" |
59 EndSection | 49 EndSection |
60 """ | 50 """ |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 | 83 |
94 # Replace UsbMouse with Tablet. | 84 # Replace UsbMouse with Tablet. |
95 xorg_conf = xorg_conf.replace(REPLACE_USB_MOUSE_PAIR[0], | 85 xorg_conf = xorg_conf.replace(REPLACE_USB_MOUSE_PAIR[0], |
96 REPLACE_USB_MOUSE_PAIR[1]) | 86 REPLACE_USB_MOUSE_PAIR[1]) |
97 | 87 |
98 # Write the file back out. | 88 # Write the file back out. |
99 f = open(xorg_conf_filename, 'w') | 89 f = open(xorg_conf_filename, 'w') |
100 f.write(xorg_conf) | 90 f.write(xorg_conf) |
101 f.close() | 91 f.close() |
102 | 92 |
103 | |
104 # Remove the code that does EFI processing from the postinst script | |
105 def FixPostInst(mount_point): | |
106 postinst_in = os.path.join(mount_point, POST_INST_IN_FILENAME) | |
107 f = open(postinst_in, 'r') | |
108 postinst = f.read() | |
109 f.close() | |
110 m1 = postinst.find(EFI_CODE_MARKER_START) | |
111 m2 = postinst.find(EFI_CODE_MARKER_END) | |
112 if (m1 == -1) or (m2 == -1) or (m1 > m2): | |
113 # basic sanity check | |
114 return | |
115 m2 += len(EFI_CODE_MARKER_END) | |
116 postinst = postinst[0:m1] + postinst[m2:] | |
117 | |
118 # Write the file back out. | |
119 postinst_out = os.path.join(mount_point, POST_INST_OUT_FILENAME) | |
120 f = open(postinst_out, 'w') | |
121 f.write(postinst) | |
122 f.close() | |
123 | |
124 # Mark the file read/execute. | |
125 os.chmod(postinst_out, stat.S_IEXEC | stat.S_IREAD) | |
126 | |
127 | |
128 def main(): | 93 def main(): |
129 parser = OptionParser(USAGE) | 94 parser = OptionParser(USAGE) |
130 parser.add_option('--mounted_dir', dest='mounted_dir', | 95 parser.add_option('--mounted_dir', dest='mounted_dir', |
131 help='directory where the Chromium OS image is mounted') | 96 help='directory where the Chromium OS image is mounted') |
132 parser.add_option('--for_qemu', dest='for_qemu', | 97 parser.add_option('--enable_tablet', dest='enable_tablet', |
133 default="true", | 98 default="true", |
134 help='fixup image for qemu') | 99 help='fixup image for qemu') |
135 (options, args) = parser.parse_args() | 100 (options, args) = parser.parse_args() |
136 | 101 |
137 if not options.mounted_dir: | 102 if not options.mounted_dir: |
138 parser.error("Please specify the mount point for the Chromium OS image"); | 103 parser.error("Please specify the mount point for the Chromium OS image"); |
139 if options.for_qemu not in ('true', 'false'): | 104 if options.enable_tablet not in ('true', 'false'): |
140 parser.error("Please specify either true or false for --for_qemu") | 105 parser.error("Please specify either true or false for --enable_tablet") |
141 | 106 |
142 FixPostInst(options.mounted_dir) | 107 if (options.enable_tablet == 'true'): |
143 if (options.for_qemu == 'true'): | |
144 FixXorgConf(options.mounted_dir) | 108 FixXorgConf(options.mounted_dir) |
145 | 109 |
146 | 110 |
147 if __name__ == '__main__': | 111 if __name__ == '__main__': |
148 main() | 112 main() |
OLD | NEW |