=== StoneTable is now known as aisrael
waiganithumper:  I'm do we have any nice way of passing a userTag over the wire?01:22
waiganiI'm currently breaking it up on the client, putting it in a params struct and rebuilding it on the server01:23
waiganialternatively, we could not build the tag until the server side, and just pass through usernames...01:25
thumperwaigani: yes, it is a tag01:36
thumperwallyworld: got 5 min?01:39
waiganithumper: we should allow the env to be 'unshared' as well right?01:41
thumperwallyworld: https://plus.google.com/hangouts/_/canonical.com/tim-ian01:41
thumperwaigani: yes...01:41
thumperwaigani: not sure "unshare" is the right verb01:41
waiganihence the scare quotes01:41
waiganiunder the hood that would just be RemoveEnvionmentUser01:42
thumpertrivial review for someone: https://github.com/juju/juju/pull/64102:24
thumperand my notes about bout abootstrapping: https://github.com/juju/juju/pull/64202:25
axwreview please: https://github.com/juju/juju/pull/643  -- fixes CI blocker02:26
thumperaxw: does this address both blockers?02:28
axwthumper: I've only looked at the one so far02:28
axwwill take al ook at the other now02:28
wallyworldthumper: what's the other blocker? there was only one i thought02:43
wallyworldthe other critical bug is not a blocker as it's not a regression02:43
mupBug #1363143: local lxc deployments fail to create machines <ci> <local-provider> <lxc> <precise> <regression> <juju-core:Triaged> <https://launchpad.net/bugs/1363143>02:43
thumpershowing "ci regression"02:43
wallyworldthumper: ah, it hasn't got a milestone02:44
wallyworldi was looking at 1.21alpha1 milestone bugs02:44
wallyworldit could be the same root cause as the manual provider fix02:45
thumpercould be02:49
axwwallyworld thumper: is local meant to be doing apt-get update/upgrade by default now?02:55
axwcos it seems to be02:55
wallyworldaxw: with lxc-clone, it wasn't meant to02:55
axwisn't lxc-clone implicit on local?02:56
wallyworldit is now yes02:56
wallyworldas of 1.2002:56
axwI'm doing add-machine on trunk with no special config, and added machines are updating/upgrading02:57
wallyworldif local is doing the apt dance with lxc-clone = true, that's wrong02:57
axwI expected that to clone and not update/upgrade02:57
wallyworlddo you have a template conrainer created?02:57
wallyworldand if it is using that, ie clone = true, then there's a bug if it's doing apt02:57
axwI'll look into it more after I've repro'd this bug02:58
waiganithumper: added Usermanager.AddEnvironmentUser to the serverapi, we can expose it as Environment.Share on the client: https://github.com/juju/juju/pull/64402:58
thumperwaigani: Noooooooo02:58
wallyworldaxw: i'll look as well - people wanted to option of doing apt in clones so as not to have stale templates, but we wanted to lso preserve the current default behaviour02:58
waiganithumper: hangout?03:00
* thumper nods03:00
wallyworldaxw: there's a test that passes TestLocalDisablesUpgradesWhenCloning03:00
wallyworldmaybe the test is wrong03:01
thumperwaigani: muted?03:01
thumperwaigani: you are very quiet03:01
axwwallyworld: I didn't specify lxc-clone or use-clone or anything03:01
* axw looks at the test03:01
wallyworldaxw: lxc-clone defaults to true - maybe the apt logic is broken in that it doesn't handle implicit defaults03:01
wallyworldi'll check03:02
wallyworldaxw: i found the bug03:04
wallyworldwell, i think so from reading the code - i'll fix03:04
axwwallyworld: cool, so I'm not going crazy :)03:04
wallyworldnope, not this time :-)03:04
wallyworldi'll write a test to check my theory03:05
wallyworldaxw: just checked the config code - seems that lxc-clone defaults to false, which means i totally misremembered what was done03:13
axwhuh, ok.03:13
axwwallyworld: it's in container/lxc03:14
wallyworldi *think* we must have wanted to retian the original old behaviour which was before clone was supported ie do not clone unless asked03:14
axwif it's not set, container/lxc auto-detects support based on series03:14
wallyworldaxw: huh, well that conflicts with the code in config03:15
wallyworldit will be messy because that check in lxc.go is donr on the host machine03:16
wallyworldthe config parsing is done on the client03:16
axwthey're one and the same :)03:16
axwfor local anyway03:16
wallyworldnot for maas with lxc etc03:16
axwyes, will be messy for them probably03:16
wallyworldfor now, maybe best just to be explicit with lxc-clone=true03:17
thumperaxw: I'll update my doc to match your comments03:49
axwthumper: thanks03:57
axwand thanks in general, I've been meaning to write that for a while...03:57
thumperyeah, me too03:58
=== Guest18526 is now known as wallyworld
thumperI deleted the AddAdminUser method04:33
thumperand got all the breakages I expected before...04:33
* thumper enfixorates04:33
* thumper chuckles at the pure number of panics04:35
thumperjust for state: OOPS: 248 passed, 90 FAILED, 213 MISSED04:38
davecheneywhoops, juju dev is usually #2 on my irris04:38
waiganithumper: https://github.com/juju/juju/pull/64504:56
davecheneywhelp, that's a circular import05:14
davecheneytime to table flip and try again05:14
davecheney30:     "github.com/juju/juju/environmentserver/authentication"05:15
* thumper weeps and leaves05:38
thumpersearched for "user-admin" in our tests05:38
thumperno longer admin05:38
* thumper goes to make dinner05:38
thumperproblem for tomorrow-tim05:38
axwwallyworld: it looks like the tools-in-cloud-config for local may be what's making things not work well in local/lxc06:14
axwI'm going to back it out and see if it fixes things06:15
axwfrom what I can see, it makes cloud-init take a lot more CPU. I guess it's hurting the YAML parser06:16
wallyworldaxw: could be, yeah. i would prefer another way tbh06:20
axwwallyworld: prefer another way? as in, other than what's currently in master?06:21
wallyworldaxw: scp or something like that - to get tools into the bootstrap machine. we used to set up an http service but that fails if firewall ports are closed06:22
axwwallyworld: ah. well I'm only changing it for non-bootstrap machines atm. bootstrap is fine06:23
axw(but could be better, I agree)06:23
wallyworldnp, let's iterate on it06:23
* wallyworld -> school pickup, bbiab06:23
jamaxw: are you putting a 8MB tarball into a text configuration file ?06:26
axwjam: indeed, and now reverting that :)06:26
jamaxw: did you test whether that size was even feasible for Userdata ?06:27
axwjam: yes, it does work. I only did it on the local provider, and it works for both lxc and kvm06:27
axwbut it does seem to add significant overhead, which I hadn't noticed before06:27
axwand delays agent startup... probably didn't notice because I only tested on my laptop before06:28
axwjust tested on a VBox VM, and it was noticeable06:28
jamyaml doesn't do length-prefixed delimiting, so I can imagine that looking for the closing marker on 8MB * (4/3 base64) of tarball is a bit expensive06:28
axwjam: https://github.com/juju/juju/pull/648 reverts it, if you have a moment to review. fairly trivial06:32
=== uru_ is now known as urulama
jamaxw: the first part of that certainly looks like we are only putting the URL into the user-data06:33
jamis being set06:33
jamshouldn't there be some sort of encoding of the actual content?06:33
axwjam: environs/cloudinit treats file:// specially, and reads the file in when generating the cloud-config06:33
axwthat's used for bootstrap at the moment06:34
axwand manual provisioning06:34
jamaxw: that looks so totally horrible to me... :(06:36
jam"if something starts with file://" then it must be a tools prefix and thus we should read it into our cloud config file as tools.tar.gz06:36
jamvery "spooky action at a distance"06:37
axwyes, it is a bit magical and needs fixing06:37
jammaybe if it had at least "tools" in that string.06:37
axwin which string?06:37
axwjam: oh, we only do that in one specific place: when generating the "copy tools" command06:38
jamnm, it isn't anything with file:// it is just if Tools.URL has file:// which is slightly better, but still06:38
axwyes, still a bit magical. it'd be better if we just scp'd it in the first place06:38
jamaxw: just to confirm you've tried it with and without and the overhead is significantly better after your patch, right?06:38
axwwill try to reorganise things at some point to accommodate that06:38
jamaxw: agreed06:38
axwjam: yes, on my VM it's noticeably faster06:38
axwalso doesn't leave 8MB cloud-init files lying around in the lxc container cache06:39
jamaxw: so with your change we just get the Tools.URL that we discovered, rather than overwriting it as a "file://' url, right?06:39
axwyup, it'll just do what every other provider does - download from the API server06:39
jamaxw: oh man... AddBinaryFile adds a shell script which is doing "printf %s BASE64CONTENTS | base64 -d > file"06:41
jamWe're lucky the shell was allowing it given that size06:41
jamaxw: LGTM06:43
=== urulama is now known as urulama-afk
jamaxw: fwiw, ec2 User Data is capped at 16kB, which I think would be a sane rule for us to follow.06:49
axwjam: yep, I won't make that mistake again. bootstrap will migrate sooner or later, but that at least does not seem to have this problem06:50
axwbbs, school pickup06:51
jamdimitern: just grabbing some coffee, will be there in a bit06:58
dimiternjam, sure, omw06:58
wallyworldfwereade: heya, you back on board this week?07:06
fwereadewallyworld, heyhey07:06
fwereadewallyworld, yeah :)07:06
wallyworldfwereade: awesome. i'd love to catch up via hangout when you have some time07:06
wallyworldmaybe ping me later when you have read all your email07:07
fwereadewallyworld, cheers07:09
fwereadewallyworld, will do07:10
jam1dimitern: did my connection die or is it yours?07:31
mattywso - is there a way for me to know if landing is currently blocked?07:33
mattywalso - morning all07:33
jam1mattyw: try to land something and CI will reject it?07:33
jam1AFAIK there is no blockers right now07:33
jam1are no07:33
wallyworldcritical bugs are in the topic - maybe we should update those to indicate which ones block landings07:34
mattywjam, I was wondering if there was a better way - so I can work out if there's any point trying to land something07:34
mattywbut I guess better to ask forgiveness and all that07:34
jam1mattyw: well you can do the search yourself07:34
jam1for any "ci+regression" bugs07:34
wallyworldmaybe the bugs in the topic ate the blockers already07:35
mattywjam, ok great07:35
jam1wallyworld: looks like LXC deployments failing to create machines is considered blocking?07:35
mattywwallyworld, jam, that's what blocked me on friday07:35
jam1mattyw: axw just submitted something for it07:36
jam1at least, I reviewed something that sounded like it was this07:36
wallyworldjam1: yeah, there were 2 - one for manual, one for local07:36
axwfirst is done, second is on its way07:36
wallyworldthe manual one was fallout of two branches sort of landing together07:36
jam1mattyw: https://github.com/juju/juju/pull/648 is addressing bug #136314307:37
mupBug #1363143: local lxc deployments fail to create machines <ci> <local-provider> <lxc> <precise> <regression> <juju-core:In Progress by axwalk> <https://launchpad.net/bugs/1363143>07:37
jam1so it is queued right now07:37
wallyworldfwereade: also, since you're ocr today, i'd love a review of this which *may* solve one of the container pending issues we cannot reproduce but the landscape guys can https://github.com/juju/juju/pull/64607:37
fwereadewallyworld, just having a ciggie; quick hangout after that?07:38
jam1wallyworld: so my quick take from my experience there was that it was that the provisioner would puke on certain kinds of errors07:38
jam1is that what you're changing?07:38
mattywwallyworld, we still using the spreasheet to work out our ocr days? isn't it changing to the calendar soon?07:38
wallyworldmattyw: yes, soon :-)07:38
jam1wallyworld: I saw that when tools couldn't be found07:38
jam1it treated no-tools as a bug in the Provisioner code, which would cause it to restart07:39
wallyworldjam1: pretty much - but in this case, it's an inconsistent database. the  machine was there but the status record wasn't07:39
jam1but of course, its queue still said "i need to start a machine with tools that aren't available" so it would just keep doing that07:39
wallyworldthis is different07:39
jam1so it *felt* to me that errors during provisioning shouldn't be treated as a Provisioner failure but a failure to provision07:39
jam1and thus the Provisioner could keep going to the next thing to start.07:39
wallyworldyep, agreed07:40
jam1which is what we did, but specific to tools07:40
wallyworldthis problem is one case of the provisoner not beibg rbust07:40
wallyworldand also is due to our lack of tranactions07:40
wallyworldso the provisioner gets told a machine is ready to provision, except it isn't07:41
wallyworldbecause there's no status record yet07:41
wallyworldthat arrives later, after the provisioner has a;ready errored for that machine07:41
wallyworldwell, that's what the debug logs show07:41
wallyworldand it explains the behaviour that's been seen07:42
jam1mattyw: wallyworld: andrew's patch 'succeeded' except for a replicaset_test timeout07:46
jam1so it should be unblocked RSN07:46
wallyworld!@%$!~$@~ replicasets07:46
jam1wallyworld: so it looks to be a traceback in TestAddRemoveSet for the MongoSuite and not MongoSuiteIPv607:47
jam1which leads me to believe that it is just both that are flakey07:47
jam1though you specifically called out just the IPv6 version07:47
jam1(they run the same test with different addresses)07:47
wallyworldjam1: i called that one out because there's been a bug raised for it and it was assigned to 1.20 series07:48
wallyworldi think it was holding up CI at one point07:48
wallyworldie failing very often, hence they raised it and assigned it07:48
jam1wallyworld: sure. Looking at the code AFAICT they are identical except we always do the IPv4 setup, and then we follow that with an IPv6 setup in the v6 case07:49
jam1and I thought that doing double set up might be the problem.07:49
jam1but didn't get a chance to actually run it enough to have any confidence there.07:49
wallyworldah, ok. i hadn't looked specifically at the test07:49
jam1wallyworld: it only matters because *my* team was responsible for adding IPv6 but we didn't write the original test, not that we can't be the ones to fix it07:53
wallyworldjam1: fair enough. i was sort of thinking that whoever wrote the failing tests could have the best chance of fixing them, but of course anyone can fix any test07:54
mattywjam, so even though the lxc bug has been marked as fix committed my branch still fails to land because of it - do I need to wait till it's marked fix-released?08:14
jam1mattyw: I just checked the URL that the bot is supposed to be using, and it is clear now. Though LP timed out the first time I tried08:16
jam1maybe just try submitting again? It hadn't updated when it got to your previous request08:16
mattywjam1, will do - thanks08:16
mattywjam1, I just tried again and it failed - I'll go make some coffee and try later, I don't want to spam the poor thing on a monday morning08:23
jam1mattyw: can you link the PR, I'd like to see it08:24
mattywjam1, https://github.com/juju/juju/pull/56208:24
jam1axw: wallyworld: I thought the bot ignored Fix Committed bugs, but it is clearly still complaining.08:26
jam1Do we need to drop it from CRITICAL so that we can land code again?08:26
axwjam1: not sure, I thought it ignored them too. can try it I guess08:28
jam1axw:  http://paste.ubuntu.com/8204244/ is the specific request the bot is making08:31
jam1that sure looks like just Triaged and In Progress (and not Fix Committed)08:32
jam1axw:  mattyw: when I go to https://api.launchpad.net/devel/juju-core?ws.op=searchTasks&status%3Alist=Triaged&status%3Alist=In+Progress&importance%3Alist=Critical&tags%3Alist=regression&tags%3Alist=ci&tags_combinator=All08:33
jam1it returns an empty list08:33
mattywI'll just try to land one more time08:34
mattywI'm sure the bots likes being kept busy anyway08:35
axwjam1: where's the code that's making the request? could it be caching?08:35
jam1axw: I'm pretty sure the code is: https://code.launchpad.net/~juju-qa/juju-ci-tools/trunk08:35
jam1but I can't find anything that calls check_blockers.py08:35
jam1axw: that code is just doing urllib2.urlopen so it shouldn't be doing any caching.08:36
axwjam1: the Jenkins job calls it directly08:39
axwcalls check_blockers.py08:39
jam1axw: k, I don't think I have visibility into that layer08:40
axwnothing enlightening08:41
* axw shrugs08:41
jam1and it has now been 7 minutes from a $$Merge$$ before the bot has noticed.08:42
jam1all the other requests in that thread show as "request accepted within 1 min"08:43
mattywit really doesn't want to land that branch08:44
mattywjam1, I've seen it completely miss a branch before - can't remember the reason, but I've seen it happen08:45
jam1TheMue: I'm currently in a meeting, so I might be a bit late for our 1:108:50
jam1but I'll keep you updated08:50
mattywmgz, ping?08:51
TheMuejam: ok, I'm here08:58
TheMuejam: so ping me when you're ready08:58
wallyworldaxw: you free for standup nw since katherine is away?09:19
axwwallyworld: sure, gimme a couple of mins09:20
wallyworldjam: sorry, was on a call before, did you get the bot issue sorted?09:20
jam2wallyworld: the bot seemed to be sleeping for an hour: http://juju-ci.vapour.ws:8080/job/github-merge-juju/09:21
jam2see the 1hr gap from 8:18 to 9:1709:21
jam2wallyworld: axw: mattyw: it appears to have woken up for axw, but is still ignoring matty ?09:21
wallyworldjam: so it was, hmmmm09:21
jam2wallyworld: https://github.com/juju/juju/pull/562 seem to have been pending for an hour without the bot noticing09:22
mattywjam2, looks like it - I've seen this happen before - but not for ages09:22
axwwallyworld: can barely hear you09:22
mattywjam, jam2 which is the real one?09:22
wallyworldjam: i had no idea why ottomh09:23
wallyworldmaybe mgz  can look into it09:23
mattywjam, last time this happened mgz did some magic09:23
axwnow frozen09:23
jammattyw: I'm on 2 machines, jam2 happens to be my laptop which is a bit better than my desktop *right now*09:23
mattywjam, so I guess what would be most annoying for you would be pinging them alternately?09:24
mattywjam2, right?09:24
jam2my laptop pings on both of them09:24
wallyworldaxw: you forze, you still there?09:24
axwwallyworld: hangouts isn't loading..09:25
axwI got cut off, now I can't load hangouts09:25
axwhang on09:25
axwmy wifi setup is dodgy atm09:25
jamTheMue: I'm in the hangout, if you can try to make it quickly09:48
TheMuejam: OK09:48
mattywfwereade, we should have a chat about what we've discussed around metrics & environment09:52
mattywfwereade, also, good morning09:52
fwereademattyw, heyhey :)10:07
jamTheMue: just a reminder to be booking your travel to brussels10:13
=== jamespag` is now known as jamespage
=== bloodearnest_ is now known as bloodearnest
wallyworldfwereade: maybe this time https://github.com/juju/juju/pull/65010:37
fwereadewallyworld, LGTM10:47
wallyworldfwereade: tyvm10:47
fwereademattyw, free for a quick chat?10:47
wallyworldjam: i take your point but if I do prereqOps = append(prereqOps, machineOp) then the result isn't just prereqOps anymore, so I deliberately used a different name. prereqOps isn't used elsewhere so if it gets modified it doesn't matter10:56
jamdimitern: https://github.com/juju/juju/pull/62710:57
wallyworldsound ok?10:58
jamwallyworld: I understood why, but it means that line has an unspecified side effect, I'd rather we were concrete about them.11:01
jamYou could just do:11:01
jamreturn mdoc, append(...), nil11:01
jamI'll live with it either way, but I feel it is risky to do "append()" and assign it to another variable11:02
wallyworldthought about that too, but it looked ugly. i might change it to that though. the side effect is local only11:02
=== gsamfira1 is now known as gsamfira
wallyworldthere's one case with two lists that need appending where it will get messy11:03
mattywfwereade, sorry - yes I am now11:07
fwereademattyw, np, I'll start a hangout11:08
bogdanteleagahey, could I get another review for https://github.com/juju/testing/pull/31 ? It's a small PR in the testing package that adds a missing windows script, as well as new failing functionality for testing11:15
dimiternjam, you've got a reviw11:31
dimiternreview even11:31
jamdimitern: thanks11:45
mattywperrito666, ping?11:45
=== jam2 is now known as jam1
perrito666mattyw: pong11:48
mattywperrito666, good morning, you did a fix for this? https://bugs.launchpad.net/juju-core/+bug/136307911:49
mupBug #1363079: userManagerSuite.TestUserInfoUserExists fails <test-failure> <juju-core:Triaged by hduran-8> <https://launchpad.net/bugs/1363079>11:49
mattywperrito666, the reason I ask is that a number of the test failures in our google doc look to be the same error as was reported by that bug11:49
mattywperrito666, I'm trying to work out if we can consider the other tests "fixed" or at least keep an eye on them for probably/ maybe being fixed11:50
perrito666mattyw: I did not manage to get it solved, I did figure what might be happening to that particular test11:50
perrito666mattyw: want to tell memore?11:50
tasdomascould I get somebody to take another look at https://github.com/juju/juju/pull/517 ?13:33
gsamfirahello folks. Can someone have another look at: https://github.com/juju/testing/pull/31 ?14:35
jcw4fwereade: I think you're OCR today? https://github.com/juju/juju/pull/65115:00
fwereadejcw4, cheers15:02
jcw4fwereade: tx15:02
=== Ursinha is now known as Ursinha-afk
bodie_hello all, three last branches for Actions on the unit ready for final review --17:46
bodie_sorry, 617, not 61517:46
mattywperrito666, we'll talk about those errors tomorrow if that's ok?17:54
=== Ursinha-afk is now known as Ursinha
=== Ursinha is now known as Ursinha-afk
hazmatthumper, g'morning mate21:13
perrito666mm, somthing is odd here, thumper said good morning and its not yet night here21:16
thumperperrito666: days are getting longer21:16
* perrito666 calls the ministry of truth to fix that21:17
lifelessperrito666: the ratio of daylight to non-daylight is increasing in the southern hemisphere21:19
perrito666lifeless: I should know, I live there21:20
lifelessperrito666: kk :)21:20
perrito666lifeless: we are now on the road to the interesting time where its 10PM and it still afternoonish21:22
lifelessperrito666: you must be waaaay south for that - mcmurdo?21:23
perrito666lifeless: geographic center of argentina, which is quite south.21:24
perrito666I dont mind much the sun, the 30°C during the night is what gets me21:24
lifelessah, I should have been able to guess that from the earlier quip ;)21:24
lifelessperrito666: 30'is too hot to sleep comfortably for sure21:24
waiganithumper: when making a user, what is a valid 'Name' field? Should '@' be allowed at all?21:27
thumperwaigani: no, it should fit through this hole: var validPart = "[a-zA-Z][a-zA-Z0-9.-]*[a-zA-Z0-9]"21:28
thumperwaigani: that is the name part from names/user.go21:28
waiganithumper: currently state.AddUser checks via names.IsValidUser21:28
thumperwaigani: right, but valid user is user@provider21:29
thumperwhat I think we want is "names.IsValidUserName"21:29
thumperwhich just checks the valid part21:29
waiganithumper: so that will be a new func on names?21:30
=== Ursinha-afk is now known as Ursinha
menn0thumper: meta-review please: https://github.com/juju/juju/pull/64921:37
thumpermenn0: kk, shortly21:37
menn0thumper: it's a small one so shouldn't take long21:37
fwereadethumper, menn0, waigani, mornings :)21:39
waiganifwereade: morning :)21:39
menn0fwereade: hai!21:39
waiganior evening for you21:39
thumperfwereade: o/21:39
fwereadewaigani, details details, fell asleep putting laura to bed, bit confused :)21:39
fwereadehow's everything?21:40
waiganifwereade, menn0: I'm taking a week off before the sprint. All goes well, weekend in London and a few days in Paris.21:40
fwereadewaigani, oh, lovely21:40
waiganiso any must see/do please email me :D21:41
menn0waigani: sounds good!21:41
waiganihopefully Molly will come - it will be our first real holiday :)21:41
menn0fwereade: are you around for a bit? I have a few quick questions regarding stuff we did in Dunedin.21:43
menn0thumper: another quick meta-review please: https://github.com/juju/names/pull/2422:25
thumperomg, this branch is going to be so horrible22:35
waiganimenn0: happy with regex? https://github.com/juju/names/pull/24/files22:39
* thumper nods22:41
davecheneywaigani: "^"+ValidPart+"$"22:53
* thumper wonders if the compile part of the test run will be done before the standup22:58
thumperfan going full speed22:58
lifelessthumper: I thought you used go nowdays?22:59
thumperlifeless: I do22:59
thumperlifeless: the tests are compiled22:59
lifelessthumper: and that it had ultra super awesome compile times22:59
thumperlifeless: they do...22:59
perrito666thumper: renice22:59
thumpereach package is compiled into its own executable I think22:59
* thumper afk to collect rachel and have a coffee23:28
davecheneywaigani: thumper menn0 as discussed https://github.com/juju/juju/pull/65323:39
waiganithumper: should state.AddUser be able to take "user@provider" or just "user"?23:57

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