commit yast2-core for openSUSE:Factory
Hello community, here is the log from the commit of package yast2-core for openSUSE:Factory checked in at Fri Jan 30 00:37:03 CET 2009. -------- --- yast2-core/yast2-core.changes 2009-01-26 14:00:38.000000000 +0100 +++ yast2-core/yast2-core.changes 2009-01-29 17:29:45.344698000 +0100 @@ -1,0 +2,6 @@ +Thu Jan 29 15:15:57 CET 2009 - aschnell@suse.de + +- added dbus client agent (required for bnc #464453) +- 2.18.3 + +------------------------------------------------------------------- calling whatdependson for head-i586 Old: ---- yast2-core-2.18.2.tar.bz2 New: ---- yast2-core-2.18.3.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ yast2-core.spec ++++++ --- /var/tmp/diff_new_pack.P21172/_old 2009-01-30 00:36:40.000000000 +0100 +++ /var/tmp/diff_new_pack.P21172/_new 2009-01-30 00:36:40.000000000 +0100 @@ -1,5 +1,5 @@ # -# spec file for package yast2-core (Version 2.18.2) +# spec file for package yast2-core (Version 2.18.3) # # Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany. # @@ -19,12 +19,12 @@ Name: yast2-core -Version: 2.18.2 +Version: 2.18.3 Release: 1 License: GPL v2 or later Group: System/YaST BuildRoot: %{_tmppath}/%{name}-%{version}-build -Source0: yast2-core-2.18.2.tar.bz2 +Source0: yast2-core-2.18.3.tar.bz2 Prefix: /usr # obviously BuildRequires: gcc-c++ @@ -95,7 +95,7 @@ Stanislav Visnovsky <visnov@suse.cz> %prep -%setup -n yast2-core-2.18.2 +%setup -n yast2-core-2.18.3 %build %{prefix}/bin/y2tool y2autoconf @@ -181,6 +181,9 @@ %doc %{_datadir}/doc/yastdoc /usr/share/YaST2/data/devtools/bin/generateYCPWrappers %changelog +* Thu Jan 29 2009 aschnell@suse.de +- added dbus client agent (required for bnc #464453) +- 2.18.3 * Mon Jan 26 2009 mvidner@suse.cz - Fixed the D-Bus access policy (bnc#468390, CVE-2008-4311). - 2.18.2 ++++++ yast2-core-2.18.2.tar.bz2 -> yast2-core-2.18.3.tar.bz2 ++++++ ++++ 35774 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agent-dbus/conf/dbus.scr new/yast2-core-2.18.3/agent-dbus/conf/dbus.scr --- old/yast2-core-2.18.2/agent-dbus/conf/dbus.scr 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-core-2.18.3/agent-dbus/conf/dbus.scr 2009-01-27 11:14:24.000000000 +0100 @@ -0,0 +1,9 @@ +/** + * File: + * dbus.scr + * Authors: + * Arvin Schnell <aschnell@suse.de> + */ +.dbus + +`ag_dbus() diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agent-dbus/conf/Makefile.am new/yast2-core-2.18.3/agent-dbus/conf/Makefile.am --- old/yast2-core-2.18.2/agent-dbus/conf/Makefile.am 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-core-2.18.3/agent-dbus/conf/Makefile.am 2009-01-27 11:14:42.000000000 +0100 @@ -0,0 +1,7 @@ +# +# Makefile.am for core/agent-dbus/conf +# + +scrconf_DATA = dbus.scr + +EXTRA_DIST = $(scrconf_DATA) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agent-dbus/doc/Makefile.am new/yast2-core-2.18.3/agent-dbus/doc/Makefile.am --- old/yast2-core-2.18.2/agent-dbus/doc/Makefile.am 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-core-2.18.3/agent-dbus/doc/Makefile.am 2009-01-27 11:15:24.000000000 +0100 @@ -0,0 +1,16 @@ +# +# Makefile.am for core/agent-dbus/doc +# + +SUBDIRS = + +builtin = $(srcdir)/../src/DbusAgent.cc +hbuiltin = ag_dbus.html +$(hbuiltin): $(builtin) + `pkg-config --variable=ybindir yast2-devtools`/makebuiltindocs -t "SCR Dbus agent functions" -a $(builtin) > $@.new + mv $@.new $@ + +compdir = $(yastdocdir)/components +comp_DATA = $(hbuiltin) + +CLEANFILES = $(hbuiltin) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agent-dbus/Makefile.am new/yast2-core-2.18.3/agent-dbus/Makefile.am --- old/yast2-core-2.18.2/agent-dbus/Makefile.am 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-core-2.18.3/agent-dbus/Makefile.am 2009-01-27 11:13:49.000000000 +0100 @@ -0,0 +1,5 @@ +# +# Makefile.am for core/agent-dbus +# + +SUBDIRS = conf doc src diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agent-dbus/src/DbusAgent.cc new/yast2-core-2.18.3/agent-dbus/src/DbusAgent.cc --- old/yast2-core-2.18.2/agent-dbus/src/DbusAgent.cc 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-core-2.18.3/agent-dbus/src/DbusAgent.cc 2009-01-29 15:13:13.000000000 +0100 @@ -0,0 +1,187 @@ +/* + * File: DbusAgent.cc + * + * Authors: Arvin Schnell <aschnell@suse.de> + */ + +#include "config.h" + +#include <YCP.h> +#include <ycp/y2log.h> + +#include "DbusAgent.h" + + +DbusAgent::DbusAgent() +{ + y2milestone("connecting dbus"); + + dbus_error_init(&error); + + connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); + if (dbus_error_is_set(&error)) + { + y2error("dbus_bus_get failed (%s)\n", error.message); + dbus_error_free(&error); + } + + if (connection == NULL) + { + y2error("connecting dbus failed"); + } +} + + +DbusAgent::~DbusAgent() +{ +} + + +YCPValue +DbusAgent::Read(const YCPPath& path, const YCPValue& arg, const YCPValue&) +{ + y2debug("Read(%s)", path->toString().c_str()); + + if (path->isRoot()) + { + ycp2error("Read() called without sub-path"); + return YCPNull(); + } + + const string cmd = path->component_str(0); // just a shortcut + + return YCPError(string("Undefined subpath for Read(") + path->toString() + ")"); +} + + +YCPBoolean +DbusAgent::Write(const YCPPath& path, const YCPValue& value, + const YCPValue& arg) +{ + y2debug("Write(%s)", path->toString().c_str()); + + if (path->isRoot()) + { + ycp2error("Write() called without sub-path"); + return YCPBoolean(false); + } + + const string cmd = path->component_str(0); // just a shortcut + + ycp2error("Undefined subpath for Write(%s)", path->toString ().c_str ()); + return YCPBoolean(false); +} + + +YCPValue +DbusAgent::Execute(const YCPPath& path, const YCPValue& value, + const YCPValue& arg) +{ + y2debug("Execute(%s)", path->toString().c_str()); + + if (path->isRoot()) + { + return YCPError("Execute() called without sub-path"); + } + + if (value.isNull()) + { + return YCPError(string("Execute(")+path->toString()+") without argument."); + } + + const string cmd = path->component_str(0); // just a shortcut + + if (cmd == "method") + { + /** + * @builtin Execute(.dbus.method, map params, list args) -> boolean + * + * params must contain parameters for dbus_message_new_method_call() + * and args must contain arguments for dbus method call. + */ + + if (!connection) + return YCPError("dbus connection failed"); + + if (!value->isMap()) + return YCPError("value not a map"); + + if (!arg->isList()) + return YCPError("arg not a list"); + + YCPMap tmp1 = value->asMap(); + + YCPValue destination = tmp1.value(YCPSymbol("destination")); + if (!destination->isString()) + return YCPError("Missing or wrong type for 'destination'"); + + YCPValue path = tmp1.value(YCPSymbol("path")); + if (!path->isString()) + return YCPError("Missing or wrong type for 'path'"); + + YCPValue interface = tmp1.value(YCPSymbol("interface")); + if (!interface->isString()) + return YCPError("Missing or wrong type for 'interface'"); + + YCPValue method = tmp1.value(YCPSymbol("method")); + if (!method->isString()) + return YCPError("Missing or wrong type for 'method'"); + + DBusMessage* message = dbus_message_new_method_call(destination->asString()->value_cstr(), + path->asString()->value_cstr(), + interface->asString()->value_cstr(), + method->asString()->value_cstr()); + if (NULL == message) + { + return YCPError("dbus_message_new_method_call() failed"); + } + + DBusMessageIter args; + + dbus_message_iter_init_append(message, &args); + + YCPList tmp2 = arg->asList(); + for (YCPList::const_iterator it = tmp2.begin(); it != tmp2.end(); ++it) + { + const YCPValue& tmp3 = *it; + + if (tmp3->isString()) + { + const char* param = tmp3->asString()->value_cstr(); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, ¶m)) + return YCPError("dbus_message_iter_append_basic() failed"); + } + else if (tmp3->isBoolean()) + { + bool param = tmp3->asBoolean()->value(); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_BOOLEAN, ¶m)) + return YCPError("dbus_message_iter_append_basic() failed"); + } + else + { + return YCPError("Unsupported type"); + } + } + + DBusMessage* reply = dbus_connection_send_with_reply_and_block(connection, message, -1, &error); + + dbus_message_unref(message); + + if (dbus_error_is_set(&error)) + { + dbus_error_free(&error); + return YCPError("dbus_connection_send_with_reply_and_block() failed"); + } + + if (reply == NULL) + { + return YCPError("dbus_connection_send_with_reply_and_block() failed"); + } + + dbus_message_unref(reply); + + return YCPBoolean(true); + } + + return YCPError(string("Undefined subpath for Execute(") + path->toString() + ")"); +} diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agent-dbus/src/DbusAgent.h new/yast2-core-2.18.3/agent-dbus/src/DbusAgent.h --- old/yast2-core-2.18.2/agent-dbus/src/DbusAgent.h 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-core-2.18.3/agent-dbus/src/DbusAgent.h 2009-01-29 12:54:01.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * File: DbusAgent.h + * + * Authors: Arvin Schnell <aschnell@suse.de> + */ + +#ifndef DbusAgent_h +#define DbusAgent_h + + +#include <dbus/dbus.h> + +#include <ycp/YCPValue.h> +#include <scr/SCRAgent.h> + + +/** + * @short SCR Agent for DBus commands. + * + * aschnell: WARNING: This agent was written in a hurry for exactly one single + * purpose (acquire global HAL interface lock). Likely use for other commands + * is not possible but I'm confident the agent can be extended at the + * sacrifice of changing the API. + */ +class DbusAgent : public SCRAgent +{ + +public: + + DbusAgent(); + ~DbusAgent(); + + /** + * Read data + */ + virtual YCPValue Read(const YCPPath& path, const YCPValue& arg = YCPNull(), const YCPValue& opt = YCPNull()); + + /** + * Write data + */ + virtual YCPBoolean Write(const YCPPath& path, const YCPValue& value, + const YCPValue& arg = YCPNull()); + + /** + * Execute a command + */ + virtual YCPValue Execute(const YCPPath& path, const YCPValue& value = YCPNull(), + const YCPValue& arg = YCPNull()); + + /** + * Get a list of all subtrees + */ + virtual YCPList Dir(const YCPPath& path) { return YCPList(); } + +private: + + DBusConnection* connection; + DBusError error; + +}; + + +#endif // DbusAgent_h diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agent-dbus/src/Makefile.am new/yast2-core-2.18.3/agent-dbus/src/Makefile.am --- old/yast2-core-2.18.2/agent-dbus/src/Makefile.am 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-core-2.18.3/agent-dbus/src/Makefile.am 2009-01-27 12:49:10.000000000 +0100 @@ -0,0 +1,18 @@ +# +# Makefile.am for core/agent-dbus/src +# + +AM_CXXFLAGS = -DY2LOG=\"agent-dbus\" + +plugin_LTLIBRARIES = libpy2ag_dbus.la + +libpy2ag_dbus_la_SOURCES = \ + Y2CCDbusAgent.cc \ + DbusAgent.cc DbusAgent.h + +libpy2ag_dbus_la_CPPFLAGS = @DBUS_CFLAGS@ +libpy2ag_dbus_la_LDFLAGS = -version-info 2:0 +libpy2ag_dbus_la_LIBADD = @AGENT_LIBADD@ \ + @DBUS_LIBS@ + +INCLUDES = @AGENT_INCLUDES@ diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agent-dbus/src/Y2CCDbusAgent.cc new/yast2-core-2.18.3/agent-dbus/src/Y2CCDbusAgent.cc --- old/yast2-core-2.18.2/agent-dbus/src/Y2CCDbusAgent.cc 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-core-2.18.3/agent-dbus/src/Y2CCDbusAgent.cc 2009-01-27 11:16:28.000000000 +0100 @@ -0,0 +1,17 @@ + + +/* + * Author: Arvin Schnell <aschnell@suse.de> + */ + + +#include <scr/Y2AgentComponent.h> +#include <scr/Y2CCAgentComponent.h> + +#include "DbusAgent.h" + + +typedef Y2AgentComp<DbusAgent> Y2DbusAgentComp; + +Y2CCAgentComp<Y2DbusAgentComp> g_y2ccag_dbus("ag_dbus"); + diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/agents-perl/doc/ycp-pm-pod.html new/yast2-core-2.18.3/agents-perl/doc/ycp-pm-pod.html --- old/yast2-core-2.18.2/agents-perl/doc/ycp-pm-pod.html 2009-01-26 14:04:49.000000000 +0100 +++ new/yast2-core-2.18.3/agents-perl/doc/ycp-pm-pod.html 2009-01-23 20:00:39.000000000 +0100 @@ -4,7 +4,7 @@ <head> <title>ycp - a Perl module for parsing and writing the YaST2 Communication Protocol</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> -<link rev="made" href="mailto:root@localhost" /> +<link rev="made" href="mailto:feedback@suse.de" /> </head> <body style="background-color: white"> @@ -104,31 +104,36 @@ <p>A PerlYCPValue cannot represent a term but only a term is allowed to initialize an agent in a .scr file. Therefore <a href="#parseterm">ParseTerm</a> is provided.</p> <dl> -<dt><strong><a name="string_integer_boolean" class="item">string, integer, boolean</a></strong></dt> +<dt><strong><a name="string_integer_boolean" class="item">string, integer, boolean</a></strong> <dd> <p>Stored as a scalar.</p> </dd> -<dt><strong><a name="list" class="item">list</a></strong></dt> +</li> +<dt><strong><a name="list" class="item">list</a></strong> <dd> <p>Stored as a reference to a list of PerlYCPValues.</p> </dd> -<dt><strong><a name="map" class="item">map</a></strong></dt> +</li> +<dt><strong><a name="map" class="item">map</a></strong> <dd> <p>Stored as a reference to a map of PerlYCPValues.</p> </dd> -<dt><strong><a name="path" class="item">path</a></strong></dt> +</li> +<dt><strong><a name="path" class="item">path</a></strong> <dd> <p>Stored as a reference to a string (starting with a "." as expected).</p> </dd> -<dt><strong><a name="nil" class="item">nil (void)</a></strong></dt> +</li> +<dt><strong><a name="nil" class="item">nil (void)</a></strong> <dd> <p>Stored as an undef.</p> </dd> +</li> </dl> <p> </p> diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/configure.in new/yast2-core-2.18.3/configure.in --- old/yast2-core-2.18.2/configure.in 2009-01-26 14:02:45.000000000 +0100 +++ new/yast2-core-2.18.3/configure.in 2009-01-29 17:14:12.000000000 +0100 @@ -1,9 +1,9 @@ dnl configure.in for yast2-core dnl -dnl -- This file is generated by y2autoconf 2.17.6 - DO NOT EDIT! -- +dnl -- This file is generated by y2autoconf 2.18.0 - DO NOT EDIT! -- dnl (edit configure.in.in instead) -AC_INIT(yast2-core, 2.18.2, http://bugs.opensuse.org/, yast2-core) +AC_INIT(yast2-core, 2.18.3, http://bugs.opensuse.org/, yast2-core) dnl Check for presence of file 'RPMNAME' AC_CONFIG_SRCDIR([RPMNAME]) @@ -18,7 +18,7 @@ AM_INIT_AUTOMAKE(tar-ustar -Wno-portability) dnl Important YaST2 variables -VERSION="2.18.2" +VERSION="2.18.3" RPMNAME="yast2-core" MAINTAINER="Martin Vidner <mvidner@suse.cz>" @@ -351,6 +351,10 @@ agent-system/testsuite/tests/Makefile agent-system/testsuite/Makefile agent-system/Makefile +agent-dbus/conf/Makefile +agent-dbus/doc/Makefile +agent-dbus/src/Makefile +agent-dbus/Makefile agent-any/src/Makefile agent-any/doc/Makefile agent-any/testsuite/config/Makefile diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/Makefile.am new/yast2-core-2.18.3/Makefile.am --- old/yast2-core-2.18.2/Makefile.am 2009-01-26 14:02:45.000000000 +0100 +++ new/yast2-core-2.18.3/Makefile.am 2009-01-29 17:14:12.000000000 +0100 @@ -214,4 +214,4 @@ test ! -f $(srcdir)/po/Makefile || $(MAKE) -C po checkpo # test ! -f $(srcdir)/po/Makefile || $(MAKE) -C po checkpo make-pox # Contents of ./SUBDIRS -SUBDIRS = liby2util-r liby2 libycp liby2dbus libscr agent-dummy scr agent-system agent-any agent-ini agent-modules agent-resolver agents-non-y2 agents-perl wfm agent-process base autodocs dbus +SUBDIRS = liby2util-r liby2 libycp liby2dbus libscr agent-dummy scr agent-system agent-dbus agent-any agent-ini agent-modules agent-resolver agents-non-y2 agents-perl wfm agent-process base autodocs dbus diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/SUBDIRS new/yast2-core-2.18.3/SUBDIRS --- old/yast2-core-2.18.2/SUBDIRS 2008-11-27 11:44:15.000000000 +0100 +++ new/yast2-core-2.18.3/SUBDIRS 2009-01-27 11:16:56.000000000 +0100 @@ -1 +1 @@ -liby2util-r liby2 libycp liby2dbus libscr agent-dummy scr agent-system agent-any agent-ini agent-modules agent-resolver agents-non-y2 agents-perl wfm agent-process base autodocs dbus +liby2util-r liby2 libycp liby2dbus libscr agent-dummy scr agent-system agent-dbus agent-any agent-ini agent-modules agent-resolver agents-non-y2 agents-perl wfm agent-process base autodocs dbus diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/yast2-core-2.18.2/VERSION new/yast2-core-2.18.3/VERSION --- old/yast2-core-2.18.2/VERSION 2009-01-26 13:55:22.000000000 +0100 +++ new/yast2-core-2.18.3/VERSION 2009-01-29 15:15:50.000000000 +0100 @@ -1 +1 @@ -2.18.2 +2.18.3 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@Hilbert.suse.de