| cardoe | JayF: I’m reverting the change to _lookup that you asked for. It causes the existing tempest tests to fail. They coded expecting the fall through which makes pecan return a 405. | 00:35 |
|---|---|---|
| cardoe | In fact most things are using the fall through pattern and hitting a 405 when unsupported but only recently did we start to return a 404. | 00:38 |
| opendevreview | Doug Goldstein proposed openstack/ironic master: runbooks: add traits support, description field, and v1.112 API https://review.opendev.org/c/openstack/ironic/+/983215 | 00:45 |
| FreemanBoss[m] | Good morning ironic | 07:22 |
| opendevreview | Konstantinos Karampogias proposed openstack/ironic master: Fix IPA boot during out-of-band service steps https://review.opendev.org/c/openstack/ironic/+/983010 | 07:52 |
| opendevreview | Olamide Ojo proposed openstack/ironic master: Auto close consoles https://review.opendev.org/c/openstack/ironic/+/983833 | 08:48 |
| opendevreview | Olamide Ojo proposed openstack/ironic master: Auto close consoles https://review.opendev.org/c/openstack/ironic/+/983833 | 09:19 |
| TheJulia | good morning | 12:58 |
| cardoe | morning | 13:13 |
| TheJulia | good morning | 13:16 |
| TheJulia | ready for some time in front of a camera | 13:16 |
| clif | gm o/ | 13:28 |
| * cardoe looks around for the link. | 13:40 | |
| TheJulia | your calendar perhaps? | 13:42 |
| cardoe | TheJulia: its too early for your logic! | 13:47 |
| TheJulia | but time to join in! | 13:48 |
| TheJulia | JayF: ring ring ring bananaphone... I mean, steamyard time | 13:48 |
| clif | JayF: get in here! | 13:48 |
| cardoe | cid: JayF says you can help me fix my stackalytics since you just did yours... can you point me in the right direction? | 13:56 |
| cid | cardoe. Yeah sure. | 13:57 |
| cid | Mine actually just landed yesterday. | 13:57 |
| cid | https://review.opendev.org/c/x/stackalytics/+/982167 | 13:58 |
| cid | The only thing that took me a little while to figure out is what determines the ordering and it was the launchpad id | 13:58 |
| cid | Even that is not the case for all, but most... | 13:59 |
| cardoe | JayF: I'd like to talk about that lookup change cause I think we need to standardize. | 13:59 |
| JayF | that's my favorite word ending in -ize | 13:59 |
| cardoe | cid: thank you. After this OpenInfra session I'm gonna follow what you did. | 13:59 |
| cid | +++. Didn't know it went live already. | 14:02 |
| opendevreview | David Nwosu proposed openstack/ironic master: WIP: Add global node history endpoint https://review.opendev.org/c/openstack/ironic/+/983144 | 14:03 |
| cid | OpenInfra Live ongoing now... https://www.youtube.com/watch?v=zrL62jyoEZs | 14:09 |
| Continuity | Howdy Ironic people, anyone using routed segments alongside ironic today? | 14:12 |
| TheJulia | Continuity: with flat-ish networks? | 14:14 |
| Continuity | Yeah.... Vlan provider | 14:14 |
| TheJulia | I know some folks have done it, I know hjensas did a lot of work in there years ago, but its really not ideal because of the fixed routing and shared networks tenants leverage. | 14:15 |
| Continuity | Im trying to work out the best way of scaling past the usual subnet limits, but trying to keep things simple, and routed segments, are not.... :D | 14:15 |
| TheJulia | noooo, they are really not | 14:15 |
| TheJulia | since your front loading all IP traffic scaling to the physical network which is then routed too | 14:15 |
| TheJulia | I guess leaning towards provider networking with pre-configured flats because you can't do lower level swtich automation ? | 14:17 |
| Continuity | Yeah, trying to keep things cloudy and automated as much as possible | 14:27 |
| Continuity | Current idea is to do | 14:28 |
| Continuity | Pure l3, with OVN Geneve, and terminate Geneve on our DPUs.. | 14:28 |
| Continuity | Although I can see some exciting times there | 14:28 |
| TheJulia | heh | 14:28 |
| Continuity | Dont ruin it for me.. I look forward to it all being in a heap | 14:29 |
| TheJulia | okay, don't bang your head against that too much before jumping in irc ;) | 14:29 |
| TheJulia | I'm hoping in the next few months trying to hook some DPUs into BGP EVPN and extending vxlan via it to remotely configure the dpu via n-g-s, but thats a little different of a model and approach. | 14:30 |
| cardoe | mmmm DPU terminating Geneve... I want some of those. | 14:39 |
| * TheJulia notes its too early to bake cookies | 14:43 | |
| cardoe | kubajj: I want to make a spec to let us run redfish inspection even when the node is active and deployed. | 14:49 |
| kubajj | cardoe: so now it works only if we have a node which is in enroll or manageable state? | 14:50 |
| cardoe | yeah it's just like agent | 14:50 |
| kubajj | cardoe: my question about auto-enrollment was because we only inspect at enrollment time (checking if the vendor actually delivered what they promised) - if we could use redfish inspection, it would save me from the occasional inspection failure (and also be faster) | 14:51 |
| cardoe | Cause the interface driver doesn't make that choice like others with the "disable_ramdisk" option. It's enforced much higher up in Ironic. | 14:52 |
| cardoe | kubajj: that's exactly what we've done with redfish. That's why we added storage controllers and PCI walking. | 14:52 |
| cardoe | kubajj: I'm happy to work with extending it more if you've got some other ideas or needs. | 14:53 |
| TheJulia | So, a path we did wire up ages ago was the idea of being able to go take a generic ramdisk and boot it and hopefully discover your ironic, and maybe from there be able to magically register the node, but the other underlying challenge is getting and matching details when you might not be able to discover the bmc from a ramdisk and really if your trying to get out of the ramdisk entirely you have to have the BMC data and | 14:53 |
| TheJulia | enroll it | 14:53 |
| kubajj | cardoe: I don't really have a need, just thought it would be cool :D | 14:53 |
| TheJulia | which means, your really not auto-discovering at that point workflow wise | 14:53 |
| TheJulia | since credentials are needed | 14:53 |
| JayF | I'll also note, from an opinionated software standpoint: I think auto-discover/enrollment is an anti-pattern of the highest order. | 14:56 |
| kubajj | cardoe: sorry, what is PCI walking? google just gave me some medical articles | 14:57 |
| TheJulia | I think there are entirely different use cases and models | 14:57 |
| JayF | Validating the information going into Ironic is accurate, and the hardware matches it's manifest is an important step in setup | 14:57 |
| kubajj | JayF: why? | 14:57 |
| TheJulia | kubajj: enumerating all the PCI addresses | 14:57 |
| kubajj | TheJulia: thanks | 14:57 |
| JayF | I-personally have seen more than a 10% failure rate in hardware racks matching up with what they say is inside | 14:57 |
| JayF | sometimes missing ram. sometimes bad cabling. | 14:57 |
| TheJulia | since BMCs only have out of band details via i2c bus, which is parallel to the PCI bus | 14:57 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: ci: multiple test bugs with the cover tests https://review.opendev.org/c/openstack/ironic-python-agent/+/983882 | 14:59 |
| TheJulia | if I could get some quick eyes on ^, CI on IPA seems super unhappy for the tox job and ultimately multiple tests seem to intermittently fail, hopefully this makes it better | 14:59 |
| kubajj | JayF: but we use auto discovery to be able to validate | 15:00 |
| JayF | TIL about itertools.cycle | 15:00 |
| JayF | that is cool | 15:00 |
| kubajj | JayF: yep, very cool | 15:02 |
| clif | itertools is a great part of the standard library | 15:03 |
| JayF | kubajj: I think Julia was right about there being different use cases. I like a formal handover with human validation :) | 15:03 |
| JayF | clif: oh, I know, I just never saw cycle() | 15:03 |
| TheJulia | yeah, everyone I've talked to has slightly different processes on how they want and need to handle hardware intake and inventory | 15:03 |
| clif | sure, just saying :) | 15:03 |
| TheJulia | And of course, I can be on calls with vendors where they also complain about default credential burnins and some integratros hand spreadsheets of usernames/passwords/addresses | 15:04 |
| TheJulia | but ultimately not everyone uses those integrators to do the first pass rack/stack, many shops DIY which is fine. At the end of the day there is a business process question which is also unioned up against "accounting" | 15:04 |
| TheJulia | and whatever that is, is how they roll | 15:05 |
| kubajj | JayF: our fabric team installs the nodes, turns them on and they get registered in ironic, then they fetch inspection data - validate it according the spec, run burn in and then they give it to our team to give to customers | 15:05 |
| TheJulia | Great job folks on OI Live, it was excellent! | 15:06 |
| TheJulia | and thank you everyone for your patches this past cycle! | 15:06 |
| clif | \o/ | 15:08 |
| kubajj | some very cool features - excited to upgrade and give them a try | 15:08 |
| cardoe | kubajj, TheJulia: I'm aiming to write up a rough "framework" or "walk through" of a hardware intake process in the Ironic docs with some details on where and how you can use Ironic for different pieces. | 15:08 |
| TheJulia | cardoe: that actually would be pretty good, I mean, its not the process, but there are options and highlighting options is the key | 15:09 |
| * TheJulia steps away to head up the mountain | 15:09 | |
| cardoe | Exactly not wanting to say "this is how it shall be done" but more like "So you need to hardware in take... 1. you want to have a validation against a spec sheet... here's some ways you could do it... agent inspect and compare data... redfish inspect and compare data... set a trait on the box or a property that says validated or only set the resource class once it's been validated. 2. you want burn in.. here's how to boot" | 15:11 |
| cardoe | sooo bindep.txt in the top level... we use that for devstack and we use that for unittests? | 15:12 |
| cardoe | I'm wondering why mysql-server / mariadb-server is part of the "default" install | 15:13 |
| JayF | we use mysql in unit tests | 15:13 |
| JayF | which is what bindep is mainly pointed at | 15:13 |
| kubajj | cardoe: Happy to write up bits of it about how we use it here | 15:13 |
| cardoe | kubajj: yeah anything you've got to share would be a great starting point. | 15:13 |
| opendevreview | Ivan Anfimov proposed openstack/ironic-specs master: Remove outdated comment in setup.py https://review.opendev.org/c/openstack/ironic-specs/+/983889 | 15:14 |
| opendevreview | Ivan Anfimov proposed openstack/ironic-specs master: Remove outdated comment in setup.py https://review.opendev.org/c/openstack/ironic-specs/+/983889 | 15:14 |
| JayF | single core merging that as a trivial change (removes two comments) | 15:15 |
| TheJulia | fine as long as no code is also changed | 15:16 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: ci: multiple test bugs with the cover tests https://review.opendev.org/c/openstack/ironic-python-agent/+/983882 | 15:19 |
| TheJulia | okay, revising that patch because I can't run pep8 locally anymore either | 15:19 |
| TheJulia | 3 of the patches on https://review.opendev.org/q/project:openstack/ironic-python-agent+hashtag:ironic-week-prio+status:open should begin to get IPA a better state (and will allow me to run pep8 locally again) | 15:23 |
| cardoe | We need to fix python-ironicclient as well and likely backport a setuptools pin or something | 15:32 |
| TheJulia | woot, https://review.opendev.org/c/openstack/ironic-python-agent/+/983882 passes all unit, cover, and pep8 | 15:33 |
| TheJulia | (that doesn't mean I've squashed everything, we seem to be ripe for issues there overall) | 15:34 |
| -opendevstatus- NOTICE: Anubis is now deployed on our Gitea backends, and things are back to working normally though you may notice an Anubis screen flash briefly when starting to browse opendev.org; any jobs which failed prior to 15:00 UTC today can be safely rechecked | 15:34 | |
| TheJulia | woot | 15:34 |
| dtantsur | anubis ftw | 15:35 |
| cardoe | commented | 15:35 |
| cardoe | dtantsur: if ya get any more cycles to peek at https://review.opendev.org/c/openstack/ironic/+/983215 there's a few things I'm going to address as follow ups to keep this patch small | 15:35 |
| opendevreview | Merged openstack/ironic-specs master: Remove tags from README https://review.opendev.org/c/openstack/ironic-specs/+/972355 | 15:36 |
| opendevreview | Merged openstack/ironic-specs master: Remove outdated comment in setup.py https://review.opendev.org/c/openstack/ironic-specs/+/983889 | 15:36 |
| dtantsur | Just let me suffer 45 minutes more of meetings | 15:36 |
| dtantsur | (and maybe grab a snack afterwards) | 15:36 |
| opendevreview | Doug Szumski proposed openstack/tenks master: Support setting Ironic shard key and conductor group https://review.opendev.org/c/openstack/tenks/+/983901 | 15:38 |
| TheJulia | cardoe: fixing the pyproject.toml change | 15:39 |
| TheJulia | and of course breakfast appears | 15:40 |
| JayF | cardoe: https://review.opendev.org/c/openstack/ironic/+/983215/10#message-70a1e4484e91d7f65a9c17ab6d6515c472cb51c7 a comment on the release note, if you don't mind | 15:41 |
| JayF | cardoe: I can upgrade that to a +2 with a follow up promise or a fix :) IDK if you expect this to be final patchset or not though | 15:41 |
| opendevreview | Julia Kreger proposed openstack/python-ironicclient master: Migrate setup configuration to pyproject.toml https://review.opendev.org/c/openstack/python-ironicclient/+/981226 | 15:47 |
| opendevreview | Stephen Finucane proposed openstack/python-ironicclient master: Migrate coverage configuration to pyproject https://review.opendev.org/c/openstack/python-ironicclient/+/981227 | 15:47 |
| opendevreview | Julia Kreger proposed openstack/python-ironicclient master: trivial: move to hacking 7.0 https://review.opendev.org/c/openstack/python-ironicclient/+/983902 | 15:52 |
| TheJulia | cardoe: https://review.opendev.org/q/project:openstack/python-ironicclient+status:open+hashtag:ironic-week-prio no setuptools pin seems needed, but we'll see what CI comes back with in general | 15:56 |
| TheJulia | (since it would have failed earlier on if it was needed) | 15:56 |
| TheJulia | others: I've been flagging needful changes on some of our repos as ironic-week-prio, please take a little bit to reivew open prio changes | 16:13 |
| cardoe | TheJulia: https://review.opendev.org/c/openstack/python-ironicclient/+/977407 stuff like that hasn't been able to backport. | 16:14 |
| cardoe | That patch required me to do funky endpoint catalog overrides until we included it ourselves. | 16:15 |
| TheJulia | oh, yeah, much older branches are likely | 16:15 |
| cardoe | JayF: my intention was that was the last patch but I can update the release note and push another version | 16:15 |
| cardoe | JayF: soooo here's my question... if an API microversion isn't supported for an operation... do we return 405 or 404? | 16:17 |
| JayF | it depends on the operation | 16:17 |
| JayF | GET /v1/doesntexistinthisversion = 404 | 16:17 |
| JayF | right? | 16:17 |
| cardoe | Not for most of the code base. | 16:17 |
| JayF | There's an API doc that covers this behavior, and finding it might be better than trusting my memory | 16:18 |
| cardoe | That's only true for the new changes to portgroup and new node changes. | 16:18 |
| JayF | becaues it's way more likely I'm wrong than the whole code base | 16:18 |
| JayF | lol | 16:18 |
| cardoe | Otherwise the rest of the code base is 405 and tempest checks for 405. | 16:18 |
| cardoe | Now I would agree with you that 404 is probably more correct? | 16:18 |
| JayF | I think the correct thing is in the API docs around microversion behavior and/or the spec around it | 16:18 |
| JayF | which at this point is probably old enough to be in high school :( | 16:18 |
| cardoe | But this feels like something we should put in developer notes that "thou shalt return 404/5 in this case" | 16:19 |
| cardoe | And maybe it is like you said.. | 16:19 |
| JayF | This convo should basically get a big pause button until we find and look at the API microversion spec/rules doc | 16:19 |
| cardoe | I dunno. But there's inconsistency.. things added since like 1.99 microversion or so seem to do 404 and things prior to that are 405 | 16:20 |
| TheJulia | Some items 404 explicitly if you don't have access as well | 16:20 |
| TheJulia | just depends on the *what* and its going to differ depending on the matrix of conditions | 16:21 |
| opendevreview | Doug Szumski proposed openstack/tenks master: Support setting Ironic shard key and conductor group https://review.opendev.org/c/openstack/tenks/+/983901 | 16:39 |
| cardoe | Continuity: is that for regular networking or cleaning and provisioning networks to do a segment per switch? | 16:47 |
| Continuity | Regular networking | 16:47 |
| Continuity | Thinking about massive scale clusters, where we may need to have 5-10-15k hosts on the same front end, | 16:48 |
| Continuity | Trying to work out the best way to skin that cat | 16:48 |
| Continuity | And possibly in the same tenancy, avoiding having to use ovn routers to get between stuff | 16:49 |
| Continuity | I might be over thinking it | 16:49 |
| Continuity | It has been know | 16:49 |
| TheJulia | heh, another test race condition in ipa | 16:49 |
| opendevreview | Merged openstack/python-ironicclient master: Migrate setup configuration to pyproject.toml https://review.opendev.org/c/openstack/python-ironicclient/+/981226 | 16:56 |
| cardoe | Implement a custom router flavor that's doing stuff on the fabric... ;) | 17:05 |
| TheJulia | Yeah, I guess the basic issue is in the OVN world, OVN sort of expects to always be the routing force | 17:06 |
| TheJulia | And your starting to loose some of the value of OVN when just viewing it for higher level traffic flow orchustration | 17:07 |
| TheJulia | to each their own, I guess | 17:07 |
| opendevreview | Merged openstack/ironic-python-agent master: ci: multiple test bugs with the cover tests https://review.opendev.org/c/openstack/ironic-python-agent/+/983882 | 17:16 |
| opendevreview | Merged openstack/python-ironicclient master: Migrate coverage configuration to pyproject https://review.opendev.org/c/openstack/python-ironicclient/+/981227 | 17:20 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: trivial: fix imports and other test race changes https://review.opendev.org/c/openstack/ironic-python-agent/+/983917 | 17:28 |
| opendevreview | Merged openstack/networking-generic-switch master: Fix GenericSwitchNotSupported exceptions https://review.opendev.org/c/openstack/networking-generic-switch/+/983127 | 17:38 |
| opendevreview | Merged openstack/networking-generic-switch stable/2026.1: CI: Remove setuptools pin https://review.opendev.org/c/openstack/networking-generic-switch/+/983521 | 17:38 |
| cardoe | TheJulia: you're not wrong. Hence why I wanted OVN to participate in fabric-y things. | 18:21 |
| cardoe | Cannot clean node cc55adc9-82d4-4db5-b87b-778300fb0177: clean step {'interface': 'management', 'step': 'set_bmc_clock', 'order': 2} requires booting a ramdisk orly? | 18:21 |
| TheJulia | cardoe says "o'rly", conductor says "ya'rly", cardoe gets the implements to fix the conductor | 18:22 |
| TheJulia | missing a patch? I thought that was patched? | 18:23 |
| * cardoe finds a wall and bangs his head against it. | 18:24 | |
| *** hroy_ is now known as hroy | 18:24 | |
| cardoe | I marked the parameters as not required. I never set requires_ramdisk=False | 18:24 |
| cardoe | Now that I'm in here I think I wanna add 'set_bmc_clock' as a service step as well but not let users supply any arguments... like you can get the box reset back to the conductor as a service step. | 18:25 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: Migrate package metadata from setup.cfg to pyproject.toml https://review.opendev.org/c/openstack/ironic-python-agent/+/982864 | 18:26 |
| TheJulia | ugh | 18:27 |
| TheJulia | well, that is clearly a bug then because the clean step logic should be able to look at the decoration | 18:27 |
| cardoe | This is a test box and the OS interface isn't disabled and someone french fried when they should have pizzaed and it's a deployed box (active) with bad BMC time. | 18:28 |
| JayF | Yeah, I was thinking about the potential of using set BMC clock in a service step as being a security concern, but given we pull the time directly off of the conductor and don't use a third-party time server, I think it is pretty universally safe | 18:29 |
| JayF | My main curiosity is if it actually takes impact in a meaningful way. That active machine likely has a service that when it is shut down it will save its current clock to the hardware clock. Updating the hardware clock may not have any logical impact in those configurations. | 18:29 |
| JayF | Because I'm assuming set BMC clock is just going to update the hardware clock, and that is really only read in it boot AIUI | 18:30 |
| TheJulia | cardoe: could they instead ruben the bmc. I need a ruben. | 18:30 |
| * TheJulia knows what lunch will be after her 1-on-1 | 18:30 | |
| cardoe | JayF: so BMC clock is the Redfish interface side and what's happening is that we get an SSL error from the conductor when doing steps but that one step ignores that SSL error that the certificate isn't yet valid | 18:31 |
| JayF | this is probably something I once knew and forgot | 18:32 |
| JayF | but the BMC having it's own hwclock makes sense | 18:33 |
| TheJulia | they almost universally have their own hwclocks | 18:38 |
| TheJulia | since they are sort of like sideloaded machines | 18:38 |
| cardoe | But that's why I'm thinking its not necessarily an "unsafe" step to let it be called with service. | 20:23 |
| JayF | yeah I'm +1 to that idea now that my only concern was talked through | 20:24 |
| TheJulia | hi brain, where is brain | 20:56 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: Update hacking to 7.0.0 https://review.opendev.org/c/openstack/ironic-python-agent/+/982867 | 20:58 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: Enforce TLS 1.2 minimum across all connections https://review.opendev.org/c/openstack/ironic-python-agent/+/982174 | 20:58 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: Upgrade TLS certificates to P-384 curve with configurable support https://review.opendev.org/c/openstack/ironic-python-agent/+/982175 | 20:58 |
| * TheJulia goes and lunches | 20:58 | |
| * JayF notes for upstream he is OOO tomorrow | 21:34 | |
| TheJulia | ack ack | 21:58 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: Enforce TLS 1.2 minimum across all connections https://review.opendev.org/c/openstack/ironic-python-agent/+/982174 | 22:23 |
| opendevreview | Julia Kreger proposed openstack/ironic-python-agent master: Update auto-tls cert signing to SHA-512 https://review.opendev.org/c/openstack/ironic-python-agent/+/982173 | 22:25 |
| opendevreview | Merged openstack/python-ironicclient master: trivial: move to hacking 7.0 https://review.opendev.org/c/openstack/python-ironicclient/+/983902 | 22:40 |
| cardoe | Should I just remove the ability to specify traits on runbook creation? | 23:20 |
| cardoe | dtantsur isn't a fan of the fact that you cannot patch the traits on the runbook object but can supply them on the create. | 23:21 |
| cardoe | but JayF pointed out that there's a race when you have that from two separate users and suggested I follow the node trait model, which solves the race by not allowing a patch on the node object. | 23:21 |
| JayF | Lay out the case in both directions in gerrit? | 23:22 |
| JayF | The other thing I wonder is, right now, we only do locking on nodes | 23:23 |
| JayF | this is really a case that highlights that there are other cases we might need it to prevent the read1->read2->write2->write1 race | 23:24 |
| cardoe | I mean how its implemented right now there is no race condition. | 23:27 |
| cardoe | You were right and I fixed that. So the operation is create a runbook with any traits you want and then PUT and DELETE traits off of it and there's no race. | 23:27 |
| cardoe | But PATCH the user reads back the list client side and whole sale replaces the list by making client side edits which is racy | 23:28 |
| JayF | well, with patch you kinda expect that behavior inherently? | 23:35 |
| JayF | if at :00 someone says "make the object X", and at :01 someone says "make the object Y", it's not a bug that it ends up as Y, right? | 23:36 |
| JayF | In the code in your change, I think it was different because *ironic* did a read, append, write when we really just needed an atomic append | 23:36 |
| JayF | from a user perspective: at :00 someone says "add trait X", at :01 someone says "add trait Y" -> any situation where traits don't end up as X,Y is wrong | 23:37 |
| JayF | this is my understanding but I may be missing a nuance | 23:37 |
| cardoe | Yeah it did it in ironic and then a client side test as well. I nuked both. | 23:50 |
| cardoe | I can add it back. I just want to capture this in a spec update potentially | 23:51 |
Generated by irclog2html.py 4.1.0 by Marius Gedminas - find it at https://mg.pov.lt/irclog2html/!