2008-11-03 14 views
9

Tôi đã tự động cài đặt Ubuntu - Tôi đã có mã Python tự động chạy (sau khi cài đặt sạch, nhưng trước khi đăng nhập người dùng đầu tiên - nó nằm trong tập lệnh /etc/init.d/ tạm thời) Apache & cấu hình của nó cho sở thích Gnome cá nhân của tôi. Đó là cái thứ hai gây rắc rối cho tôi.Làm cách nào để tạo "phiên hoạt động" giả cho gconf?

này làm việc tốt trong Ubuntu 8.04 (Hardy), nhưng khi tôi sử dụng điều này với 8,10 (Intrepid), lần đầu tiên tôi thử truy cập gconf, tôi nhận được ngoại lệ này:

Không thể liên lạc với máy chủ cấu hình; một số nguyên nhân có thể là bạn cần bật mạng TCP/IP cho ORBit hoặc bạn có khóa NFS cũ do sự cố hệ thống. Xem http://www.gnome.org/projects/gconf/ để biết thông tin. (Chi tiết - 1: Không chạy trong phiên đang hoạt động)

Có, đúng, không có phiên Gnome nào khi đang chạy, vì người dùng chưa đăng nhập - tuy nhiên, điều này đã làm việc trước đó; điều này dường như mới với Gnome của Intrepid (2.24?).

Ngắn thay đổi trực tiếp các tệp XML của gconf, có cách nào để thực hiện một số loại phiên Gnome proxy không? Hoặc, bất kỳ đề xuất nào khác?

(Chi tiết: đây là mã python chạy như là người chủ, nhưng setuid của & setgid để được tôi trước khi đặt quyền ưu tiên của tôi bằng cách sử dụng "gconf" mô-đun từ gói python-gconf.)

Trả lời

1

Vâng, tôi nghĩ Tôi hiểu câu hỏi. Có vẻ như tập lệnh của bạn chỉ cần khởi động trình nền dbus, hoặc đảm bảo rằng nó đã bắt đầu. Tôi tin rằng "phiên" ở đây đề cập đến một phiên dbus. (here is some evidence), không phải phiên Gnome. Dbus và gconf đều chạy tốt mà không có Gnome.

Dù bằng cách nào, giả mạo một "phiên hoạt động" có vẻ như là một ý tưởng khá tồi. Nó sẽ chỉ tìm kiếm nó nếu nó cần nó.

Có lẽ chúng ta có thể thấy tập lệnh trong quá khứ? Tôi đã thực sự nhìn thấy nó trước khi đưa ra bất kỳ bình luận nào.

8

Tôi có thể tạo lại điều này bằng cách cài đặt GConf 2.24 trên máy tính của mình. GConf 2.22 hoạt động tốt, nhưng 2.24 phá vỡ nó.

GConf không thể khởi chạy vì D-Bus không chạy. Tạo D-Bus bằng tay và trình nền GConf làm cho công việc này trở lại.

tôi đã cố gắng để spawn xe buýt phiên D-Bus bằng cách làm như sau:

import dbus 
dummy_bus = dbus.SessionBus() 

... nhưng nhận điều này:

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.Spawn.ExecFailed: dbus-launch failed to autolaunch D-Bus session: Autolaunch error: X11 initialization failed. 

Weird. Có vẻ như nó không thích xuất hiện nếu X không chạy. Để làm việc xung quanh đó, bắt đầu dbus khởi động bằng tay (IIRC sử dụng os.system() gọi):

$ dbus-launch 
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-eAmT3q94u0,guid=c250f62d3c4739dcc9a12d48490fc268 
DBUS_SESSION_BUS_PID=15836 

Bạn sẽ cần phải phân tích đầu ra bằng cách nào đó và tiêm chúng vào biến môi trường (có thể bạn sẽ muốn sử dụng os.putenv) . Đối với thử nghiệm của tôi, tôi chỉ sử dụng vỏ và đặt các hộp môi trường theo cách thủ công với export DBUS_SESSION_BUS_ADDRESS=blahblah..., v.v.

