/srv/irclogs.ubuntu.com/2008/09/12/#ubuntu-installer.txt

=== superm1 is now known as superm1|away
=== superm1|away is now known as superm1
persiacjwatson: Thanks for the adjustment.  I'll poke when I hear about lpia ABI bumps.03:03
TheMusokirkland: Did you get a sponsor for your initramfs-tools fix?04:39
TheMusokirkland: Never mind, seems you did.04:42
NCommandeCan anyone answer a few questions on how to run Ubiquity, if possible, as a normal application. I ran ./configure && make, but it only generated site libraries, and didn't spit out anything that was directly executable AFAIK08:14
xivuloncjwatson in 268123 as mentioned yesterday mount -t ntfs does not work yet (no such device), mount.ntfs is ok08:21
xivulonI was expecting mount -t ntfs  to call mount.ntfs but it does not seem to be the case08:22
persiaNCommande: Have you looked in ./bin/08:22
evandNCommande: run debuild in the top directory, then install the deb.  However, note that ubiquity is intended to run on the desktop CD and will break horribly without the presence of /rofs.08:23
xivulonme goes out08:24
persiaevand: Is it a bug that it fails to complete the install with an empty blacklist set?08:24
persiaI can't imagine a use case for an empty blacklist, but thought the error was odd.08:25
evandugh, yeah, if it crashes in the blacklist code then it's my fault and should be filed as such ;)08:26
persiaevand: OK.  I'll pinpoint it and open a bug.  I worked around it by creating the correct manifests, but I'll try to link a branch with a naive fix to the bug.08:26
evandthanks, much appreciated08:28
NCommandeevand: /rofs?08:38
persiaNCommande: It's one of the mount points on a live image.08:40
persiaSpecifically the one of the pristine squashfs, without overlay, etc.08:40
NCommandeOh I see08:43
* NCommande rights now just wants to make sure the GUI code he wrote works correctly, and then worry about doing a real install08:43
persiaThe only way to test it is from the live environment.  I personally test under KVM, as I find that easiest.08:44
persiaAre you building a Xubuntu-specific UI?08:44
NCommandeNo, Kubuntu08:44
NCommandeQt -> KDE408:44
NCommandeFor some reason, I said I'd look into it when I was made a Kubuntu member >.>;08:45
persiaSo, test proceudre:08:50
persiafirst, boot the latest livecd08:50
persianext download (from somewhere: maybe ssh to your workstation) the updated ubiquity.08:50
persiaInstall the updated version.08:50
persiarun ubiquity (I use ubiquity -d so I can see the logs)08:51
NCommandeSounds like fun08:51
NCommande:-P08:51
* NCommande is going to be abusing his PPA it seems08:51
persiaWIth practice, you can get a cycle down to 5-10 minutes.08:51
NCommandesounds painful :-P08:52
NCommandeMaybe I can setup build-tools and friends on the liveCD08:52
persiaWell, it just adds incentive to get the changes right the first time.08:52
persiaI've not had much success with running ubiquity twice in the same session.  Seems that when ubiquity crashes, you need to manually remove hal locks, etc.  Easier to just reboot.08:53
NCommandeand it just gets better and better08:53
NCommandeoh well08:53
NCommandeIt shall be a learning experiment none the less08:53
evandI often hack on ubiquity from the live cd08:54
NCommandeI figuring that might be possible08:54
persiaevand: You don't encounter issues with HAL?08:54
evandWhat issues?08:54
persiaMight just be my images (which are full of other sorts of problems)08:54
persiaWell, if, for example, I do something that causes ubiquity to crash, running it again it complains about lockfiles.08:55
evandhrm08:55
persiaI can probably reproduce it if you need: I figured it fell well into the "don't do that then" category.08:55
evandyou may have to kill stray processes08:55
persiaThat might be it.08:56
persiaFor me, rebooting was the fast way to do that :)08:56
evandps aux | grep part -- see if partman is still spinning in the background08:56
evandheh08:56
* NCommande just sets up his Bazaar branch with his source08:57
NCommandeAny reason why the Bazaar repo uses such an old Knit frmat?08:57
NCommande*format08:57
persiaevand: Do you prefer conditional tests before execution, or exception processing when errors are encountered?08:57
evandit's an old repo and no one has bothered to update it08:57
evandpersia: I'm not picky.  Whatever best suits the situation.08:58
NCommandeso development isn't done there?08:58
persiaIf it is updated, it probably oughtn't be updated to be newer than that supported by bzr 1.3.108:58
persiaNCommande: Development is rarely done in a public repo: it's a means to share the code.08:58
evandNCommande: sorry, bad explanation.  ~ubuntu-installer/ubiquity/trunk is in fact where the development is done, it's just been around for a long time.08:59
evandpersia: any idea how I go about doing that?08:59
evandbzr upgrade <remote source> ?08:59
NCommandepersia: I figured as much, just wondering09:00
NCommandeany special rules I need to know like about copyright assignment or such on hacking on ubuquity09:00
persiaevand: I think you need to use scp, but I've never done it.  The guys in #launchpad have the answer.09:00
NCommandepersia: no, it should work remotely09:00
evandhttp://wiki.ubuntu.com/InstallerDevelopment - I don't think there's any copyright assignment policy in place, but best to check with cjwatson on that.09:00
NCommandearg09:01
NCommandevirtualbox doesn't work on current intrepid09:01
evandkvm is pretty awesome, I'd suggest giving it a go if your processor supports it09:01
NCommandeI have the hack installed for my computers BIOS to enable VTx09:02
NCommandeBut I haven't got a clue on how to get started with kvm09:02
evand`kvm -hda somefile.img -m 768 -no-quit -k en-us` or some variation of is what I generally use09:03
evandwhere somefile.img is generated by qemu-img create09:03
NCommandeI'll give it a spin09:03
NCommandeI just need to install kvm, right?09:03
evandhttps://wiki.ubuntu.com/kvm09:04
evandshould be a good starting point09:04
evandah, I stand corrected: https://help.ubuntu.com/community/KVM09:04
TheMusoUnless I need to test sound in a VM, I use libvirt.09:15
TheMusoVery useful to manage multiple vms.09:15
evandcjwatson: any objection to upgrading the repository format for ~ubuntu-installer/ubiquity/trunk?09:16
cjwatsonevand: none, I just haven't done it because bzr upgrade sftp:// takes bloody forever09:26
evandcjwatson: also, can you add usb-creator commits to the #ubuntu-installer CIA bot?  I've added the project to cia.vc.09:26
evandhahaha, ok09:26
cjwatsonI would expect it to take hours, for the duration of which you don't get to commit to the branch09:26
evandhm09:27
evandI'll plan to do it this evening (EST), and if anyone feels that I should hold off so they can commit, please let me know beforehand.09:28
persiaThis evening being real soon now, or in 18-20 hours?09:29
evand18-20 hours09:29
evandwell, 1609:30
persiaheh.  It's kinda late there :)09:30
evandJust out of curiosity, is it not possible to upgrade via bzr+ssh?09:30
evandearly, really :)09:31
cjwatsonnot yet09:31
evandok, noted09:31
cjwatsonor at least it doesn't seem to work all that well09:31
cjwatsonI believe that bzr 1.7 will add that09:31
evandcool09:31
cjwatsonbut at the moment, what bzr ends up doing is transferring every single file under .bzr back and forward several times, producing backup copies as well as for the actual upgrade09:32
cjwatsonwhich is why it's so incredibly slow09:32
cjwatsoneach of those has to wait for round-trip times as well I think, it doesn't seem pipelinable as it stands09:32
persiaIs it faster if run from somewhere network-near?09:32
cjwatsonsomewhat09:32
cjwatsonI think "faster" is the wrong word. "Less painfully slow".09:32
evandlol09:32
persiaOK.  Just wondering if it's worth asking for a run from either a machine in the DC or Ubuntuwire, rather than on an overseas link.09:33
cjwatsonso I've upgraded a few installer repositories as they annoy me, but preferentially the smaller ones09:33
cjwatsonyou could ask #launchpad to upgrade it locally09:33
evandmm, I think I'll try for that, assuming they can accomodate the time or stick it in cron.09:34
evandI swear, cia.vc is run off a toaster oven.09:34
cjwatsonlocally, it should be fast enough that we don't have to worry about timing09:34
cjwatsonI'd expect a minute or so at most09:35
evandah, good point09:35
cjwatsoncia.vc> annoying isn't it?09:35
cjwatsonI'm *trying* to save the bot change ...09:35
evandhahaha, yeah it took me a good 10 minutes to just create the project09:35
cjwatsonTheMuso: I'd use libvirt except that virt-manager's UI annoys me so much09:35
TheMusocjwatson: Ah, I use cli to start it. :)09:36
TheMusoubiquity doesn't have any ghost revisions by any chance? :)09:36
cjwatsonno :)09:36
cjwatsongrumble, lpia d-i failed to build09:36
persiaI know why it failed on lpia, and it's being sorted.09:37
TheMusoOh, and I've pushed some changes to casper trunk on launchpad, but launchpad is not reflecting them in the UI.09:37
persiaHaven't looked at ia6409:37
cjwatsonTheMuso: yeah, it won't09:37
cjwatsonpersia: sorted how?09:37
evandIs casper's bzr fixed?09:37
TheMusocjwatson: Fair enough.09:37
TheMusoevand: No.09:37
cjwatsonyou've always been able to push to it, somewhat09:37
evandfun09:37
cjwatsonI've fixed xivulon's mount -t ntfs thing, I think09:38
persiacjwatson: Actually shipping the additional d-i modules.  The problem was http://kernel.ubuntu.com/git?p=ubuntu/ubuntu-intrepid-lpia.git;a=commitdiff;h=5041792ac41d6c5425598a4995b20370e7a79bb109:38
cjwatson(enabled mount helpers in busybox)09:38
evandah, thanks for taking care of that09:38
cjwatsonpersia: oh dear goodness. When will the kernel team learn that they need to tell us about this shit?09:38
cjwatsonpersia: is the fix to revert that commit?09:38
persiaIt's being reverted.09:38
cjwatsonexcellent09:39
cjwatsonfeel free to whack the rebuild button on d-i when it is09:39
persiaI can't, but I'll deputise someone.09:39
cjwatsonpersia: ia64 is because linux-ports fails to build on ia64, and has done for months09:39
persiaOK.  That needs someone who cares about the ia64 kernel then.09:39
persiaAlso, while reverting the commit, the lpia kernel will probably have an ABI bump.  I've been promised this process will include an email to the installer team, as I suspect it will require a change to build/config/lpia.cfg.  Will it save any time to prepare that branch, or is it just as easy to process from the mail?09:41
cjwatsonit won't save any time to prepare the branch in advance09:50
cjwatsonit's a sed09:50
xivuloncjwatson any hint on previous posts?09:55
cjwatson09:38 <cjwatson> I've fixed xivulon's mount -t ntfs thing, I think09:55
cjwatson09:38 <cjwatson> (enabled mount helpers in busybox)09:55
xivulonah great, thanks a bunch, will resume tests tonight and let you know (davmor2 if you are around give it a go once the new busybox is up)09:57
TheMusoUnless anybody has some pressing casper changes they need to get in, I'd like to do an upload of casper to unbreak some accessibility profiles.10:05
cjwatsonnothing from me10:05
xivulonTheMuso, on a different subject, how are things with panic messages?10:14
TheMusoxivulon: Should be fixed for intrepid, but I have been so busy the past months with intrepid work, that I haven't yet done an SRU for hardy.10:18
NCommanderevand: which process did I have to kill to get ubiquity to work twice in the install?11:18
persiaNCommander: start by looking for partman.11:19
NCommanderI just had to kill hal-lock and it started11:20
persiaAfter that, start looking for anything with a higher process number than used by ubiquity.11:20
persiaAre you sure rebooting isn't easier?11:20
cjwatsonas evand said, running ubiquity twice in one session should not normally be a problem11:21
cjwatsonI've never heard of hal-lock sticking around before11:22
cjwatsonsometimes parted_server sticks around, but that's all11:22
cjwatsonI often run it successively - saves a lot of time when editing stuff on the fly11:22
persiaMaybe this is a new issue?  I always saw hal-lock sticking around.11:25
persia(well, since my images stopped being so broken that ubiquity couldn't run)11:25
fokaHappy Mid-Autumn Festival, everyone!  中秋节快乐! :-)11:40
=== NCommander is now known as mcasadevall
=== mcasadevall is now known as sonicmctails
=== sonicmctails is now known as NCommander
=== NCommander is now known as NCommander_
=== NCommander_ is now known as mcasadevall_
=== mcasadevall_ is now known as NCommander
kirklandTheMuso: kees did :-)  thanks!!!13:30
kirklandcjwatson: hi there, do you have a couple of minutes?  I'm trying to implement your suggestions for https://bugs.launchpad.net/ubuntu/+source/partman-target/+bug/26858014:27
kirklandcjwatson: i want to knock this out ASAP because of UI freeze :-/14:27
cjwatsonkirkland: yes14:28
kirklandcjwatson: sweet ... okay, the templates file....14:28
kirklandcjwatson: should i create an mdadm-udeb.templates with just the boot_degraded question?14:29
kirklandcjwatson: ie, is that the proper method for getting the question into the udeb?14:29
cjwatsonyou already need an mdadm.templates, right? don't duplicate it14:29
kirklandcjwatson: right, the question is already in there14:29
kirklandcjwatson: it's used for dpkg-reconfigure mdadm in a running system14:29
kirklandcjwatson: works there now...  just want to add the question into the installer14:30
cjwatsonkirkland: is there anything else in mdadm.templates that would need to be filtered out of the udeb?14:30
kirklandcjwatson: autocheck, mail_to, start_daemon14:30
kirklandcjwatson: i suppose those might be nice to actually ask, if someone is installing raid14:31
cjwatsonthen I'd recommend putting the boot_degraded question in a separate templates file; it doesn't matter what it's called14:31
cjwatsonlike debian/mdadm-boot-degraded.templates or something14:31
kirklandcjwatson: but raid installs then become somewhat significantly more conversational14:31
cjwatsondon't make them more conversational :)14:31
kirklandcjwatson: agreed14:31
kirklandcjwatson: okay, done.14:31
cjwatsonthen add that new .templates file to debian/po/POTFILES.in14:32
cjwatsonthen after dh_installdebconf in debian/rules, add this:14:32
cjwatson        echo >> debian/mdadm/DEBIAN/templates14:32
cjwatson        po2debconf debian/mdadm-boot-degraded.templates >> debian/mdadm/DEBIAN/templates14:32
cjwatson        po2debconf debian/mdadm-boot-degraded.templates > debian/mdadm-udeb/DEBIAN/templates14:33
cjwatsonsomething like that anyway14:33
cjwatsonas you can see you can just build up the templates file in the package's control area dynamically14:33
kirklandcjwatson: sounds good14:33
kirklandcjwatson: okay, so do i add the check.d directory to the debian/ dir, or the top level?14:33
cjwatsonan alternative approach would be to put that question only in mdadm-udeb.templates, and append that to debian/mdadm/DEBIAN/templates in much the same way14:33
cjwatsonI think the above might be clearer in this case though14:34
cjwatsonit doesn't matter. convention is the top level but it isn't mandatory14:34
cjwatsonif you put it at the top level, then you can use the install-rc script from other partman-* packages to install it14:34
kirklandcjwatson: that does sound better to me, the mdadm-udeb.templates14:34
cjwatson(without modifying it)14:34
cjwatsonkirkland: ok, then you can just echo >> debian/mdadm/DEBIAN/templates; po2debconf debian/mdadm-udeb.templates >> debian/mdadm/DEBIAN/templates14:35
cjwatsonto make sure it appears in both without having to duplicate it in the source14:35
cjwatsonjust keep debian/po/POTFILES.in up to date, and remember to run debconf-updatepo after changing the .templates14:36
kirklandcjwatson: its in the clean block14:36
cjwatsonwas it there already from the current package?14:36
kirklandcjwatson: yup14:36
kirklandcjwatson: last step of "clean" in the rules14:36
cjwatsonI generally prefer not to have it in clean myself, and to have the maintainer do it; saves on spurious timestamp diffs14:37
cjwatsonbut if it's there already, leave it14:37
kirklandcjwatson: k14:37
kirklandcjwatson: okay, so i put a check.d in the top level of mdadm source14:37
kirklandcjwatson: there's a _numbers file14:37
kirklandcjwatson: suggested value for, "05 root_on_raid" ...  ?14:38
kirklandcjwatson: this is an ordering, right?  i'm the only one14:38
kirklandcjwatson: so just leave some room for before and after?14:38
cjwatsonkirkland: hmm, I don't think there's any particular sequencing in check.d. I'd put it with crypto if I were you, which would make it 0714:39
kirklandcjwatson: 07 root_on_raid, okay14:40
cjwatsonit's not a big deal though, just controls which check will blow up first if multiple things are wrong *shrug*14:40
kirklandcjwatson: i called the script, root_on_raid14:40
cjwatsonsure, that's fine14:40
kirklandcjwatson: seemed to read sort of like "proper_mountpoints", etc.14:40
kirklandcjwatson: in that script, i borrowed some code from proper_mountpoints14:41
kirklandcjwatson: basically looking if / or /boot is on a device named /dev/md*14:41
kirklandcjwatson: i had:                                 db_input critical mdadm/boot_degraded || true14:41
kirklandcjwatson: i think you suggested:14:41
kirkland                                db_get mdadm/boot_degraded14:42
kirkland                                echo mdadm mdadm/boot_degraded boolean "$RET" | debconf-set-selections14:42
cjwatsonright, that's to go after the db_go14:42
cjwatsonjust transfers the setting into /target14:42
kirkland                        if [ "$mp" = "/" ] || [ "$mp" = "/boot" ]; then14:42
kirkland                                db_input critical mdadm/boot_degraded || true14:42
kirkland                                db_go || true14:42
kirkland                                db_get mdadm/boot_degraded14:42
kirkland                                echo mdadm mdadm/boot_degraded boolean "$RET" | debconf-set-selections14:42
kirkland                                break14:42
kirkland                        fi14:42
cjwatsonor, more strictly, queues it up to be transferred into /target once /target exists14:42
cjwatsonyep14:43
cjwatsonremind me how you're checking that the mountpoint in question is on RAID?14:43
kirklandcjwatson: okay, now what do I need to do to hook check.d/* to run?14:43
cjwatson'debian/install-rc check.d' in the install target in debian/rules; see any partman-* package14:44
kirklandcjwatson: http://pastebin.ubuntu.com/46227/14:44
kirklandcjwatson: ^^^ untested14:44
kirklandcjwatson: okay, i'll grab it from partman-target, where I got most of this14:44
cjwatsonlooks plausible14:44
cjwatsonoh, hmm14:44
kirklandcjwatson: k14:45
cjwatsonI think you might have to consume the rest of the output from the fstab.d scripts otherwise stuff will go wrong14:45
cjwatsonso found=0 up top, found=1 instead of break, and if [ "$found" = 1 ]; then continue; fi at the top of the while loop14:46
kirklandcjwatson: good suggestion, i'll do that14:46
cjwatsonjust to avoid stuff getting SIGPIPE. I can't remember whether that matters in this case but it certainly can do in other contexts14:46
kirklandcjwatson: that'll be more clear14:46
cjwatsonspecifically when you're reading from parted_server, things go badly wrong if you don't consume all the output14:46
kirklandcjwatson: okay, i'll need to install the check script into partman from mdadm14:47
cjwatsonmdadm-udeb, rather14:47
kirklandcjwatson: gotcha14:48
kirklandcjwatson: so should the install-rc bit be in a udeb-specific section of the rules?14:49
cjwatsonoh, maybe PACKAGE=mdadm-udeb debian/install-rc check.d14:49
cjwatsonthat'll force it to be copied into the right package14:49
* kirkland puts that neat trick in his back pocket14:50
kirklandcjwatson: okay, let me get a debdiff for spot-inspection14:51
kirklandcjwatson: to test this, I'll build the udeb, and scp it over to a running installation kvm, udpkg -i the udeb, and restart the partitioning?14:51
cjwatsonright, or even just udpkg -i before partitioning starts14:52
cjwatsonmdadm-udeb doesn't have a postinst, right?14:52
kirklandcjwatson: it does not14:54
cjwatsonok, that's good. If it did, you'd have to use udpkg --unpack as -i would run the postinst immediately.14:56
kirklandcjwatson: untested debdiff looks like: http://pastebin.ubuntu.com/46231/14:57
kirklandcjwatson: more changelogging to come14:58
cjwatsonkirkland: looks plausible. remember debian/po/POTFILES.in though14:59
kirklandcjwatson: right, okay, i manually pruned the generated .po changes15:00
kirklandcjwatson: and must have accidentally pruned that too15:01
cjwatsonok15:01
kirklandcjwatson: okay, i'll go test this15:01
kirklandcjwatson: thanks for your help15:01
kirklandcjwatson: okay, i that db_input action did not fire...  at what point in the partitioning would you have expected it?15:09
cjwatsonafter selecting finish15:09
cjwatsonyou can debug it by sticking set -x at the top15:10
cjwatsonoh, make sure it's executable too!15:10
cjwatsonyou might need to put chmod +x in debian/rules15:10
cjwatsonpartman-* packages don't need that because they're all native, but the executable bit isn't preserved on files added in the Debian diff15:10
cjwatson(this is perhaps not obvious)15:11
kirklandcjwatson: i bet that's it15:11
kirklandcjwatson: i should have remembered that15:11
kirklandcjwatson: i know your attention is elsewhere now, so just answer this question in time...  I am certain that the code path containing "db_input critical mdadm/boot_degraded" is getting executed...  but the question is not making it to the installer screen...  ideas?15:55
kirklandcjwatson: perhaps the question didn't make it into the debconf db?  how can I check that?15:56
cjwatsonoh15:57
cjwatsonof course, you're running it in a while loop with stdin coming from a pipe15:57
cjwatsondebconf uses stdio ..15:57
cjwatsonhave a look at the must_be_on_root function in partman-target's proper_mountpoints - you need to follow that model15:58
cjwatsoni.e. have the while loop output a list of things to act on (or nothing), and then iterate over that in a for loop that *doesn't* have piped stdin15:58
cjwatsonthis is considered a wart in debconf15:58
kirklandcjwatson: fooey :-)  okay.16:00
cjwatsonarchive-copier used to have a supremely ugly solution to this involving redirecting to fd 916:01
cjwatsonfortunately that abomination is long since dead16:01
kirklandthat's obfuscation ;-)16:01
cjwatsonhttp://bazaar.launchpad.net/~kamion/archive-copier/mainline/annotate/170?file_id=x_Colin_Watson_<colin.watson%40canonical.com>_Tue_Aug_10_16%3A59%3A47_2004_7462.3 lines 187-194 if you care16:04
superm1evand, how scriptable is this live usb creator going to be?  Will it be possible to call it outside the live environment?  Eg on normal ubuntu system w/ the cdimage as an argument?16:04
evandsuperm1: I eventually intend to write a console frontend, though I can probably get away with accepting arguments for the source, target, and persistence size now with the GTK UI16:07
evandhowever it does not download ISO files at the moment, and that's quite a large feature to add past FF.16:07
evandoh16:08
evandsorry, I misread16:08
evandI thought you were suggesting that cdimage.ubuntu.com was the argument.16:08
superm1evand, nah, well I ask because one of the things I'm going to be throwing together this month is something that will convert the recovery media ISO that we generate from  factory over to a USB image.  I started to put it together and came across the existence of this project that you are were trying to get ready for main16:08
evandsuperm1: it's in bzr if you'd like to have a look at the code to see if it's applicable to your project.16:09
evandlp:~ubuntu-installer/usb-creator/trunk16:09
superm1evand, okay thanks, i'll see.16:10
evandAnytime16:10
superm1evand, as it stands from my briefly reading, it looked like it had to be called while booted into the live cd.  is that the case?16:10
evandNot at all.  It only requires a CD or ISO to use.16:11
evandNothing extra aside from the obvious (HAL, D-BUS, GTK)16:11
superm1okay then this may be a lot more feasible.  I'll take a look.16:11
superm1given that you already mentioned HAL, probably a lot more intelligent than what I was starting to do w/ parsing /sys/block for devices and requiring the user to refresh16:12
evandheh, yikes16:25
evandyeah, this will automatically update the UI and its options based on the state of the drives, as well as automatically add new CDs and USB disks.16:26
CIA-50debian-installer: cjwatson * r962 ubuntu/ (build/config/lpia.cfg debian/changelog): Move lpia to 2.6.27-3 kernels.16:34
persiacjwatson: Please don't upload that yet: the binaries haven't published, so it will FTBFS (or I suppose we can press the button later)16:39
cjwatsonyep, I checked16:39
cjwatsonjust getting it into bzr for the meantime16:39
persiaOK.  I'm watching the build, and will let you know when it's published.16:40
kirklandcjwatson: dude, i'm definitely outside of the stdio pipe, mirrored must_be_on_root operation, definitely hitting the db_input critical call, but still not seeing the prompt16:42
cjwatsonkirkland: DEBCONF_DEBUG=developer may help you16:42
cjwatsonpersia: tell me when it hits NEW and I'll shove it through16:42
persiacjwatson: That's even better, as our archive-admin went to bed :)16:43
kirklandcjwatson: http://pastebin.ubuntu.com/46280/ fyi16:43
cr3is there any ssl support in the busybox environment? libssl, stunnel, etc.?16:50
cjwatsondoubt it16:52
cjwatsonoh, actually we must ship a libssl udeb16:52
cjwatsonlibcrypto0.9.8-udeb IIRC, basically just for use by openssh-*-udeb16:52
cr3cjwatson: hm, not quite libssl, so I probably won't be able to perform https connections16:54
cjwatsonno - why do you need that?16:54
cjwatson(busybox wget doesn't have https support anyway)16:55
cr3cjwatson: I wanted to submit test results during the installation process, but I guess I could support both secured and unsecured connections16:55
cr3if I wanted to submit to Launchpad, I wonder if that would be a feasible request16:56
kirklandcjwatson: interesting, when i run ./07root_on_raid manually, it does-the-right-thing, but not when it's called from partman16:57
kirklandcjwatson: how would I verify that the mdadm/boot_degraded question actually made it into the debconf database?17:04
kirklandcjwatson: actually, scratch that...  it's there when I run it by hand17:04
cjwatsonlet me get back to you after this meeting17:05
kirklandcjwatson: no prob17:05
kirklandcjwatson: fwiw, i have 2.5 hours, then I leave the office to catch a flight17:05
superm1evand, you i'm not sure if it was intended just because of your development process, but you have the glade file referenced directly within the tree, so when a deb get's built it's not usable17:54
evandargh17:56
evandI keep doing that by accident17:56
superm1might be best to set up a variable at the top perhaps17:57
superm1so glancing through, the app has the expectation that the drive you are going to use is already formated, so i take it you've decided that is a fair assumption?17:58
cjwatson... and mounted (I filed a bug about that)17:59
evandit's not a fair assumption, it just doesn't handle that case yet.18:00
superm1ah okay18:00
CIA-50usb-creator: evand * r10 usb-creator/usbcreator/ (backend.py gtk_frontend.py): Fixed paths.18:02
* evand pets CIA-50 18:02
superm1something else that you might want to consider doing, when you copy over the contents of the ISO to the flash drive, you might want to regenerate the UUID in .disk and the initramfs. so as to prevent confusion/slowness if someone happens to have a cd in the drive with the same .disk etc18:02
cjwatsonoh good, it worked18:02
evandsuperm1: ah, good call.  Noted18:03
superm1evand, in casper there's a script that I submitted sometime during hardy, a variant of it is what we've been using when making recovery media18:03
evandok18:04
superm1(for the exact same type of issue, where the recovery partition is always present when you put in the CD)18:04
cjwatsonkirkland: did you try DEBCONF_DEBUG=developer? can I see the output from it?18:07
cjwatson(boot with that on the kernel command line)18:07
cjwatsonkirkland: oh and FWIW you don't need the for loop, just do case $prompt in ... esac18:08
cjwatson(case's variable expansion semantics DTRT there)18:08
kirklandcjwatson: i tried the DEBUG thing, where does the output land?18:12
cjwatson/var/log/syslog18:12
cjwatsonyou'll get a BIG trace18:12
cjwatsonit's a hammer, but an exceedingly useful one18:12
kirklandcjwatson: one sec, i'll grab it18:13
persiacjwatson: linux-lpia hit new.  Please forgive the missing Architecture:all packages - it's a known build issue, but the fix isn't critical for either the alternate CD or the live image (I think).18:14
kirklandcjwatson: okay, db_input not found ...  do I suppose I need to source something to get the debconf functions?18:15
kirklandcjwatson: none of the other scripts in there have anything exotic sourced, just the /lib/partman/lib/base.sh18:16
kirklandcjwatson: http://pastebin.ubuntu.com/46313/18:21
cjwatsonkirkland: /lib/partman/lib/base.sh sources the debconf confmodule as the first thing it does18:24
kirklandcjwatson: good18:24
cjwatsonkirkland: can I see the *exact* script you're currently using?18:24
kirklandcjwatson: when I sh -x the script18:24
cjwatsonI have http://pastebin.ubuntu.com/46280/ but it's not that18:25
kirklandcjwatson: I get: RET=10 "mdadm/boot_degraded" doesn't exist18:25
kirklandcjwatson: sure18:25
cjwatsondon't run any of these scripts from the shell prompt18:25
cjwatsonit will not work properly and it will confuse you18:25
cjwatsonyou need to edit set -x into them and have partman run them18:25
kirklandcjwatson: http://pastebin.ubuntu.com/46319/18:26
cjwatsonDEBCONF_DEBUG=developer will not work in the script; you need to boot with it on the kernel command line18:26
cjwatsonit's checked by the frontend, not the confmodule18:26
kirklandcjwatson: didn't grok that, sorry18:27
cjwatsonthis is really weird, I can't figure it out18:28
kirklandcjwatson: let me post the full debdiff, just in case18:28
cjwatsoncould you explain to me exactly what you did? did you scp the udeb into the installer?18:29
kirklandcjwatson: yes18:29
kirklandcjwatson: udpkg -i *udeb18:29
cjwatsonok, I'd like the debdiff, sure18:29
kirklandcjwatson: then ran the partitioning18:29
cjwatsonif possible on non-pastebin so I can check for funny characters18:30
kirklandcjwatson: this one has the po poo : http://pastebin.ubuntu.com/46321/18:30
cjwatsonwhere is "date" coming from? it's not in your debdiff18:31
kirklandcjwatson: after i install my debdiff, then i have been doing "active development" in the install filesystem18:32
kirklandcjwatson: by manually editing 07raid_on_root18:32
kirklandcjwatson: backing out to the partman screen that has "Finish" on it18:32
kirklandcjwatson: and then I rerun finish18:32
cjwatsondid you change anything else? :)18:33
kirklandcjwatson: my script runs between clicking "Finish" and the warning that I have no swap space18:33
kirklandcjwatson: :-)  no  just 07raid_on_root18:33
kirklandcjwatson: i just kicked off a fresh install with DEBCONF_DEBUG=developer18:34
kirklandcjwatson: perhaps i polluted something else along the way....18:34
kirklandcjwatson: i'm going to go through the networking setup18:35
cjwatsonI just can't see how this could happen with that script18:35
kirklandcjwatson: and anna-install openssh-client-udeb18:35
cjwatsonyou need to chmod +x debian/install-rc in debian/rules FYI18:35
cjwatsonPACKAGE=mdadm-udeb debian/install-rc check.d18:35
cjwatson/bin/sh: debian/install-rc: Permission denied18:35
cjwatsondo it just before calling it18:35
kirklandcjwatson: see line 799 of http://pastebin.ubuntu.com/46321/18:39
kirklandcjwatson: (and I notice my whitespace is off)18:39
cjwatsonkirkland: you need to chmod +x debian/install-rc too, not just the check.d script18:39
kirklandcjwatson: oh18:40
kirklandcjwatson: okay, i've installed my updated udeb18:42
kirklandcjwatson: i'm going through the raid partitioning18:42
cjwatsonpersia: processing now, thanks18:42
persiacjwatson: Thank you.  Do you expect to need anything else from us to get d-i built for lpia for 2:02 BST?18:43
cjwatsonpersia: nope18:43
persiaGreat.  Thanks again.18:44
cjwatson(you going to be working on it over the weekend or something?)18:45
cjwatsonerr, and speaking of, isn't it 0dark:00 in .jp?18:45
kirklandcjwatson: fresh syslog http://pastebin.ubuntu.com/46329/18:45
kirklandcjwatson: syslog from a fresh install18:45
cjwatsonok, so at least it's stopped spewing shell syntax errors18:46
kirklandcjwatson: it's like the mdadm/boot_degraded isn't making it into the debconf db18:46
cjwatsonoh! duh18:46
kirklandcjwatson: :-)  yeah, that was probably from one of many, many dev runs on that system18:46
cjwatsonsorry, I forgot, you can't install udebs that contain templates from tty218:46
kirklandcjwatson: wtf?  :-)18:46
persiacjwatson: I'm not very good with tracking solar cycles :)18:46
cjwatsonkirkland: complicated reasons due to how debconf is plumbed into the installer; basically, it updates the database, but that doesn't help the running debconf instance on tty1 notice it18:47
kirklandcjwatson: so is tty3 magically blessed?18:47
cjwatsonkirkland: no, it is possible but you need to do something more evil18:47
cjwatsonif I could bless tty3 I'd bless tty2 too :-)18:47
kirklandcjwatson: yeah, that was a joke ;-)18:47
kirklandcjwatson: okay, so is there some way to "refresh" the debconf instance on tty1?18:48
cjwatsonkirkland: wait :)18:48
kirklandcjwatson: or install the udeb from tty1?18:48
cjwatsonkirkland: so, when you get to that netcfg prompt, stop18:48
cjwatsonkirkland: edit /var/lib/dpkg/info/clock-setup.postinst (this is just a handy victim because it comes after netcfg and before partitioning)18:49
kirklandcjwatson: do i need to restart my current install, or can i back it out far enough?18:49
cjwatsonkirkland: below . /usr/share/debconf/confmodule, put 'wget http://url/of/your/udeb; udpkg -i your.udeb'18:49
cjwatsonkirkland: you need to restart18:49
kirklandcjwatson: okay, lemme try that18:50
cjwatsonyes, this is a mess18:50
kirklandcjwatson: well, black magic at the very least18:50
cjwatsonit's a mess, and it's related to debconf using stdio so there's no way to get at it from another process to send it commands18:50
cjwatsonsuch as X_LOADTEMPLATEFILE18:50
cjwatsondebconf needs to be properly client/server in order to fix this, but that requires an internal select loop and all kinds of gubbins ... not easy18:51
cjwatsonTollef had a go at it a while back18:51
cjwatson~    18:52
cjwatson(sorry, network-manager randomly decided to break my network)18:52
kirklandcjwatson: what about a hook that, on every screen refresh in debconf, sources a file in some magic location if it exists, to read a template18:53
cjwatsonthen you have to decide what happens when they're changed in both locations18:53
cjwatsonit needs to be a lot more structured than that18:54
kirklandcjwatson: okay, not my current problem ;-)18:54
cjwatsonyou get used to the workaround, really :)18:54
cjwatsonand it doesn't affect end users, so low priority18:54
kirklandcjwatson: what can i use in place of dpkg -l ?18:57
kirklandcjwatson: to check that it was installed?18:57
kirklandcjwatson: i see it in / so it was at least wgot18:58
kirklandcjwatson: \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/ \o/  \o/  \o/  \o/19:00
evandhahaha, that's quite a bit of excitement19:01
kirklandevand: this has been many hours invested, with relatively little show of progress19:01
kirklandevand: until now :-)19:02
cjwatsonkirkland: nano -v /var/lib/dpkg/status19:04
kirklandcjwatson: debconf question successfully posed19:05
kirklandcjwatson: i'm testing the rest of the install now, to ensure that the answer to that question is in fact applied and effective ;-)19:06
cjwatsoncool. check that it landed in /var/lib/preseed/log19:06
kirklandcjwatson: while it's installing, would you clarify one thing.....19:06
kirklandcjwatson: k19:06
kirklandcjwatson: when I post the final debdiff, I should have the one change to the POTFILES.in, but not the 50+ changes to all the .po's....  is that correct?19:07
cjwatsonright, if you accompany it with an instruction to run debconf-updatepo after application19:07
cjwatsonthat's certainly what I'd prefer19:07
kirklandcjwatson: okay, i'll prep that19:07
kirklandcjwatson: i have to leave for the airport in 23 mins, i'll drop it before then19:08
GoosemooseI keep getting a 'failed with exit code 127' for this presed command: d-i preseed/late_command string wget http://10.0.2.131/post_install_tasks && chmod +x ./post_install_tasks && ./post_install_tasks returns > /dev/null 2>&119:14
Goosemooseanyone have any ideas? with the wget statement alone it works fine19:14
Goosemoosei just added the /dev/null part on the last run to test it19:15
cjwatsonis there anything in syslog?19:20
cjwatson(please don't send me private /msgs duplicating stuff in this channel; I pay attention to this channel when I'm around and it won't make me see things any faster)19:21
kirklandcjwatson: doesn't look like the value of that debconf made into the /target19:22
cjwatsonkirkland: was it in /var/lib/preseed/log?19:22
kirklandcjwatson: i'm going to pick this back up at the airport once I get on wireless19:24
kirklandcjwatson: my concern was this making it in before ui freeze19:25
cjwatsonkirkland: your problem is that you're setting BOOT_DEGRADED in mdadm.config19:25
cjwatson(debian/mdadm.config)19:25
cjwatson-BOOT_DEGRADED="false"19:25
kirklandcjwatson: ah, yeah, that's deprecatednow19:25
cjwatson+BOOT_DEGRADED=""19:25
cjwatsonthat should fix it19:25
kirklandcjwatson: good catch19:25
kirklandcjwatson: okay...  so i've been slammed with landscape stuff all week, my apologies for this being late19:25
kirklandi'm desperately trying to get you this today19:25
cjwatsonno worries19:25
cjwatsonI'm fairly relaxed about UI freeze for server19:26
kirklandcjwatson: thank you19:26
cjwatsonthe people who really care are people taking screenshots, and this is an edge case for them19:26
cjwatsonpersia: the d-i I'm about to upload might fail on lpia, but ignore it, I can retry later if it does19:37
cjwatsonjust want to get it off my disk19:37
CIA-50debian-installer: cjwatson * r963 ubuntu/debian/changelog: releasing version 20080522ubuntu1419:39
Goosemoosehey cjwatson, sorry about the priv msg19:52
Goosemoosecjwatson, which file should i be looking in for the error?19:52
Goosemoosethe /var/lib/preseed/log?19:53
Goosemoosecjwatson?20:07
Goosemooseoh, my other issue is that: d-i partman-lvm/confirm boolean true , is not preventing the error about an existing volume being present which is stopping the preseed as well20:08
Goosemoosethis is nuts, there's gotta be some better examples for preseed files20:53
cjwatsonGoosemoose: when I said /var/lib/preseed/log, I was talking to kirkland about something completely different.20:58
Goosemooseok20:58
cjwatsonGoosemoose: /var/log/syslog20:58
Goosemooseok, let me look20:58
cjwatsonGoosemoose: from the installation guide:20:58
cjwatson# If one of the disks that are going to be automatically partitioned20:58
cjwatson# contains an old LVM configuration, the user will normally receive a20:58
cjwatson# warning. This can be preseeded away...20:58
cjwatsond-i partman-lvm/device_remove_lvm boolean true20:58
Goosemooseyes exactly, i have that line just like that20:58
Goosemoosebut the command still gets asked20:58
Goosemooseor question asked20:59
cjwatsonyou said partman-lvm/confirm earlier20:59
Goosemooseoh i have both20:59
cjwatsonwhat release of Ubuntu are you trying to install?20:59
Goosemoosehardy20:59
Goosemooseactually, hmm20:59
Goosemoosei have: d-i partman-auto/purge_lvm_from_device boolean true20:59
cjwatsonGoosemoose: what is the exact text of the question you see/21:00
cjwatson?21:00
Goosemooseits no on the screen right now but im sure your statement will take care of it. let me look at the syslog regarding that late_command error21:01
Goosemoosefunny, i d/l this preseed.cfg from the ubuntu website21:01
cjwatsonOK, this was a bug in the hardy installation-guide unfortunately21:01
Goosemoosegot it21:01
cjwatsonit was changed in Debian, but I didn't notice the change so we didn't pick it up; my fault21:01
Goosemooseits ok21:01
Goosemooseif i can figure out these last two21:02
Goosemoosechecking the syslog ,just a sec21:02
cjwatsonhttp://bazaar.launchpad.net/~vcs-imports/installation-guide/trunk/revision/3099 was the installation-guide change in question21:03
Goosemoosethere's nothing in the syslog regarding the late_command error21:04
Goosemoosed-i preseed/late_command string wget http://10.0.2.131/post_install_tasks && chmod +x ./post_install_tasks && ./post_install_tasks returns > /dev/null 2>&121:04
Goosemooseif i just do the wget part it works fine21:04
Goosemooseif i run it from a command line it works fine21:04
Goosemooseas a preseed i get exit code 12721:04
cjwatsonthere should be *some* output at least; could you put the full syslog somewhere for me and I'll take a look?21:04
Goosemoosei think the machine has been rebooted which is why21:05
Goosemooseit just has a complaint about me trying to log in as root21:05
Goosemoosei can post it, just a sec21:05
cjwatsonerr, is this post-install? you need /var/log/installer/syslog then21:05
Goosemooseahh ok21:05
Goosemoosehmm21:07
Goosemoosehttp://pastebin.com/d4cfe1c2721:07
Goosemooselooks like a few errors21:08
Goosemoosei do install likewise and i know it starts when the machine restarts21:08
Goosemooselooks like the domainjoin-cli command isn't valid there21:08
cjwatsonpushd and popd are bashisms; you can't use them in d-i's shell21:08
cjwatsonare you intending for this command to be run in the target system?21:09
Goosemooseok. i had just tried that after reading a website where the guy specifically wrote out to use that21:09
Goosemooseyes21:09
Goosemoosei want the system to join the domain21:09
cjwatsonyou see, your late_command runs the command in the installer environment21:09
Goosemoosei also copy the nsswitch.conf to fix the but with .local domains21:09
cjwatsonyou need this instead:21:09
cjwatsond-i preseed/late_command string wget -O /target/post_install_tasks http://10.0.2.131/post_install_tasks && chmod +x /target/post_install_tasks && chroot /target /post_install_tasks returns >/dev/null 2>&1 && rm -f /target/post_install_tasks21:10
cjwatson(what's the "returns" for?)21:10
Goosemoosejust something i was reading21:11
Goosemoosei added it later21:11
Goosemooseto test if it helped21:11
Goosemooseok so the only difference is to chroot /target21:12
Goosemooseok im referring directly to the file in /target too21:12
Goosemooseso in my script, can i rm /etc/nsswitch.conf if im just in the installer environment? i can i access outside the target folder?21:13
cjwatson'chroot /target foo' means you're no longer in the installer environment (effectively)21:14
cjwatsonno, you can't break out of /target within that, but from your description you don't need to21:14
cjwatsonthe stuff in /target is what the real system will be after you reboot21:14
Goosemoosewell the other thing i do is to download a new nsswitch.conf file21:15
cjwatsonso you only need to remove /etc/nsswitch.conf in /target, not in the installer environment21:15
Goosemooseits in the post_insatll_tasks21:15
cjwatsonthat should work fine, chrooting doesn't particularly affect networking21:15
Goosemooseoh so im doing rm -f /target/etc/nsswitch.confg?21:16
cjwatsonyou do not need to change your script21:16
cjwatsonI mean, yes, you are effectively, but you shouldn't write that in your script if you have chroot /target in front of the call to it21:16
Goosemoosewell im removing the pushd, pop since that doesnt work21:16
cjwatsonARGH21:16
cjwatsonno stop messing about21:16
cjwatsonthey will work if you do the late_command change (well, you also have to make sure the script starts with #! /bin/bash rather than #! /bin/sh)21:17
Goosemooseok21:17
Goosemoosesorry, new to this preseed.cfg, worked on it once a year ago21:17
cjwatsonchange one thing at a time; standard troubleshooting practice21:17
Goosemooseok21:17
cjwatsonwhen I advise you to try something, try that first *on its own* before making further changes21:18
Goosemoosejust have to wait 30 min inbetween installs so trying to knock out a few issues21:18
Goosemooseok, will do21:18
cjwatson(or when another developer advises you)21:18
cjwatsondo check the #! line at the start of your script, though21:18
Goosemooseyup, just did, thanks21:18
cjwatsonright, the problem is that if you change lots of stuff at once then you might actually make it worse21:18
Goosemooseyeah i understand21:18
Goosemooseone other quick question. to get edubuntu desktop to load21:20
Goosemoosei've tried: tasksel tasksel/first multiselect standard, edubuntu-desktop21:20
Goosemoosebut i just boot to terminal21:20
Goosemooseif i add ubuntu-desktop then it boots to ubuntu desktop21:21
Goosemoosenvm, ill try and at least get the other stuff working first, brb21:22
cjwatsonthat should be the right syntax21:24
cjwatsonalthough of course won't work if you're installing from an Ubuntu CD21:24
Goosemooseedubuntu split on to two cd's now21:25
Goosemoosethe first cd is ubuntu only21:25
cjwatsonyou can omit "standard, ", actually - that's installed automatically21:25
Goosemooseim installing from the network21:25
cjwatsonyes, I know, I did most of the work for that21:25
Goosemooseahh cool21:25
cjwatsonagain, /var/log/installer/syslog should let me see why edubuntu-desktop isn't getting installed21:26
Goosemooseok21:26
Goosemoosei downloaded the netboot.tar.gz off ubuntu.com21:26
Goosemoosei restarted the install, so i'll have to wait until it's done21:26
Goosemoosecjwatson, a long time ago I had asked you how to get the installer to ask me the computer name and you had me unpack and make a change to initrd. that worked in fiesty but not in hardy. i read on a site online that i could change the default install line to include: netcfg/get_hostname=hostname and then pass the computer name in via the installer line. but that didn't work. was the site wrong? (install is still running btw21:35
cjwatsonthat's a long-standing bug; you have to work around it by fixing up the files in late_command21:37
cjwatsonhttps://bugs.launchpad.net/ubuntu/+source/netcfg/+bug/21896521:37
cjwatsonthe site was right as to intent but wrong in that AFAIK it's never actually worked21:37
Goosemoosefigures, lol21:38
Goosemooseseveral of these things have been driving me nuts for days, i forgot all about the ubuntu-installer room and the server room didn't have answers21:39
Goosemoosei just needed to find you!21:39
Goosemooseok so the change you had me made previous was to comment out the set_network call in the dhclient-script file21:40
Goosemoosethat was a year ago with feisty, but that function doesn't exist21:40
Goosemoosethere's a set_hostname21:40
Goosemoosei tried commenting that out and rebuilding but it didn't make the prompt appear21:41
Goosemoose(doesn't exist now in hardy i mean)21:41
Goosemoosecjwatson, ok the late_command exited with an error code 121:51
Goosemooseim pasting it into pastebin21:51
Goosemoosehttp://pastebin.com/d3cdfdd7621:52
Goosemoosecjwatson, let me know when you're back around please21:55
xivuloncjwatson 268123 is fixed now, thanks a bunch, looking forward to see the new busybox in the iso22:31
cjwatsonGoosemoose: there's no sign of a failure there; please remove the 2>&1 so that errors are visible22:58
cjwatson>/dev/null 2>&1 throws away both output and errors, >/dev/null just throws away output22:58
cjwatsonGoosemoose: what I advised somebody to do recently wasn't anything in dhclient-script, but was just to adjust /etc/hostname, /etc/hosts, and /etc/resolv.conf in their late_command script; I suggest you do that22:59
cjwatsonxivulon: good stuff22:59
Goosemooseok23:02
Goosemoosecjwatson, the problem with that is that im doing this to 250 machines, so i can't hard code anything23:03
Goosemoosein to the hosts files23:03
Goosemooseediting the preseed.cfg and reinstalling now23:04
cjwatsonGoosemoose: in that case I would recommend that you configure your DHCP server such that the installer's automatic guesswork gets it right23:09
cjwatsonthat's by far the easiest method long-term23:09
Goosemooseok, guess i'll have to do that then23:10
Goosemooseim reinstalling right now withou the null statement23:10
Goosemoosei couldnt find anything about the edubuntu-desktop in the syslog but it's long, i could have missed it23:10
cjwatsonif you post the whole thing, I have lots of practice at looking23:11
cjwatsonI'm going to bed soon though23:11
Goosemooseok, i might have to hit you up tomorrow, i'll be another 20 min before the current install finishes23:12
Goosemoosethank you for all your help23:13
cjwatsonok23:13
Goosemooseok got to the error23:20
Goosemoosedamn it failed on both commands23:27
Goosemoosecjwatson, if you're still around: http://pastebin.com/d32527b4c23:28
Goosemooseit looks like for joining the domain is says it was unable to start daemon23:28
Goosemooseso likewise-open hadn't started yet23:29
Goosemoosei guess i need to force it to start in the script first23:29
Goosemoosebut would i do /etc/init.d/likewise-open start; or /target/etc/init.d/likewise-open start;23:29

Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!