Jun 27, 2008

Cultural Exchange 2

Gnome would crash before the panel would show up. Also, the text console did not work (graphic artifacts instead). Failsafe Gnome did work, which does not have Compiz, so I took a hint to change the graphics driver. System / Management / Hardware drivers offered me to install the non-free xorg-driver-fglrx and now it works.

command-not-found is enabled out of the box and it rules. openSUSE should have it by default too.

dpkg phrasebook:
rpm -ql foo
dpkg -L foo
rpm -qa "foo*bar"
dpkg -l "foo*bar" (and it also shows packages that are not installed)

Jun 25, 2008

Cultural Exchange: First Blood

I decided to expand my horizons and install Ubuntu on my main work computer. So today I offer you the first notes from my observations.

mutt somehow stopped tracking new mails. Fortunately :set check_mbox_size on works around that.

My subversion working copy from openSUSE was created with svn 1.5 but Hardy has only 1.4. So I manually got debs from the coming Intrepid release, and luckily 3 of them were enough: dpkg -i {subversion,libsvn1,libneon27-gnutls}*.deb from here and here.

Jun 17, 2008

LinDevDoc Got Tagging

Bluebear has improved LinDevDoc (original announcement) so that it can do tags now.

Addressing Lines in Plain Text Files

Jirka suggested a possibility to enhance YCP documentation with real-life code examples. For that, we'd need to point to numbered lines within the source code. I thought that ViewVC can do it but apparently not (maybe annotate has it, but it is broken at our site). But there is a new generic way: RFC 5147: URI Fragment Identifiers for the text/plain Media Type. Only none of the browsers seems to support it today...

This points to line 13, with the prototype of main:
http://svn.opensuse.org/svn/yast/trunk/libyui/examples/HelloWorld.cc#line=,13

Jun 11, 2008

Medoosa in OBS

Medoosa is a documentation tool for C++ that can produce UML class diagrams including generalizations and associations. Corrections can be made interactively in a diagram editor (Dia) and are fed back into the source as Javadoc-style comments. At this time, the layout must still be done by hand. Some code is already present to produce the layout with Graphviz.

I wrote it for my master's thesis at the Charles University back in 2001 and it has been since then quietly sitting at SourceForge. Today I have rebuilt it in the openSUSE Build Service: Medoosa, CcDoc-0.7a (required).

Jun 10, 2008

cnetworkmanager 0.4

I pulled together 0.4 yesterday:
  • New: changed license to GPLv2 or later, to match other parts of NM
  • New: distinguish WEP, WPA, WPA2 for -n.
  • New: -o, -w control online and WiFi status.
  • New: basic device info for NM 0.6
  • Fix: recognize Notification Messages in knetwormanagerrc.
  • Fix: -u: better error message when applet not running.
  • Fix: standardized option parsing, both -Cfoo and -C foo work.
The software is now hosted in a Git repository.

Jun 8, 2008

KNotify Client

Korshak asked how to do emerge -uND --world && knotify "Done!". I thougt it would be a piece of cake, but apparently not.
The short answer, zypper in libnotify; notify-send Done, has a disadvantage of requiring a fair amount of GNOME software. But it does use a proposed freedesktop.org standard.
Then I find the method org.kde.KNotify.event, but its nice signature (ssavsayasx) means dbus-send (dbus-1-1.2.1-12) cannot invoke it (it cannot pass empty arrays, and it cannot wrap variants in arrays). No problem, let's use Python. But then we are blocked by knotify4 (kdebase4-runtime-4.0.4-19) reporting a wrong signature via the introspection interface.
# killall knotify4; cp /usr/bin/knotify4{,.bak}
# sed 's/type="a(ss)"/ type = "av"/g' /usr/bin/knotify4.bak > /usr/bin/knotify4
Now which event should we use so that the user actually sees the message? There are many of them, with user configurable actions. warning/kde seems to work out of the box.
#! /usr/bin/python
import sys
import dbus
m = sys.argv[1]
kn = dbus.SessionBus().get_object("org.kde.knotify", "/Notify")
i = kn.event("warning", "kde", [], m, [0,0,0,0], [], 0,
    dbus_interface="org.kde.KNotify")