Tiếp theo, bạn cần khởi chạy gconftool-2 --spawn với các biến môi trường mà bạn nhận được từ dbus-launch. Thao tác này sẽ khởi chạy trình tiện ích GConf.Nếu các biến môi trường D-Bus không được thiết lập, daemon sẽ không khởi chạy.

Sau đó, hãy chạy mã GConf của bạn. Miễn là bạn đã đặt biến môi trường bus phiên D-Bus cho tập lệnh của riêng bạn, bây giờ bạn sẽ có thể giao tiếp với daemon GConf.

Tôi biết nó phức tạp.

gconftool-2 cung cấp tùy chọn --direct cho phép bạn đặt biến GConf mà không cần liên lạc với máy chủ, nhưng tôi không thể tìm thấy tùy chọn tương đương cho ràng buộc Python (viết tắt XML thủ công).

Edit: Để tham khảo trong tương lai, nếu ai muốn chạy dbus-launch từ bên trong một bash kịch bản bình thường (như trái ngược với một kịch bản Python, như chủ đề này được thảo luận), nó là khá dễ dàng để lấy địa chỉ xe buýt phiên cho sử dụng trong tập lệnh:

#!/bin/bash 

eval `dbus-launch --sh-syntax` 

export DBUS_SESSION_BUS_ADDRESS 
export DBUS_SESSION_BUS_PID 

do_other_stuff_here 
+0

Có cùng một vấn đề, cài đặt các DBUS vars đó làm cho gconf bắt đầu lại. Cảm ơn! Để tham khảo, các sự cố bắt đầu khi danh sách tác vụ tiến hóa biến mất. – iElectric

1

Cảm ơn, Ali & Jeremy - cả hai câu trả lời của bạn là một trợ giúp lớn. Tôi vẫn đang làm việc này (mặc dù tôi đã dừng lại vào buổi tối).

Đầu tiên, tôi lấy gợi ý từ Ali và đang thử một phần gợi ý của Jeremy: Tôi đã sử dụng dbus-launch để chạy "gconftool-2 --spawn". Nó không hiệu quả với tôi; Bây giờ tôi hiểu lý do tại sao (thx, Jeremy) - Tôi đã cố gắng sử dụng gconf từ bên trong cùng một chương trình python đã khởi chạy dbus & gconftool, nhưng môi trường của nó không có các biến môi trường - duh.

Tôi đặt chiến lược đó sang một bên khi tôi nhận thấy tùy chọn --direct của gconftool-2; bên trong, gconftool-2 đang sử dụng API không bị ràng buộc bởi các ràng buộc python gconf. Vì vậy, tôi đã sửa đổi python-gconf để lộ phương thức bổ sung, và một khi đã xây dựng (tôi đã gặp một số vấn đề không liên quan để làm việc này), chúng ta sẽ xem điều đó có khắc phục được không - và nếu có, bởi vì xây dựng những ràng buộc đó dường như xây dựng tất cả các gnome!), tôi sẽ tìm một cách tốt hơn để quản lý các biến môi trường trong chiến lược đầu tiên đó.

(Tôi sẽ thêm một câu trả lời ở đây ngày mai một trong hai cách)

Và đó là ngày hôm sau: Tôi chạy vào một chút rắc rối với biến đổi python-gconf của tôi, mà cảm hứng cho tôi để thử ý tưởng đơn giản của Jeremy, mà làm việc tốt - trước khi thực hiện thao tác gconf đầu tiên, tôi chỉ cần chạy "dbus-launch", phân tích cú pháp các cặp tên-giá trị kết quả và thêm chúng trực tiếp vào môi trường của python. Sau khi làm điều đó, tôi chạy "gconftool-2 --spawn". Đã giải quyết được sự cố.

+0

Nếu API Python mới hữu ích, hãy đảm bảo bạn gửi các thay đổi ở phía trên. –

Các vấn đề liên quan