/srv/irclogs.ubuntu.com/2018/05/16/#ubuntu-server.txt

Howie69I seem to be missing something...01:25
Howie69I used ssh-keygen to make an rsa key for a user on my server01:27
Howie69I tried to put that key into PuTtyGen but it said unable to convert, OpenSSH format01:27
Howie69How do I convert it from that format that something that PuTty can use and WinSCP can use (for a client)?01:28
Howie69You see, I did it the other way around before...01:31
Howie69I used AWS to make the key and then download it and used puttygen01:32
sarnoldwhat did you try to import? the private key or the public key or the authorized_keys fingerprint line?01:32
Howie69The authorized_keys in .ssh01:32
sarnoldare you trying to use the key from putty to log in to a linux machine?01:33
Howie69Used these directions: https://help.ubuntu.com/community/SSH/OpenSSH/Keys01:33
Howie69(I hope paste from ubuntu is ok)01:33
dpb1which key are you pasting in to "putty gen"01:35
dpb1you want to paste the 'private key', the one in ~/.ssh/id_rsa01:36
dpb1~/.ssh/authorized_keys gets the one in ~/.ssh/id_rsa.pub01:37
Howie69the id_rsa and authorized_keys are the same, as I cat'd one to the other01:39
Howie69I downloaded the keyfile, and tried to open it with PuttyGen, and it said "Failed to open: OpenSSH Format"01:39
Howie69do I need to just paste the contents instead?01:40
Howie69this is the question that Google couldn't give me a straight answer to :)01:40
sarnoldyour ~/.ssh/authorized_keys SHOULD NOT be the same as your private key01:41
Howie69I misspoke... or did I mistype?  let me look closer01:42
Howie69nope, it's the right key01:48
Howie69just wanted to make sure I used the .pub01:48
dpb1well, a simple google search does appear to show a difference between putty keys and openssh keys01:48
Howie69right, but doesn't show how to convert them besides PuttyGen01:48
dpb1https://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html#faq-ssh2-keyfmt01:49
Howie69right... that's what I use when I use AWS to generate the keys instead of OpenSSH01:50
Howie69But it complains about it being an SSH2 key01:50
Howie69not sure if that's what the issue is or not01:50
sarnold"and the pterm and command-line puttygen utilities are not described at all"  :(01:51
Howie69because all of the results say to import it into PuttyGen, which says it cannot open because it's OpenSSH format01:51
dpb1there is a #putty channel01:52
sarnoldssh2 *might* mean the old terrible horrible commercial closed source ssh.com ssh01:52
Howie69although the page I am reading is mentioning using the private key.. instead of the public01:52
dpb1might get better results there01:52
sarnoldor maybe it means the modern protocol. hard to guess.01:52
dpb1I mean, you are running into problems using a putty tool, it's not something people will have experience with here.01:53
Howie69dpb1: I will try that.  Just trying to eliminate it is not on the server end first01:53
dpb1in general01:53
dpb1yes01:53
dpb1I understand it's involving two systems. :)01:53
sarnoldbut it does seem like you're more likely to find a puttygen expert in a putty channel, hehe01:53
dpb1I have used windows enough to grit my teeth at the problems encountered.01:53
dpb1anyway, I'm not really sure, sorry Howie6901:54
Howie69hrm.. here's a simple question that I may have overlooked...01:54
Howie69do I have to restart opensshd after I edit the .ssh/authorized_keys file?01:55
dpb1that FAQ is very clear that it's a problem, but finding the right solution is more difficult. :)01:55
sarnoldno, the authorized_keys files are re-read as needed every attempt01:55
Howie69ok, that checks that one off the list...01:55
sarnoldBUT if *that* isn't working, the usual solution is to set the permissions more restrictively :) opensshd is very picky about permissions on that file.01:55
sarnoldbut if you're getting an error message frmo puttygen, best sort that out first01:56
Howie69it's set to 60001:56
sarnoldiirc the ~ and ~/.ssh permissions matter too01:57
Howie69bcause I run the webserver under /home/user/web folder01:57
Howie69I'm half tempted to reenable password auth :)01:58
Howie69and the disturbing answer is...02:01
Howie69that PuTtyGen wants you to import the PRIVATE key, enter the password for it to convert into their public key format02:02
dpb1that's expected at least by me02:02
dpb1your private key is always on your client02:03
dpb1it's how the server knows you are you02:03
irwisswhat's disturbing about it? it can't derive your private key from your public key02:04
Howie69sleep deprivation it seems02:07
Howie69I knew better than that02:07
Howie69But in this scenario, but not in the AWS made keys, is that even with the key, it also asks for the associated key's password02:08
sarnoldit needs to decrypt the blob to get the raw numbers back out of it somehow02:09
Howie69now if I could only find an openoffice channel with someone on it...02:17
sarnolddoes it have to be openoffice? i thought that project was pretty much dead02:19
sarnoldbut there's 198 folks in #libreoffice02:19
dpb1198 poor souls02:26
dpb1:)02:27
sarnold:D02:27
Howie69I didn't realize that openoffice is dead... I just updated it last week02:42
Howie69I use openoffice on windows public machines because MS Office is retardedly expensive to use on a public thin client :)02:42
cpaelzergood morning05:00
lordievaderGood morning05:57
Neo4what is good book about apache2.4 ?07:43
Neo4I'm going to read something07:43
Neo4lack knowledge07:43
hateballNeo4: I guess you can ask in #httpd they probably have some tips07:44
Neo4hateball: yes, and you personally what have read about?07:45
Neo4LAMP is always used, and we need knowing it07:46
Neo4hateball: I saw one book apache2 2002 years, does that book appropriate for 2018? )))07:46
Neo4hateball: I've install /localhost/manual , but that manual very boring read07:47
Neo4hateball: manual is enough https://ibb.co/cWQiOy07:48
Neo4$07:51
Neo4$07:51
Neo4$07:51
Neo4What do read about ubuntu - server?07:51
Neo4or about linux?07:51
hateballNeo4: Personally I don't read books. I just try and do something, if I fail I read the man-pages or search online for solutions07:52
hateballLearning by doing07:52
Neo4hateball: I am used to read books, Now can't stop :(07:52
Neo4hateball: I'm going to read 30 book dedicated linux,07:53
hateballGood luck!07:53
Neo4and I read only 7, 2 not about linux07:53
Neo4hateball: see books that I've read this year https://ibb.co/hN1t6J07:55
Neo4hateball: my record 30 English books for year, I want to increase to 50. Could it help me with English? I read in internet some people read 100 books per year.07:56
Neo4hateball: the best was linux bible07:57
Neo4really very useful, others are crape07:58
tobascojamespage: coreycb do you think we could get a point release for neutron 12.0.2 http://tarballs.openstack.org/neutron/neutron-12.0.2.tar.gz09:14
tobascoon UCA xenial i can only see 12.0.1 right now, and there is a annoying bug that is fixed in 12.0.209:14
tobascoit's actually pretty critical since it disrupts network09:26
Neo4when I do: a2dissite 000-default.conf I got this site09:39
Neo4and I don't understand why I can reach site http://test2 or http://test if in my /etc/hosts they not exist?09:40
Neo4strange behavior09:40
kiokoman- /etc/apache2/sites-enabled is empty ?09:44
Neo4empty09:54
Neo4kiokoman: see my host file https://ibb.co/d9QL3y09:54
Neo4kiokoman: in /etc/apache2/sites-enabled this09:56
Neo4https://ibb.co/ejciOy09:56
Neo4when I do systemctl stop apache2.service I can't reach09:57
Neo4how browser know about http://test2 if /etc/hosts doesn't have record?09:58
Neo4and why apache2 show sites if all disabled?09:58
kiokomanmaybe cache, idk10:00
Neo4kiokoman: maybe not cache it sees when apache stop and show10:03
lordievaderNeo4: Do you have a domain set up in `/etc/resolv.conf`?10:03
Neo4something says browser that test2 is myserver10:03
Neo4now check10:04
Neo4lordievader: no https://ibb.co/mcnWbJ10:05
Neo4if it was cache browser wouldn't refresh when apache stopped10:06
lordievaderDoes `test2.localdomain` resolve to your server?10:06
lordievader`dig @127.0.0.1 test2.localdomain`10:07
Neo4yes10:07
Neo4http://test2.localdomain show apache main page10:07
Neo4test.localdomain and test110:08
Neo4all sites that I created before10:08
lordievaderSo, that is why `test2` resolves to your server.10:08
Neo4lordievader: why?10:09
Neo4$/etc/hosts doesnt' have test2 test test110:10
Neo4I though we put name in hosts10:10
lordievaderYou have a domain defined in `/etc/resolv.conf`. This gets appended to `test2`, which is resolvable.10:10
Neo4lordievader:10:11
Neo4I have there this two10:11
Neo4nameserver 127.0.1.110:11
Neo4search localdomain10:11
Neo4ddd.localdomain doesn't work10:12
Neo4only that I created before, but I removed them10:13
lordievaderThere is no host with the name `ddd` in your network?10:14
Neo4lordievader: no, nor with test210:15
Neo4why I have test2 host?10:15
Neo4I remove that from /etc/hosts10:15
lordievaderPerhaps your resolver (dnsmasq?) has cached that entry.10:15
Neo4lordievader: see https://paste.ubuntu.com/p/rYf4p66yDd/10:19
lordievaderWhat is in `/etc/hosts`?10:20
Neo4lordievader: I tried add dddd virtual host and then remove it using my shell script. It seems something wrong with it10:20
Neo4lordievader: https://paste.ubuntu.com/p/8smFrPkRVN/10:21
kiokomanhost is a dns lookup utility, you must have son dns server caching it somewhere10:23
kiokoman*some10:23
lordievaderYeah, that is my guess too. Dnsmasq (or something) caching the answe.10:23
lordievaderanswer*10:24
kiokomansudo service network-manager restart10:26
kiokomansudo kill -HUP $(pgrep dnsmasq)10:26
Neo4kiokoman: my local computer where installed vmware https://paste.ubuntu.com/p/YDjCSB9SHM/10:27
Neo4it means hosts on my local computer lnked to virtual machine hosts10:28
Neo4if domain in parent os (how it called suppervisor os?) that it aveilabe in virtual machine10:29
Neo4no I commendted and all right10:29
Neo4do you understand?10:29
kiokomanhttps://kb.vmware.com/s/article/101364410:30
kiokoman?10:30
Neo4my vmware see host form /etc/hosts where its installed10:30
Neo4kiokoman: don't know, just on virtual machine don't create sites with name that has parent computer cause they will intersect10:32
Neo4this is not cache10:32
Neo4I interesting will my vmware see ip my parent?10:33
Neo4ping that10:33
Neo4kiokoman: it can ping10:35
Neo4see from virtual machine we can reach outside computer10:35
Neo4without share folder, using ssh10:35
Neo4and filezila10:35
Neo4interesting why I have 3 ip when I do hostname -I ?10:36
Neo4before it was always one10:36
Neo4$10:41
Neo4$10:41
Neo4$10:41
Neo4who know why there 3 ip addresses?10:41
Neo4https://paste.ubuntu.com/p/M3dd6Wms4Q/10:41
Neo4hostnam -I show all ip addressess for hostname, my hostname neo, FQDN mail.neo.ru10:41
Neo4for virtual machine I have only one IP, and I use this "howtname -I" for determine IP adress in my shell scripts, it is right?10:42
RoyKNeo4: pastebin output of "ip a"12:03
Neo4RoyK: https://paste.ubuntu.com/p/HxHZsWwSmh/12:04
Neo4RoyK: I think maybe real host will have one ip and for shell enough hostname -I12:04
Neo4I cna check before run shell if one ip12:05
Neo4and this ip I use it a few times, one for put to apache ServerName ip12:06
Neo4might once only12:06
Neo4but interesting why there 3 ip12:06
Neo4each computer has 1 IP doesn't it?12:07
Neo4how could 1 computer has 3 IP?12:07
RoyKlooks like you have two virtual machines there, each with an IP address12:08
Neo4RoyK: yes, had before two and remove one cause didnt have space, do you think its virtual machine added12:09
Neo4RoyK: yes, I remember i had one only before12:09
Neo4RoyK: or maybe no, virtual machine has different ip12:10
Neo4vmnet1 - virtual machine12:11
RoyKit's a virtual interface12:12
RoyKvmware?12:12
Neo4RoyK: yes12:13
RoyKwell, what's the problem? ;)12:13
Neo4RoyK: when we isntlal vmware our host has one more ip?12:13
Neo4RoyK: without problem now12:13
RoyKwe have a machine, without VMs at work, that has 64 IP addresses12:13
RoyKdoing NAT operations for a few thousand users, so it needs a lot of addresses to balance the load (since there's only 65k TCP/UDP ports)12:14
Neo4ok, I don't understand this :)12:16
Neo4this theme12:16
lordievaderRoyK: Hahaha, nice 😁12:23
rbasakahasenack: would you be OK reviewing https://code.launchpad.net/~racb/usd-importer/+git/usd-importer/+merge/345617 please?12:59
rbasaknacc: ^12:59
* ahasenack takes a look12:59
jason_grammenosthe following process is hanging13:05
jason_grammenos  /usr/bin/python3 /usr/lib/ubuntu-release-upgrader/check-new-release -q13:05
jason_grammenosi am trying to figure out why13:06
jason_grammenosbut nothing i do seems to be able to replicate the issue13:06
jason_grammenosit only hangs when invoked from the cron.weekly13:06
jason_grammenosbut never when run manually13:06
tomreynthis can be due to different environments when you run it vs. when run by cron13:15
jason_grammenosi figured as much, so i attempted to run it with env -i13:16
jason_grammenosafter dumping the environment of one of the hung process (cat /proc/pidnumber/environ)13:17
tomreyndoes it also hang when you make the cron job run without -q ? i would guess it will, and if it does, this may hint on where it gets stuck.13:17
jason_grammenoshmm, the cron job only runs once a week13:17
jason_grammenosso i guess i could modify the job and wait a week13:18
tomreyni would think the daily cron jobs run in the same environment13:18
jason_grammenosgood point13:18
tomreynand the hourly ones, too13:18
jason_grammenosok, i copied the cron job over to the hourly13:19
jason_grammenosi might also try one in cron.d13:20
jason_grammenoswith a really short run time13:20
tomreynright, or root's crontab.13:20
tomreynon a 16.04 system (i do not know what you are running there, you did not say), /usr/lib/ubuntu-release-upgrader/check-new-release is a symlink to /usr/bin/do-release-upgrade13:21
tomreynso you could probably just run "/usr/bin/do-release-upgrade -cq" instead (with or without the q)13:21
jason_grammenos14.04 and yes it is a symlink13:21
tomreynbut i guessw that's not the issue, it should not cause it to get stuck13:22
jason_grammenosya, running it manually like that as root, it does not hang13:23
tomreynwhen you type 'sh' and, once there, run "env -i /usr/bin/python3 /usr/lib/ubuntu-release-upgrader/check-new-release" - does it get stuck?13:24
tomreyn^ as root13:25
jason_grammenosno13:26
jason_grammenosit ran successfully13:26
tomreynokay, it was worth a try ;)13:26
jason_grammenos:)13:26
tomreynit will be some network related issue, such as a mandatory proxy server not set13:28
jason_grammenosno proxies in my environment13:28
tomreynif this changed cron job doesn't help you identify the issue, you can still use the python debugger (as seen in the second example, invoking it as a python module on the command line): https://docs.python.org/2/library/pdb.html13:32
jason_grammenosso my per minute cron job runs fine13:32
jason_grammenos* * * * * root /etc/cron.hourly/update-notifier-common > /tmp/test.log13:32
tomreynthis would not catch stderr output13:34
jason_grammenosso at this point i am starting to suspect some race condition or something, as in the job happens to run when some other schedule job runs and then bump heads13:34
jason_grammenossure i guess it wont catch stderr output but it also is not hanging13:34
tomreynright13:34
=== RoyK^ is now known as RoyK_Heime
tomreynand i agree the race condition or dead locking sounds like a possible explanation13:35
jason_grammenosi was expecting if it failed to see multiple hang jobs in ps -ef13:35
jason_grammenoss/hang/hung/13:36
tomreynfailed, as in hung? then that would be my expectation, too.13:36
tomreynotherwise this theory seems wrong13:37
jason_grammenosright13:37
jason_grammenosi was also hopign the strace -p pid would help13:37
jason_grammenosbut i dont get anything i see as usefull in the ouput13:37
jason_grammenosbrief as it is13:37
tomreynbtw the cron.*ly jobs are run by /etc/crontab - you can modify the times when they run for your testing purposes13:38
jason_grammenosah, cool thanks13:38
tomreynmake sure you keep the original times somewhere, though13:39
jason_grammenosright good idea13:39
tomreynand keep in mind that running some of the regular cron jobs in shorter period can have adverse effects. e.g. log rotation13:40
jason_grammenosright13:41
coreycbtobasco: yes i'll get working on another queens update. must've just missed neutron with the last one.13:41
coreycbtobasco: we'll be tracking the queens updates in bug 177157213:46
ubottubug 1771572 in Ubuntu Cloud Archive "[SRU] queens stable release update" [Undecided,New] https://launchpad.net/bugs/177157213:46
* tomreyn afk13:49
tobascocoreycb: tyvm!14:05
ahasenackrbasak:14:13
ahasenack+        if self.raw_repo and self._delete_on_close:14:13
ahasenack+            shutil.rmtree(self.local_dir)14:13
ahasenackshouldn't that be self._local_dir?14:13
rbasakahasenack: local_dir is a property that returns _local_dir14:15
ahasenackah, I see it14:15
ahasenackthx14:15
rbasakI looked for a pattern to follow just now.14:15
rbasakThe only other instance in the class itself seems to be in _maybe_quiltify_tree_hash which uses the property.14:16
rbasakSo it's consistent at least.14:16
ahasenackrbasak: I'm getting leaked tmpdirs in /tmp when running  pytest-3 gitubuntu/test_importer.py. master doesn't have this behavior15:02
rbasakThank you for spotting that. I didn't think to look, assuming that the test caught it.15:03
rbasakI'll take a look now.15:03
ahasenackrbasak: at the end of test_importer_main_cleanup_on_exception, the assert makes sure that the directory is emtpy, but it still exists15:03
rbasakReproduced15:04
rbasakAh right15:05
rbasakahasenack: http://paste.ubuntu.com/p/wjC6DBHRpN/ fixes it I think.15:09
rbasakThe diff looks horrible but really the change is in indentation15:10
rbasakhttp://paste.ubuntu.com/p/VqNGX2wwmz/ is clearer15:10
ahasenackcommit on top and I can try15:10
rbasakahasenack: pushed15:12
rbasakahasenack: though that's the test I'm proposing to drop anyway15:12
ahasenackok15:13
ahasenackin other news15:13
ahasenackwhat does this mean?15:13
ahasenacktrying: apache215:13
ahasenackskipped: apache2 (55, 0, 10)15:13
ahasenack    got: 15+0: a-8:a-1:a-1:i-1:p-3:s-115:13
ahasenack    * ppc64el: libapache2-mod-proxy-uwsgi-dbg, libapache2-mod-shib215:13
rbasakIt means that libapache2-mod-proxy-uwsgi-dbg and libapache2-mod-shib2 become uninstallable on ppc64el if apache2 were to migrate to the release pocket15:14
ahasenackugh15:14
kristian2709_Hey. I am getting this error. "mount: mounting https://images.maas.io/ephemeral-v3/daily/bionic/amd64/20180426.2/squashfs on /root failed: No such device". What I basically want is to pxe boot the ephemeral image from a custom pxe server. My kernel is "https://images.maas.io/ephemeral-v3/daily/bionic/amd64/20180426.2/ga-18.04/generic/boot-kernel", initrd is "https://images.maas.io/ephemeral-v3/daily/bionic/a15:21
kristian2709_md64/20180426.2/ga-18.04/generic/boot-initrd" and cmdline args "root=squash:https://images.maas.io/ephemeral-v3/daily/bionic/amd64/20180426.2/squashfs ro". Am I missing something?15:21
tomreynkristian2709_: /join #maas15:40
rbasakcpaelzer, ahasenack: I don't think I'll be able to do the chrony review in the time I have left today, sorry.16:04
ahasenackrbasak: hmpf, turns out libapache2-mod-shib2 (one of the packages from the error message) is already uninstallable in the previous apache package16:29
rbasakahasenack: AFAIK, not-worse is the criteria. Perhaps the real cause is the other one?16:30
ahasenackyeah, I'm tracing it down16:31
ahasenackeventually libxmltooling7 gets installed, and that fails because it wants libcurl3 which is what removes apache16:31
ahasenack libxmltooling7 : Depends: libcurl3 (>= 7.16.2) but it is not going to be installed16:31
ahasenackI have to understand what's the story with libcurl3 and libcurl4 in the archie16:32
ahasenackarchive*16:32
ahasenackthere is libcurl3-gnutls, for example, but no libcurl4-gnutls16:32
ahasenackand so on16:32
ahasenackand libcurl4-gnutls-dev depends on libcurl3-gnutls (!)16:33
ahasenackhm16:38
ahasenackxmltooling (1.6.4-1ubuntu2) bionic; urgency=medium16:38
ahasenack  16:38
ahasenack  * Switch back to openssl1.0 via newly-added libcurl-openssl1.0-dev, since16:38
ahasenack    libxml-security is not ported to openssl1.1.16:38
jr_adminhi i keep getting emails from awstat.conf that it cant open access.log ...can anybody help me16:46
jr_adminpermission denied16:47
jr_adminhow do i have permmission for awstat.conf to write to access.log16:47
ahasenackjrahmy: there is a bug for that19:19
ahasenackhm, can't find it now19:19
ahasenackah19:20
ahasenackjrahmy: sorry, not you19:20
ahasenackjr_admin, who is gone19:20
ahasenackjr_admin: https://bugs.launchpad.net/ubuntu/+source/awstats/+bug/125246719:20
ubottuLaunchpad bug 1252467 in awstats (Ubuntu) "/etc/cron.d/awstats: wrong user for cron job" [Undecided,Triaged]19:20
=== miguel is now known as Guest45971
hackeronhi there, quick question, I installed 18.04 and /etc/default/rcS is missing, more specifically I cannot find the FSCKFIX=yes option anywhere. Can someone please point me to the 18.04 equivalent please?22:16
nacchackeron: it's there in my 18.04; do you have 'initscripts' installed?22:35
JanCnacc: I assume it wouldn't be used though?22:37
JanCnot sure exactly what the FSCKFIX=yes alternative would be with systemd22:39
hackeronJanC: hmm, initscripts is no longer used?22:40
naccJanC: i'm not sure )22:40
nacc:)22:40
JanChttps://discourse.osmc.tv/t/automatic-fsck-of-root-filesystem-on-start-stop/9163/2 might be useful22:41
JanCalthough it seems old22:41
JanCbasically, adding "fsck.repair=yes" to the kernel command line is supposed to do the same22:44
JanCyou should be able to do that with 'GRUB_CMDLINE_LINUX' in '/etc/default/grub' if you need it added to all kernel command lines automatically (run 'sudo update-grub' afterwards)22:49
JanCif you need it only once you can do that in grub itself, of course22:49
JanC(when booting)22:49
JanCand of course remember that sometimes it breaks your filesystem instead of fixing it  :)22:51
JanC(well, it would likely "fix" it, but you might lose data)22:52
=== hehehe is now known as Guest88251
=== Guest88251 is now known as hehehe
hackeronJanC: oh neat! I'll try that thank you :)23:14
JanChackeron: I didn't test it, so be careful  :)23:14
Neo4why sudo apt-get purge apache2.* doesn't remove apache and23:56
Neo4sudo apt-get purge apache2* can remove?23:56
Neo4what is difference between apache2* and apache2.* ?23:56
Neo4this both equal23:56
Neo4.* mean any symbol?23:56
tewardNeo4: because Bash/APT globbing isn't regex23:57
tewardit's straight globbing23:57
tewardi.e. apache2* is equivalent to the regex /apache2.*/23:57
teward(between the slashes is the regex)23:57
Neo4teward: what is dot equvalent?23:58
Neo4. - any symbol?23:58
tewardNeo4: i just gave you this...23:58
teward***it's not regex***23:58
tewardit is NOT a regular expression, it does not work AT ALL like a regular expression.  The single asterisk will mean Any Character23:58
tewardunlimited number of them23:58
tewardso REGEX(apache2.*) == GLOBBING(apache2*)23:58
tewardso just use apache2*23:59
Neo4teward: ok, see I read how to remove php and there people suggested using php.* instead php* becasue php* could match ph(any symbol) they might have been wrong?23:59
Neo4in this topic https://askubuntu.com/questions/59886/how-to-completely-remove-php23:59
tewardNeo4: yes, they were wrong.23:59
tewardbut that's to remove PHP23:59
teward**NOT** Apache23:59
tewardthat's a completely different question.23:59

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