That did it. But I still hope that there is a simple solution for KDE4 that I have missed.

Jun 3, 2008

D-Bus Spy

Like dbus-monitor, it monitors the system or session bus. Additionally, it can write the traffic to a file and read it later (-w, -r). It can dump all the gory details (-d) or pretty print all the gory details (-p). Like DBusMessageBox which inspired it, it can make message sequence charts (-c). It has some simple filtering abilities (-f, -F).

Try 0.1 if that sounds interesting.

May 30, 2008

try cnetworkmanager 0.3

cnetworkmanager is a command line interface for Network Manager. It is still lacking many features but I decided to announce it now, when it can:

  1. connect to WiFi networks
  2. read the configuration file of KNetworkManager

It is working for me on RC1 of openSUSE-11.0, which has NetworkManager-0.7.0.r3685-3. It is my first project in Python, so the code is somewhat cumbersome. Thanks to Mišo for getting me started (idea.o.o, abclinuxu.cz), and Bille for the API docs.

Regarding related projects, I have seen network-manager-cli, but it is for 0.6 only and the developers were only active last August, so I decided that I should first write some working code for 0.7.

I am interested in comments, bugs, feature requests, patches, any feedback.

Here are some screenshots ;-)

$ cnetworkmanager -h
cnetworkmanager 0.3 - Command Line Interface for NetworkManager
Options:
-d, --dev list devices
-c, --actcon list active connections
-s, --syscon list system connection settings
-u, --usrcon list user connection settings (can CRASH nm-applet)
-a, --ap list found access points
-n, --nets list found wireless networks
-C<net>, --connect=<net> connect to a wireless network (using knetworkmanagerrc)
-m, --monitor loop to show dbus signals

Listing the networks:

$ cnetworkmanager -n
cnetworkmanager 0.3 - Command Line Interface for NetworkManager
Wifi Networks:
49: onenet (54Mb, protected)
46: IT (54Mb, protected)
48: TiborBrunclik (11Mb, protected)
46: linksys (54Mb)
46: IT (54Mb, protected)
46: 23 (54Mb)

Testing Scribefire

Thanks to Duncan for suggesting an editor, Scribefire for Firefox. I have yet to see if it proves better than the one built in.

Let's try a command:
$ zypper moo
\\\\\
\\\\\\\__o
__\\\\\\\'/_

May 26, 2008

Installation without YaST

With 96MB of RAM, Linuxrc will not start on 11.0 (RC1). So I decided to exploit the image based installation, and not to use YaST at all for a change.

The target machine has dual boot and I am logged on the other system via the network, so I could paste this all in. Fasten your hats...

