 Thank you. So I'm going to talk about Propeller, which is a kind of configuration management system that I built myself because it was kind of too hard to figure out how to use Chef or Puppet or something like that. You know, I thought I could read all their documentation or I could just write my own. And this was working yesterday, and of course now it's not, isn't that lovely? So Propeller's written in Haskell. If I can ever get the display to work, there will be Haskell code and there will be type errors, which are to be expected. Yay! Okay! It's got a website. I believe that might be it. This is my Propeller config file. So it's a Haskell program. It has some hosts in it which are the ones that I personally own and maintain. We're going to work today mostly on this host because it's kind of a throwaway host. And what I want to do is set up a quick web server using Docker. So this is a Docker, it's a Propeller's based on properties. Each of these lines with an add in front of it, or an ampersand in front of it, is a property of this host. And Propeller just goes off and makes sure that the host meets all these properties, which are defined using Haskell code. So I want to turn this web server property. I need to turn off this one because it's also using port 80. It's my, I'm traveling around. I want to get an SSH into the server. So I put a SSH port 80. If I put a bang in front instead of the ampersand, I'm sorry, if I put a bang in front instead of the ampersand, it disables the property. So I can now save this. Help her to spin on that host. Hello. Okay. So then Propeller goes off and builds itself. Oh, no, there's a type error. So this is actually a good thing. But here it says, can't match except a type of revertable property with actual type property. So the problem here is that I reverted this property, but Propeller doesn't know how to undo. There's a web server, there's a SSH listening on this port. So let's tell it how to disable it. Disable. Okay. File contains line though. We want it to lack the line. It's not listening on that port. It's a revertable property. Don't ask why I have to repeat it here. There will be an explanation about in Haskell. Okay. So thank you. Okay. What did I need to do? I'll just build it and let it tell me. What are? Oh, I see. Okay. So let's see if it works now. I think it built. So it's probably going to work. It's now signed it or it's not signing it using my GPG key because it's pushing to a Git repository. And the other host is going to pull from that repository and verify it using my key to make sure that I'm not getting somebody else modifying my hosts. So all my configuration is public and Propeller just operates using Git. So now it's gone off to Client.net.net, which is my server, and it's checking all its properties. And now it's pulling in the Docker image that I pulled it to use. So it's going to have to download it. This is where course demos get dicey. So while it's doing that, like I said before, I wrote it because it was easier to write on my own code and to try to figure out how a pub owner or a chef or something like that works and why not. You kind of learn a lot about something just by going off and doing it. I might hit Ctrl C here in a minute because Docker is being slow today. I probably should have ran this before and let it pre-cache the image. But I guarantee you that it will work. I really think that's about everything I wanted to show, although let's see. I'll just keep it running so maybe I can get to the end and it will be working. Oh, here's something else that's actually kind of cool. So I have this web server property, but I haven't set up the DNS yet. So let's see. How about... That seems like a reasonable name to put in the DNS. And that's actually all that I need to do. I can now go to a propeller. Diatom happens to be my DNS server. And so I have to tell it is, oh, I've got a DNS server now. And so everything is all kind of meshed together. You don't have to go worry about modifying different files. It will just, you know, figure out everything. And I don't even have to go manually do this. It will update every half an hour anyway from the remote config. And yeah, I think you can probably ping below world.net about now and it should work. Okay, awesome. So you know that it works to that degree. And I guarantee you the Docker stuff also works. I showed you how you can revert a property by putting a bang in front of it. And when I'm done with this demo, I'll just go in and put a bang back in front of that web server, and then it will go and delete the Docker image and that kind of thing. So that's really all there is to it is Haskell, but it's not hard Haskell. I haven't mentioned the M word in this talk, for example. And I think that's all I need to say. Unless somebody has a question, I think I have maybe two or three minutes. I don't know. It let get into its thing. I didn't really, yeah, I don't know. It's actually provisioning the Docker container now. So it has to of course go off and download security updates because I my propeller configuration, I have standard, you know, that I like to just build from Debbie and even other Docker images. Why should I go and bother running a Docker file and have this perfectly fine configuration language written in Haskell? I can just say, oh, make it run on a stable or stable, make it have security updates, make it auto update in this period. I could also mention that while I'm writing, while I've written propeller, which is about 6,000 lines of Haskell code with about 3,000, I think of those lines being specific to propeller and the rest being little libraries that are perfectly generic, I accidentally reimplemented init because it needs to run in the Docker image and say, well, the Docker, the property for this web server is down here and it says, app services installed and running Apache 2. So the propeller just says, well, if Apache 2 isn't running, I better go start it. So I said run it. And also there's another one where you can say, oh, I have a property run something every half an hour, run something every day, whenever I don't care when. Whoops, that was an icon. That was 200 lots of code. So it's kind of weird how this is happening. I think you get up there on top of a tower of abstraction and Haskell code and fun stuff and these things become sort of easy. And I think now I'm almost out of time. One more question? Yes. That's okay. This is only for my own personal use and anyone who's crazy enough to go off and propeller has this thing where you normally operate inside a propeller directory and your home directory or wherever you really want to put it. It has all those sorts of propellers. You can go back on it in any way that you like. This is a 10% or a 1% or something project for me. It's not, you know, it's not a big important thing. It's just something I made for my own use. And if somebody else wants to, you know, but it's not here to take over the world. It's here to take over my systems and make them happy. You have to put a bang. And of course, yes, you may. That's right. And that's kind of odd. You would have to have state otherwise. And I don't want, I want propeller to be fairly stateless. Right. So I've thought about this. That's one thing. Another thing is even in this example, I had the problem with two services on the same port. And propeller, I would love to be able to detect that in a type safe manner so the Haskell compiler can tell me if I accidentally do that. I haven't gotten around to figure out a good way to do that yet. But there's all kinds of fun, you know, options. This web server publishes the outside, it's a Docker image that publishes what is on the outside, very WW inside the image. So now I could go in. Let me see, go back up here. I have a time. Please just tell me if I am, because I'm coding. Okay, thank you. Is that right? No. Let's see this. Yeah. No, wrong one. And the other one's still running. I think propeller won't let me run two instances at once, but in a few minutes you can go to the web server and see the world. So, okay, thanks. One of the next one. Sorry, I think the biggest delaying factor is actually me. Next up, Malga with Arriero. And I'll totally come back again in a moment. It's not showing what it showed like half an hour ago. I tested this earlier. Okay. Yay. So Arriero is a tool for maintaining a lot of packages. If you maintain them in Git. So it only works for Git. It doesn't work for other version control systems or other ways of maintaining packages. I'm not, it's not the Git. It's just, if you use Git build package. So if you have your package in Git. The idea of the tool is to simplify all the tasks that you have to do that are automatable. Things that are not brain using. Oh, this is not the window I wanted to show. I wanted to start in the other desktop. So it has a bunch of commands. Clone, list, pull, push, update. I will show a few of those. I would start with clone. So if you have an existing Git repo for a package, as I said, this uses Git build package. So it has to be a package that works with Git build package. It supports several different overlays. So several different configurations of how you structure your package. But it needs to use Git build package. So I clone this and it downloaded the packages space arrow. It's a game that I maintain. It's not relevant for the talk. So it created this directory. And now if I ask for status of space zero, it will tell me that it has a new option version. So I will do update. I forgot the dash B. I used to complain that it was too noisy and I made it quiet. And now if I don't say dash B, it's too quiet. But yeah. So now it already has the new option version. And so if I change into the directory and look at the change of, it already has new option release. It already created the change of. And yeah. So the new version is there. This uses cow builder. This is the reason that it's not in testing currently because cow builder was removed from testing. And so Arriera was also removed from testing. But I am hoping that we can fix that and get cow builder into testing. Yeah, it doesn't build. I knew it in advance that it wouldn't build. It's fine. There's a patch that hasn't been applied upstream. And so it needs to be like refreshed. But I'm not going to do that in the demo. I want to show another thing. So that was for like one package. I cloned the package. I updated the package. I was trying to build the package but it failed. Now, I also have a lot of packages for Cinnamon. So those packages for Cinnamon are in a file that I have ArrieraCinam.com that has only the packages for Cinnamon. So if I list the status for all of them, the dash A means all the packages in that file. Well, this seems to be slower than it used to be. So it will list the status of all the packages. The interesting ones are not yet there. So for example, here it says this package has been built but not signed because I built it earlier today but I didn't upload it yet. Or these ones say that are unreleased because I've been making changes to them but I didn't build them. So I can, for example, build all the ones that are unreleased. So which ones do I need to build? Cinnamon, Cinnamon Session, CIS. So Cinnamon, Cinnamon Session, and CIS. And I think those were the ones that I wanted to build. And setting things. So I will now start building those. As you may have noticed, it updates the co-builder instance every time. So that has an updated instance. And now it's building. So I asked it to build all those packages. If there are internal dependencies, it will resolve those. I will show the configuration file while this is building. So, for example, here Cinnamon screensaver depends on Cinnamon desktop. So if I'm asking this, I'm asking it to build these packages. It will build them in the right order. And in order for that to work, I need to upload them to an internal repo and it also can do that. So if I need to do that, I can just upload them to the internal repo and it will do in the right order. So you need, obviously, to specify this because it's, well, not obviously, but it's not yet so intelligent that it can realize the dependencies. It could be, but it's not yet. But if you specify this, it will be in the right order. So this is now building. We will let it build. But I had one that was already built and just ready to be uploaded. So I'm going to do that now. So here I'm using the exact command which can operate on any packages and can receive, like here it's receiving the changes file and can receive a bunch of different fields that I may want to use. In this case it's the changes file, but I could want to operate on many variables on the packages. And so which one was the one that I wanted to upload? Contra center, right? Builds are not signed. Contra center. So let's sign and upload. Cinnamon, Contra center. Yeah, and it's uploading. So I did it for one package, but I could have done it for like all the packages. And yeah, if I had like a catcher of the key, I wouldn't have to write my password every time. Otherwise I need to write my password every time for each package. Yeah, and that's basically it. I have time for maybe one question? No? No questions? Okay, thank you very much. While we change, next up is Pabs. We check all the things. All of them. Not just some of them. All of them. Okay, so initially I started out with this as a P-Builder hook for checking all of the things. As you can tell it's not all that maintainable. No. So I started working on refactoring and rewriting it and it was equally as bad. But then I found out that Jacob Wilk has started also rewriting it at the same time in a Python script and a much more maintainable manner. This is what it looks like. It checks a bunch of things with a bunch of tools and you get a lot of output. And these are all the things that it didn't check because there was nothing matching. Yeah, as you can see it can check a lot of things and there are many, many more things that could be checked. If anyone wants to help with all those new things that would be great. Yeah, and the whole point of this is to check all of the things and fix all of the things before you upload or just the ones that you have time to fix. Okay. Yes. Eventually when Enrico is dead dry thing, it works. You might be able to automatically package and check some upstream code. Any questions? Where's the microphone? I was just wondering if the output could look a little better. That's all. I mean make it look like a scene or something. Why not? Because it's so many different tools and they all have different output formats. Something like that is suited for the fire hose project which aims to, it has a standardised machine readable output format for static analysis tools and so you could write a bunch of output passes for that generate that and then put that on the web, which is something that pull tag is working on. This is just something for humans to read and filter through. So this is the readme, hopefully it's readable. Yeah. It's pretty easy to, thanks to the work of Jacob, it's pretty easy to write new tests. One line of matching files and one line of command and in the future they'll be mind type matching as well. I haven't implemented that yet. So yeah, any other questions? This is in collab mate. Git repository is called checkoldthings.git with dashes. And please commit new tests. Right. We are more than halfway through. Now come the bits where I actually have to read. The next person up is Kumar Sukhani and he's presenting Lil Debbie. Hello. No, I'm done. Hello. Hello. What happened? We can start. Actually, I got two demos, so you only decide which you, which seems interesting to you. One is the little baby, which I have mentioned. It is running Debian on Android. And the other one is Alexi on Android. It's running to Android instances on an emulator that is ICS and jelly means simultaneously. So first or second? Actually, first I have shown already there were not many people at that time. So first one. So it's already running on my phone. I'm capturing my screen using Wi-Fi, so it's a bit slow. This is the UI of the app. I've already installed it because installation takes some time. So after you install it, you have to click on the install button. It will ask you related to which Debian version you have to install and which architecture or EL or ARM HF. After that, you will see this screen. Start Debian. I'm not sure if everyone can see that. After clicking on start Debian, the Debian, it doesn't start up the UI. Only it runs the command line. So I can use Android terminal application to trigger the command line commands. So it's not visible. So this is just the emulator application which can run the Debian commands and you can write scripts and all in this. It's totally in Debian root FS which has even Android devices mounted in it. That's it. So the other one is also running. This is ICS. No, it's Jelly Bean. Sorry. 4.1. I'm using LXC, Linux containers to run to instances. For that, I have made changes in the Linux kernel. I'm using 2.6.29, I guess. For that, I have to enable few LXC related features which are essential for running LXC. And I am using host as in stripped and right which is just, I'm just using adbd for it and it just starts the two container. It's a controlling host kind of thing. It doesn't run the GUI. And I have run this application which does the switching. So actually I have to run this as in service. So volume up or some combination of the keys for container one and other combination of keys for container two. So now it's ICS. 4.0. The kernel is the same. 2.6.29. That's it. Can you switch out of that container and into the other one? Yes. Yes. To the same way. And last but not least, since I managed to get my phone to stop, last but not least we have Abhishek Bhattacharji. Hopefully I pronounced that correctly. Giving us the DEP 11 generator and that's a GSOC project. And we'll just take a moment to set up. So this is, this was my GSOC project this year. It's basically adding a feature to DAC, which is Debian Archive Kit. So DEP 11 is Debian Enhancement Proposal Number 11. So it's about AppStream adding the feature of AppStream to Debian. So what basically this does is it is a generator. This piece of code is a generator which will generate some data according to the AppStream specifications. And so basically what I did was adding a command to DAC to generate data. So what you do is you run this command with a suite name option. You provide the suite name for which you want to generate the data. And you will just show you the usage. But so the main option is to add a suite name and the next is you can clear the caches. That means if you have some stale data residing in your service you can clear it using the minus C option. So I'll just show you what it does. So it will read some data, it takes some time. It will read the data. It's not working. This is good. Okay. So this is the command which you run. So it says reading data. It reads the data from the DAC database which is on a Postgres database. And it will print something that will print all the dev files that it is passing. So from the suite. And what it does is it takes the icons out of it and it saves the icon. It will also save the screenshot if it has got any. So now because I don't have much time so I'm just running it for the contrair component. So we have other tool that is non-free and main. So which are rather bigger. Main is kind of bigger which takes a lot of time. So it will also fetch out the screenshots and it will keep it in your server. So this is how the data looks. So this is it says the file, it has got a header. It says the version of the app stream and the suite name. Then it will have data for each component of the packages which we passed. So it will have various stuff like this. So for example it also supports localization. If you have a package name in several languages it will keep those data also. So this will have services files like this. This is AMD 64 architecture. So we have different files for different architectures. And the icons kind of this will look like this. So this is kind of what I save in the server. There will be icons and this is basically a naming. Can you see this? Yeah? No? Sorry? Yes? Yes. So this is the suite name. This is the component parts and then we have a naming specification for each directories so that when we are using the clear cache command we can find this stale data. So for example if I'm removing some package and I don't need data of that package anymore. So that's when I run the clear cache command and so that can find out which data it needs to remove. For that this naming specification has been used. So we have icons stored here. We also have screenshots which was a result of previous run for example this. So this is a screenshot of this package. So what I do is I fetch out it from the URL that has been provided in the files inside the package and then I again change the URL to our servers to the FTP servers so that it can be accessed by the user. Whoever using the data, the YML data that is being generated. So whoever is using that data can access these screenshots. That's how this data looks. So this can be used by software center like applications to make a software center like application basically. So it will have a library which will read this data that is being generated. So that libraries can be used by for example some application like apper or Ubuntu software center for example. They can use that library to read the data that is being generated and then it can provide various kind of information to the user with installing a package. It can provide it with screenshots, dependencies, binaries and libraries it installs and stuff like that. So that was that's it. Thank you. Many many thanks to everybody who came and presented and for similarly themed light entertainment there will be the lightning talks on Sunday evening just before the closing ceremony. See you there.