 So, hi and welcome. My name is Jan Kuppetz. I am a member of Sousa's YAS team, and I mostly work on software management, on the software management library, libzip, and the command line tool, zipper. This is what I will be talking about now. And the talk will consist of a quick overview of all zipper's commands. Well, before that, I would like to ask you how many of you didn't use zipper at all so far? OK, not many. OK, thanks. So a quick overview at the start. Most of the talk, I will dedicate to give you some tips and tricks that you may find useful, and maybe you don't know about them yet. And I will conclude with a list of some most interesting future plans that we plan to do in the timeframe of 11.2 release of Open Sousa. So let's start with the features. First, what is zipper? For those who don't know it, it's a command line software manager. I like taking screenshots of command line software, so I've made this beautiful one for you. It's showing zipper searching for keyword eclipse. It is an interface to libzip the software management library, which does all the package management, all the software management stuff, and zipper is just a command line interface to it. But nevertheless, it is several thousands of lines long, so even the interface is quite a lot of work. A few words about history. Zipper is two and a half years old. It started in August 2006 when Duncan McGregor started to write his own command line tool to test the libzip library. A few weeks later, Martin Wittner took the code and named the project Zipper. And a few months later, at the end of 2006, Zipper was first released in an Open Sousa 10.2 distribution. Open stable release is in Open Sousa 11.1, and it's version 1.0, and development releases are version 1.1. So to the features, we can categorize Zippers' commands into several categories. Most obviously, when you are managing software on your system, you want to manipulate the software repositories. You want to query for package information. You want to install, obviously. You want to manage updates and several special tasks. So when managing repositories, you want to be able to add them. Of course, you can edit the text configuration files in ETC Zip, ReposD, but with the command line tool, it's just more convenient. You can add them, remove them, list them, modify them, refresh, which means downloading package metadata from the repositories and compiling them into internal cache for quick access. This service stuff I will mention later, so I'll just keep it now, querying. You can search for packages by their names, descriptions, summaries, and so on. You can print detailed info about packages, patterns, patches, and so on. You can list all patterns, all packages, all patches that are available. You can query for dependency information. In fact, this is the only comment now, but I'll tell about future plans. The main thing you want to do is install. There is an install command. About this install, you recommend command I'll tell later. You want to manage updates. We have three approaches to update software on OpenSUSE. The first one, listing updates and updating is package-wise, where you just take new versions of packages that are installed, and if they are installable, then you just install them, the new versions. Another approach is patch-wise. This is specialty. Mostly OpenSUSE maintenance updates are delivered as patches. You have to have a special repository providing patches in order to use this feature. Distribution upgrade is a special update algorithm that can handle split packages, obsolete packages, and stuff like that. You usually use it to switch to newer release, stable release. Then you can protect packages to avoid changes like don't install specific package, don't remove specific package, don't upgrade it, and so on. For example, you can avoid updating kernel, for example, and then some special commands. Most interesting of these is this verify command. This will check the integrity of dependencies of your installed packages, and if there are some broken dependencies, it proposes to install packages in order to satisfy them. Zipper has quite a nice help system. If you just type Zipper, it will list all the global options and commands that is available to it. If you type Zipper help and specific command, you will get a specific command description and all the command-specific options that are available for the command. Also the main page is quite extensive. To the general features, I will talk in detail later about them. Just to name them now, Zipper has non-interactive mode, XML output. It can work on an alternative root directory. This feature is actually shared with YAST as well, because it's a libzip feature, not zip for feature, but it's quite interesting, so I wanted to mention it now. Zipper can work with many medium types, more details later. So now to the fun. The basic things that you want to do with Zipper is install software. The most obvious way is to type Zipper install and the name of a package, if you don't care about which version it will install from which repository and so on. But these are some special cases. One of my favorites is that you can install a plain RPM file with Zipper, either local or remote, or on any media type that libzip supports later on that. You can also install a specific version. Most of software managers can do that. I just wanted to show you how you do it in Zipper. You can install specific architecture as well. If you, for example, are compiling some source code and it is complaining about some missing library, you can try issuing a comment like this. And if the package metadata contains provide symbols with, for example, libcurl shared object, if you are lucky, you can get this library installed just with this command. One of the nice things are software patterns. You can install, for example, a lamp server with just this command. First you can search for patterns, just give the type option to the search command. It will list all the patterns available and then you can install with the same time option and the name of the pattern. The same for products and patches and packages as well, but package is the default here. This is one of my other favorite features of Zipper. You can install source packages and their build dependencies. This is very handy for developers. Just search for source packages in your repository, like with the pattern case. And if the repository contains source packages, it will list them and you use the package name in the source install command, it will install the source package and all of its build dependencies which are not installed yet. You can also, there is also option to install only the build dependencies or only the source package. This install new recommends command is a special feature of the underlying solver and it is handy for installing, for example, hardware drivers or language packages for already installed packages. For example, if you plug in a web camera, there is a good chance that this command will install the needed driver for the camera. Or if you have a graphics card and you add a repository providing the driver for the graphics card, it will propose to install this driver. Okay now, for managing repositories, Zipper has quite a lot of options to make this convenient for you. For example, you can modify several repositories once with these aggregate options all remote. You can modify repositories of specific media type and so on. For example, this command turns off automatic refresh for all repositories. This command turns on caching of RPM packages for all remote repositories like HTTP, FTP, Samba and so on. You can back up and restore repositories. You can export all your repos from the system with this command option onto the repos command and then you can restore them without repo and giving the repo file as argument or you can restore them on your new computer and so on. With each command, you can use temporary additional repository without having to add the repo permanently to your system. Just give the plus repo and repo URL. For many commands, there is this repo option available, which makes Zipper only load the specified repositories and work with them. For example, to do a distribution upgrade with only main open source repository and for example, Pacman repository, you can specify these two repositories just like this and perform this distribution upgrade. This one is handy if you don't have internet connection and you have many repositories without the refresh turned off. In that case, Zipper would check the repository if it's up to date. It would need connection for that. You can use this command to avoid that, avoid Zipper connecting at all. It can be handy. I should mention repository priorities here. Actually, I screwed that up a bit. Lipsy supports them, but Zipper ignores them now. I'll be fixing it for the next release. But it's a very handy thing. You can assign priorities to repositories and for example, the install command if you install specific package and even if there exists better version in a repository which has lower priority, it will take the older version from the repository with the higher priority. This can be handy if you have several repos providing the same packages and you trust one of the repos more, for example, for having more stable packages and so on. One of the nice things of Zipper is that you can use it from scripts and fromdents. There are several things enabling this. For example, the noninteractive mode in which you can specify this global option to any command and in that mode, Zipper won't ask for confirmation or for any user input on standard input and it will use default answers automatically. This option can be useful if you are working, for example, with your own repositories and you want to avoid questions or prompts like whether you want to import new repository key to the database and RPM file checks and so on. Then there are four verbosity levels. Quiet is obviously the one which you want to use when scripting normal is for common use out of scripts and frontends and verbose is for debugging, obviously. Then there is XML output for general output like normal messages, error messages, warnings and so on and also for prompts and some special output. All of this you can use in various, for example, graphical frontends. You can tell Zipper to use alternative root directory. This can be handy for creating a change-root environment or for building your own appliance actually Kiwi at least was using it in order to do this. I'm not sure if it still does. Just product creator as well. It can be handy, for example, also to if you specify an empty root directory and tell Zipper to install some package, first you have to add a repository there and then you tell Zipper to install some package, you will immediately see what other packages does that package depend on and how many megabytes it will add to that root directory when installed and how many it will need to retrieve. To the media types, here are some examples. For example, you can use an ISO image of, for example, SUSE CD as a software repository. The same for Samba share of most obviously HTTP, FTP, repose, also NFS shares and many others. Here are more examples. For example, you can plug in your USB hard drive and tell Zipper to install an RPM package from it just like this. You have to specify the device under which it is known to the system. All these URLs in this shape you can use also in YAST. It's a libzip feature. Okay, what do we have here? Another thing, like I mentioned with the root directory, you can do with this global option. This will avoid loading the installed packages to the memory, so Zipper will act as if no packages were installed on the system. If you tell it to install Zipper, you will immediately see what kind of packages does Zipper depend on. This can be useful for developers, for packages mostly. Okay, this is a workaround for a feature that isn't in libzip yet, but we are working on it. Many people request that we should be able to first download all the packages and then install them at once. You can do it actually with this workaround. You turn on caching of RPM files. Then you do a command, for example, install update or this upgrade or any other that installs packages with the dry run options. This is the test option to the RPM command. By this, all the needed packages get downloaded, but not installed, only tested, and then you do the actual install. They first get downloaded and then you get them installed for real. It's just a workaround, and currently it is being worked on the real support for this. Now for the services. This is actually a new thing, and it is not used widely as yet, but I just want to tell you what is it all about so that you can probably pick it up and provide services. The idea is to provide a list of repositories relevant for your architecture, for your target system on under one URL. You add this URL as service, and you get a list of services as a response, which Zipper uses to add or remove repositories. By doing this, you can leave the task of maintaining the relevant repositories on the service provider. You just do refresh services, and it removes obsolete repositories. It will add new repositories. Then you just choose several of them, enable them with modify repo command, and then you just use it like usual repositories. More information here. You don't need to write it down. The slides will be available on the FOSDEM side, I guess. That's it for the tricks, and now a few words about future plans. Next, we will be working to improve the current installation summary to include things like version changes, arc changes, vendor changes, to list recommended suggested packages, apart from the others, from the hard-required packages. We would like to include a viewing of change logs when updating packages, and maybe also dependents in three of the packages being installed. Then we will introduce a configuration file for Zipper. There is many things specific for Zipper that would be good if it were configurable. Then this option will be available everywhere, where currently repo option is used, and it will basically select packages from the repository specified, but it won't disable the others, so it can satisfy dependencies from the others. We will completely remake the info command to be more useful. I mentioned what provides query command. The plan is to add more dependency querying commands. These are similar to those that are available in RPM command line tool, but what's different is that this command will query also repositories, not only installed packages like RPM does. Well, then there will be some output polishing most wanted feature, the overall installation progress with estimated time, and these are the most important ones. The number of ideas is quite a huge, so we won't get angry if you take some of the ideas or bugs that are open and fix them and send as a patch. You can get all the information needed, how to contact us, what are the mailing list, what is our IRC channel, and so on, on this wiki page on OpenSUSE.org, so we'll be glad if you join us. Here are some links, Zipper's homepage, my blog where I post some interesting stuff about Zipper, and this is the Git repository where we host that project. So that's it. If you have some questions, how do I turn it on? It is on. Hi. Suppose I install Fresh OpenSUSE and start using Zipper to manage my software. By the way, does it get installed by default? Yes. Okay. Do they work together with just, I mean do they keep their information about installed packages in the same place? Yes. They actually both use the RPM database. So even if you install packages with RPM tool, they both will know about them. Also they share the libzip library, Zipper uses the same software management library that YAS does, so all the repositories known to Zipper are known to YAS, all the installed packages known to Zipper are known to YAS as well. So I can mix the usage of both? Yes, absolutely. Okay. Well, I have several more questions, but I don't know if I can occupy so much time. Okay. Okay. I'll be around, I'll be available here or at the OpenSUSE booth. So if you have more questions, just contact me. Thank you for your attention.