Update: Planet SUSE is eating the dollar variables :-( See the original post at Blogspot for the real thing.

Target partition:
# mkfs.ext3 /dev/hda1
# mount /dev/hda1 /mnt

A flash drive with images and kernel:
# mount /dev/sda1 /media
# cd /media/misc

Note I used unlzma beforehand because the target machine is way slow for that
# du -m *
5 base-i386.tar
12 base-meta-i386.tar
527 common-base-i386.tar
22 kernel-default-2.6.25.4-8.i586.rpm

Unpack!
# for i in *.tar; do dd if=$i bs=1M | tar -C /mnt -xf -; done &

While it is running, watch the progress:
# pkill -USR1 -x dd
...
552202240 bytes (552 MB) copied, 709,291 s, 779 kB/s

# cp kernel-default-*.i586.rpm /mnt/tmp

Before installing the kernel, we must do some setup so that the post-install script works.

# for i in dev proc sys; do mount --bind /$i /mnt/$i; done

# chroot /mnt
Now I use ## to mark that we are chrooted in the target system.

Modify partitions as needed.
Also see ls -l /dev/disk/by-id
## ROOT=/dev/hda1
## SWAP=/dev/hda4
## cat <<EOF > /etc/fstab
$ROOT / ext3 acl,user_xattr 1 1
$SWAP swap swap defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs noauto 0 0
debugfs /sys/kernel/debug debugfs noauto 0 0
usbfs /proc/bus/usb usbfs noauto 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
EOF

You probably don't need to set this one and the others starting with FIX_

## FIX_BOOT=acpi=force
## GROOT="(hd0,0)"
## cat <<EOF > /boot/grub/menu.lst
default 0
timeout 60
gfxmenu $GROOT/boot/message

title openSUSE 11.0
root $GROOT
kernel /boot/vmlinuz root=$ROOT resume=$SWAP vga=787 $FIX_BOOT
initrd /boot/initrd

title Failsafe -- openSUSE 11.0
root $GROOT
kernel /boot/vmlinuz root=$ROOT ide=nodma apm=off acpi=off noresume nosmp noapic maxcpus=0 edd=off x11failsafe vga=787
initrd /boot/initrd
EOF

Put GRUB to MBR
## GDEST="(hd0)"
## cat <<EOF > /boot/grub/device.map
$GDEST /dev/hda
EOF

## cat <<EOF > /etc/grub.conf
setup --stage2=/boot/grub/stage2 $GDEST $GROOT
quit
EOF

## sysconfig() { sed -i -s "/^$2=/s/=\"/=\"$3/" /etc/sysconfig/$1; }

I also need this. You probably don't
## FIX_MODS="ide-generic ide-core"
## sysconfig kernel INITRD_MODULES "$FIX_MODS"

I don't know whether these 2 are strictly necessary
## sysconfig bootloader LOADER_TYPE grub
## sysconfig bootloader LOADER_LOCATION boot

## rpm -Uhv /tmp/kernel-default-*.rpm
It will get the resume device wrong (according to *current* swap partition), but it seems harmless.

## grub-install

## passwd
## chkconfig SuSEfirewall2_init on
## chkconfig SuSEfirewall2_setup on

## exit
# reboot

BTW, I am fed up with the Blogger editor. Can I use an offline one so that I don't have to change blog hosting?

May 19, 2008

Easier Bugzilla search

I realized that I dislike beta bug reporting because it is so painful to search for duplicates before I report a problem. The search form is so ****ing painful to use!

So I wrote a replacement. Enjoy, view source, share, improve.

Search a substring in openSUSE 11.0 bugs (even closed ones):

v 0.3

May 6, 2008

YaST from the Command Line

The Automatic Configuration in openSUSE 11.0 installation is good because you don't have to click Next so much, but now I am missing the button for opening SSH in the firewall.
Here's a one-liner to do it using YaST:
# yast2 firewall services add zone=EXT service=service:sshd
Try also:
# yast2 firewall help
# yast2 firewall longhelp
# yast2 firewall summary
# yast2 firewall services list
# yast2 -l
# yast2 FOO help
(Saying "yast" instead of "yast2" should work too, but there is bug 374259.)

May 5, 2008

cnetworkmanager 0.1

Thanks to Mišo for getting me started on this...
$ cnetworkmanager -d -c
cnetworkmanager 0.1 - Command Line Interface for NetworkManager
state: CONNECTED
wifi: 1
wifi hw: 1
/org/freedesktop/Hal/devices/net_00_02_3f_0d_7d_93
Udi: /org/freedesktop/Hal/devices/net_00_02_3f_0d_7d_93
Interface: eth0
Driver: 8139too
Ip4Address: 268702730
Capabilities: NM_SUPPORTED,CARRIER_DETECT
Dev State: FAILED
Dev Type: 802_3_ETHERNET
HwAddress: 00:02:3F:0D:7D:93
Speed: 100
Carrier: 1
/org/freedesktop/Hal/devices/net_00_11_d8_70_00_2f
Udi: /org/freedesktop/Hal/devices/net_00_11_d8_70_00_2f
Interface: wlan0
Driver: rt2500pci
Ip4Address: 1476989962
Capabilities: NM_SUPPORTED
Dev State: FAILED
Dev Type: 802_11_WIRELESS
Dev Mode: INFRA
Wifi Capabilities: RSN,CIPHER_WEP40,CIPHER_WEP104,CIPHER_TKIP,CIPHER_CCMP,WPA
HwAddress: 00:11:D8:70:00:2F
Bitrate: 1000
ActiveAccessPoint: /org/freedesktop/NetworkManager/AccessPoint/4
Active Connections
/org/freedesktop/NetworkManager/ActiveConnection/8
ServiceName: org.freedesktop.NetworkManagerSystemSettings
Connection: /org/freedesktop/NetworkManagerSettings/0
SpecificObject: /
SharedServiceName:
SharedConnection: /
Devices: dbus.Array([dbus.ObjectPath('/org/freedesktop/Hal/devices/net_00_02_3f_0d_7d_93')], signature=dbus.Signature('o'), variant_level=1)
/org/freedesktop/NetworkManager/ActiveConnection/9
ServiceName: org.freedesktop.NetworkManagerUserSettings
Connection: /org/freedesktop/NetworkManagerSettings/Connection/0
SpecificObject: /org/freedesktop/NetworkManager/AccessPoint/4
SharedServiceName:
SharedConnection: /
Devices: dbus.Array([dbus.ObjectPath('/org/freedesktop/Hal/devices/net_00_11_d8_70_00_2f')], signature=dbus.Signature('o'), variant_level=1)

May 2, 2008

D-Bus Spying

I found how to make dbus-monitor show me more than just signals on the system bus. The documentation in dbus-daemon(1) is very terse about that. This is probably insecure, although I don't know of an interesting exploit.
--- /etc/dbus-1/system.conf.orig        2008-05-02 17:08:03.000000000 +0200
+++ /etc/dbus-1/system.conf 2008-05-02 17:08:30.000000000 +0200
@@ -55,6 +55,9 @@
<allow send_requested_reply="true">
<allow receive_requested_reply="true">
</allow>
+ <policy context="mandatory">
+ <allow receive_interface="*" eavesdrop="true">
+ </policy>

<!-- Config files are placed here that among other things, punch
holes in the above policy for specific services. -->
Then you need to tell the daemon to reread the config:
# pkill -HUP -u messagebus
BTW I still haven't figured out how to monitor method_return. I guess receive_requested_reply="false" should do it but not sure how. Does anyone know?

Apr 30, 2008

D-Bus Sightseeing

I figured it was time to learn more about D-Bus. Today, let me share some useful calls that I found so far. Hopefully they will inspire you to experimenting too and together we will have a chance of learning more.
$ dbus-send --print-reply \
--dest=org.kde.klipper \
/klipper \
org.kde.klipper.klipper.getClipboardContents
method return sender=:1.37 -> dest=:1.73 reply_serial=2
string "Hello D-Bus"

Your result will be probably different. In fact, I spent several minutes wondering why the method does not return anything and just repeats its name ;-)
The meaning of the parameters: --dest is the destination connection; apparently D-Bus cannot find it out from the following parameter: /klipper: the destination object. org.kde.klipper.klipper is the interface. Most objects have their own interface plus the introspection interface org.freedesktop.DBus.Introspectable. getClipboardContents is of course the method name.

For further exploration, the GUI tool qdbusviewer is very useful. Try it for calling getClipboardContents now.
$ dbus-send --type=method_call --dest=org.kde.kwin \
/KWin org.kde.KWin.nextDesktop
$ dbus-send --type=method_call --dest=org.kde.kwin \
/KWin org.kde.KWin.previousDesktop
$ dbus-send --type=method_call --dest=org.kde.plasma \
/App org.kde.plasma.App.toggleDashboard
The type option is necessary because dbus-call defaults to type=signal which would not work. (BTW does anyone have a nice example for demonstrating a signal?) With print-reply in the first example, type=method_call is implied.

Let's pass some arguments:
$ dbus-send --type=method_call --dest=org.kde.klipper \
/klipper org.kde.klipper.klipper.setClipboardContents \
string:'Test Beta2!'
$ dbus-send --type=method_call --dest=org.kde.krunner \
/Interface org.kde.krunner.Interface.display \
string:'system'
So far we have been using the session bus. The system-wide bus offers even more fun:
$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManagerSystemSettings \
/org/freedesktop/NetworkManagerSettings \
org.freedesktop.NetworkManagerSettings.ListConnections

array [
object path "/org/freedesktop/NetworkManagerSettings/0"
object path "/org/freedesktop/NetworkManagerSettings/1"
object path "/org/freedesktop/NetworkManagerSettings/2"
]

$ dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManagerSystemSettings \
/org/freedesktop/NetworkManagerSettings/1 \
org.freedesktop.NetworkManagerSettings.Connection.GetSettings

array [
dict entry(
string "802-11-wireless"
array [
dict entry(
string "ssid"
variant array [
byte 102
byte 114
byte 111
byte 103
byte 115
]
)
dict entry(
string "security"
variant string "802-11-wireless-security"
)
]
)
/* more data. BTW you can't see any of this in qdbusviewer. */
]
(Interesting, every even call to NMS fails with a timeout)

Finally, a long list to scroll up while the music plays:
$ dbus-send --system --print-reply \
--dest=org.freedesktop.Hal \
/org/freedesktop/Hal/Manager \
org.freedesktop.Hal.Manager.GetAllDevices

Apr 21, 2008

TWM tip

TWM is the ancient window manager that you can use when troubleshooting the problems with X. It has always annoyed me that it can't make up its own mind and you have to place the windows manually when they first appear.

Solution:
cp /usr/share/X11/twm/system.twmrc ~
echo RandomPlacement >> ~/.twmrc
TODO: make it the default in openSUSE.

Apr 18, 2008

openSUSE 11.0 Beta 1: Is that the murderer's name and address in the victim's hand?

As Beta 1 is getting mirrored, I am excited to tell you about obscure parts of the installation that I hope you will never see.

YaST does not crash. Never. Well, only rarely. Especially not during the initial installation. Seldom. So what do we do when it does? We want the backtrace and the debugging logs. So before 11.0 we would ask you to please let it crash again, but with some special options to produce the backtrace and the debugging info. Spoils the fun.

Since Alpha 2 YaST will take care of the backtrace. Since Beta 1, it will also produce tons of the debugging messages, but throw most of them away and only show the last few of them in case of a crash. Reporting a bug has become much easier!

This has actually helped us already in debugging one crash that blocked the release of Beta 1, bug 380283. If you want to see for yourself, search the log for "got signal". The next line says "Liberating suppressed debugging messages" and afterwards there is "Back trace".

References: FATE#302167, FATE#302166.

Apr 8, 2008

iogrind in openSUSE Build Service

iogrind is Michael Meeks' I/O profiler and visualizer. I wanted to see if it can help me with improving YaST performance, and I was surprised to find that there are no RPMs.

Well now there are: iogrind in openSUSE Build Service. The packaging is very crude for now, but it appears to work. Now I have to make some sense of the tool :-)

Apr 1, 2008

kezboard.rpm - Adapts zour QWERTY habits to a QWERTZ world

$ yzpper info kezboard
* ...
* Reading installed packages [100%]

Information for package kezboard:

Repository:
Name: kezboard
Version: 1.0-1
Arch: noarch
Installed: Yes
Status: up-to-date
Installed Size: 0 B
Summary: Adapts zour QWERTY habits to a QWERTZ world
Description:

Do zou keep tzping loadkeys instead of loadkezs and zypper instead of yzpper?
Then this package could help zou.

Authors:
--------
Martin Vidner
$ rpm -ql kezboard
/bin/gunyip
/bin/gyip
/bin/loadkezs
/bin/sznc
/bin/ycat
/usr/bin/byip2
/usr/bin/compiy
/usr/bin/pzthon
/usr/bin/rubz
/usr/bin/unyip
/usr/bin/yip
/usr/bin/yzpper


Get kezboard as an RPM in the openSUSE Build Service.