IPMI-CHASSIS(8)
π IPMI-CHASSIS(8) β the chassis management utility, bestie
okay so this is ipmi-chassis from the System Commands manual, and it's literally the glow-up your IPMI chassis has been waiting for β¨
πΈ NAME πΈ
ipmi-chassis β the IPMI chassis management utility. that's it, that's the vibe π
β¨ SYNOPSIS β¨
ipmi-chassis [OPTION...]
π¦ DESCRIPTION π¦
ipmi-chassis is your girl for managing and monitoring an IPMI chassis β think chassis power, identification (which is the LED control situation, iykyk), and status. if you wanna see every single chassis management option available, just scroll down to OPTIONS, it's all there π
below you're gonna find general IPMI options, tool-specific options, troubleshooting info, workaround info, examples, and known issues. for a general intro to FreeIPMI, go peek at freeipmi(7).
real talk though β if you're trying to do IPMI chassis configuration, that'sipmi-config(8)'s whole thing. and for some advanced chassis management, hit upbmc-device(8). and if you want a way more powerful chassis power control utility?ipmipower(8), no cap π
π GENERAL OPTIONS π
these are the general options for setting up IPMI communication and running general tool commands. lowkey the foundation of everything π«Ά
-DIPMIDRIVER,--driver-type=IPMIDRIVERβ tell it which driver type to use instead of letting it auto-select. the out-of-band drivers available rn areLANandLAN_2_0, which do IPMI 1.5 and IPMI 2.0 respectively. the in-band drivers available rn areKCS,SSIF,OPENIPMI,SUNBMC, andINTELDCMI.--disable-auto-probeβ do NOT probe in-band IPMI devices for default settings. like, don't even try it.--driver-address=DRIVER-ADDRESSβ specify the in-band driver address to use instead of the probed value.DRIVER-ADDRESSshould be prefixed with"0x"for a hex value and'0'for an octal value.--driver-device=DEVICEβ specify the in-band driver device path to use instead of the probed path.--register-spacing=REGISTER-SPACINGβ specify the in-band driver register spacing instead of the probed value. the argument is in bytes (so like, 32bit register spacing =4).--target-channel-number=CHANNEL-NUMBERβ specify the in-band driver target channel number to send IPMI requests to.--target-slave-address=SLAVE-ADDRESSβ specify the in-band driver target slave number to send IPMI requests to.-hIPMIHOST1,IPMIHOST2,..., /--hostname=IPMIHOST1[:PORT],IPMIHOST2[:PORT],...β specify the remote host(s) to communicate with. multiple hostnames can be separated by comma, or you can use a range format (see HOSTRANGED SUPPORT below π). you can also toss an optional port on each host, which is super useful for port forwarding and similar situations. if you're specifying an IPv6 address AND port, use the format[ADDRESS]:PORT.-uUSERNAME,--username=USERNAMEβ the username to use when authenticating with the remote host. if you don't specify one, a null (i.e. anonymous) username is assumed. heads up: the user must have at least ADMIN privileges for this tool to operate fully π-pPASSWORD,--password=PASSWORDβ the password to use when authenticating with the remote host. if not specified, a null password is assumed. max password length is16for IPMI 1.5 and20for IPMI 2.0.-P,--password-promptβ prompts for the password so it doesn't end up listed in process lists. privacy queen behavior π-kK_G,--k-g=K_Gβ specify the K_g BMC key to use when authenticating with the remote host for IPMI 2.0. if not specified, a null key is assumed. to input the key in hexadecimal form, prefix the string with'0x'. e.g., the key'abc'can be entered with either the string'abc'or the string'0x616263'.-K,--k-g-promptβ prompts for k-g so it doesn't get listed in process lists. same energy, different secret π--session-timeout=MILLISECONDSβ the session timeout in milliseconds. defaults to20000milliseconds (20 seconds) if you don't specify.--retransmission-timeout=MILLISECONDSβ the packet retransmission timeout in milliseconds. defaults to1000milliseconds (1 second) if not specified. important: the retransmission timeout cannot be larger than the session timeout. that's the rule, periodt.-aAUTHENTICATION-TYPE,--authentication-type=AUTHENTICATION-TYPEβ the IPMI 1.5 authentication type to use. available rn:NONE,STRAIGHT_PASSWORD_KEY,MD2, andMD5. defaults toMD5if you don't say anything.-ICIPHER-SUITE-ID,--cipher-suite-id=CIPHER-SUITE-IDβ the IPMI 2.0 cipher suite ID to use. the Cipher Suite ID identifies a set of authentication, integrity, and confidentiality algorithms for IPMI 2.0 communication. the authentication algorithm is the one used for session setup, the integrity algorithm is the one used for session packet signatures, and the confidentiality algorithm is the one used for payload encryption. defaults to cipher suite ID3if not specified. here are the cipher suite ids currently supported, bestie:
0 - Authentication Algorithm = None; Integrity Algorithm = None;
Confidentiality Algorithm = None
1 - Authentication Algorithm = HMAC-SHA1; Integrity Algorithm =
None; Confidentiality Algorithm = None
2 - Authentication Algorithm = HMAC-SHA1; Integrity Algorithm =
HMAC-SHA1-96; Confidentiality Algorithm = None
3 - Authentication Algorithm = HMAC-SHA1; Integrity Algorithm =
HMAC-SHA1-96; Confidentiality Algorithm = AES-CBC-128
6 - Authentication Algorithm = HMAC-MD5; Integrity Algorithm =
None; Confidentiality Algorithm = None
7 - Authentication Algorithm = HMAC-MD5; Integrity Algorithm =
HMAC-MD5-128; Confidentiality Algorithm = None
8 - Authentication Algorithm = HMAC-MD5; Integrity Algorithm =
HMAC-MD5-128; Confidentiality Algorithm = AES-CBC-128
11 - Authentication Algorithm = HMAC-MD5; Integrity Algorithm =
MD5-128; Confidentiality Algorithm = None
12 - Authentication Algorithm = HMAC-MD5; Integrity Algorithm =
MD5-128; Confidentiality Algorithm = AES-CBC-128
15 - Authentication Algorithm = HMAC-SHA256; Integrity Algorithm
= None; Confidentiality Algorithm = None
16 - Authentication Algorithm = HMAC-SHA256; Integrity Algorithm
= HMAC_SHA256_128; Confidentiality Algorithm = None
17 - Authentication Algorithm = HMAC-SHA256; Integrity Algorithm
= HMAC_SHA256_128; Confidentiality Algorithm = AES-CBC-128
-lPRIVILEGE-LEVEL,--privilege-level=PRIVILEGE-LEVELβ the privilege level to use. available rn:USER,OPERATOR, andADMIN. defaults toADMINif you don't specify β main character energy only π--config-file=FILEβ specify an alternate configuration file.-WWORKAROUNDS,--workaround-flags=WORKAROUNDSβ specify workarounds for vendor compliance issues. you can stack multiple workarounds separated by commas. there's a special command line flag of"none"which indicates no workarounds (handy for overriding configured defaults). see WORKAROUNDS below for the list of available workarounds.--debugβ turn on debugging. we love a paper trail π-?,--helpβ outputs a help list and exits.--usageβ outputs a usage message and exits.-V,--versionβ outputs the program version and exits.
π IPMI-CHASSIS OPTIONS π
these ones are specific to ipmi-chassis. the actual chassis stuff, slay π
--get-chassis-capabilitiesβ get chassis capabilities. this returns info on which main chassis management functions are available.--get-chassis-statusβ get chassis status. returns high level status info on the chassis.--chassis-control=CONTROLβ control the chassis. this gives you power-up, power-down, and reset control. supported values:POWER-DOWN,POWER-UP,POWER-CYCLE,HARD-RESET,DIAGNOSTIC-INTERRUPT,SOFT-SHUTDOWN.--chassis-identify=IDENTIFYβ set chassis identification. this controls physical system identification, typically a LED. supported values:TURN-OFFto turn off identification,<interval>to turn on identification for "interval" seconds,FORCEto turn it on indefinitely.--get-system-restart-causeβ get system restart cause. like, why did you restart, bestie π--get-power-on-hours-counterβ get power on hours (POH) counter.
π§ HOSTRANGED OPTIONS π§
these options manipulate hostranged output. see HOSTRANGED SUPPORT below for extra info on hostranges π
-B,--buffer-outputβ buffer hostranged output. for each node, buffer standard output until that node has finished its IPMI operation. ngl, when you specify this, data may appear to output slower to you because the entire IPMI operation has to complete before any data can be output. see HOSTRANGED SUPPORT below for more.-C,--consolidate-outputβ consolidate hostranged output. the complete standard output from every node you specified gets consolidated so nodes with identical output aren't output twice. a header lists those nodes with the consolidated output. when you specify this, no output can be seen until the IPMI operations to all nodes have completed. if you break out of the program early, all currently consolidated output will be dumped. see HOSTRANGED SUPPORT below for more.-FNUM,--fanout=NUMβ specify multiple host fanout. a "sliding window" (or fanout) algorithm is used for parallel IPMI communication so slower nodes or timed out nodes won't impede parallel communication. the max number of threads available at the same time is limited by the fanout. default is64.-E,--eliminateβ eliminate hosts determined as undetected byipmidetect. this tries to remove the common issue of hostranged execution timing out because several nodes got removed from service in a large cluster. theipmidetectddaemon must be running on the node executing the command.--always-prefixβ always prefix output, even if only one host is specified or communicating in-band. this one's mainly useful for scripting purposes. the option will be ignored if you specify it with the-Coption.
β¨ HOSTRANGED SUPPORT β¨
Okay bestie, this is the part where you get to be lazy in the best way possible π
You can feed in a bunch of hosts two different ways: either an explicit comma separated list of hosts, or a range of hostnames shaped like this general form: prefix[n-m,l-k,...], where n < m and l < k, etc. π
Heads up fr fr β that second form is not the same thing as regular expression character classes (which also happen to use[]). Do not confuse them, iykyk. For example,foo[19]does not meanfoo1orfoo9. It literally represents a degenerate range:foo19. π
This range syntax is honestly just a convenience thing for clusters that follow the prefixNN naming convention, and specifying ranges should not be considered necessary β like, the list foo1,foo9 could just be specified as such, or by the range foo[1,9]. Both slay, pick your fave π«Ά
Some examples of range usage follow, and yes they're iconic:
foo[01-05] instead of foo01,foo02,foo03,foo04,foo05
foo[7,9-10] instead of foo7,foo9,foo10
foo[0-3] instead of foo0,foo1,foo2,foo3
Quick reminder to the reader (that's you π): some shells will interpret brackets ([ and ]) for pattern matching. Depending on your shell, it may be necessary to enclose ranged lists within quotes. So quote it or your shell will do its own little thing π
When multiple hosts are specified by the user, a thread will be executed for each host in parallel up to the configured fanout (which can be adjusted via the -F option). This lets you talk to large numbers of nodes far more quickly than if it were done in serial. Main character energy for your cluster π₯
By default, standard output from each node specified will be output with the hostname prepended to each line. This output is readable in many situations, but ngl it may be difficult to read in other situations β for example, output from multiple nodes may be mixed together π΅βπ« The -B and -C options can be used to change this default. Use them, bestie.
In-band IPMI Communication will be used when the host "localhost" is specified. This lets you add the localhost into the hostranged output. Cute, right? π
π©Ί GENERAL TROUBLESHOOTING π©Ί
Most often, IPMI problems are due to configuration problems. Like, it's almost always the config. It's giving "have you tried turning it off and on again" but for BMC settings π
IPMI over LAN problems involve a misconfiguration of the remote machine's BMC. Double check to make sure the following are configured properly in the remote machine's BMC: IP address, MAC address, subnet mask, username, user enablement, user privilege, password, LAN privilege, LAN enablement, and allowed authentication type(s). For IPMI 2.0 connections, double check to make sure the cipher suite privilege(s) and K_g key are configured properly. The ipmi-config(8) tool can be used to check and/or change these configuration settings. Go check them, bestie, I believe in you π«Ά
Inband IPMI problems are typically caused by improperly configured drivers or non-standard BMCs. Rude of them, honestly.
In addition to the troubleshooting tips below, please see WORKAROUNDS below to also if there are any vendor specific bugs that have been discovered and worked around. (Yes, that sentence is a little chaotic, but it's in the original and we keep every detail around here π)
Listed below are many of the common issues for error messages. For additional support, please e-mail the <freeipmi-users@gnu.org> mailing list. They're lovely, fr fr.
"username invalid"β The username entered (or a NULL username if none was entered) is not available on the remote machine. It may also be possible the remote BMC's username configuration is incorrect."password invalid"β The password entered (or a NULL password if none was entered) is not correct. It may also be possible the password for the user is not correctly configured on the remote BMC."password verification timeout"β Password verification has timed out. A"password invalid"error (described above) or a generic"session timeout"(described below) occurred. During this point in the protocol it cannot be differentiated which occurred. Spooky π"k_g invalid"β The K_g key entered (or a NULL K_g key if none was entered) is not correct. It may also be possible the K_g key is not correctly configured on the remote BMC."privilege level insufficient"β An IPMI command requires a higher user privilege than the one authenticated with. Please try to authenticate with a higher privilege. This may require authenticating to a different user which has a higher maximum privilege."privilege level cannot be obtained for this user"β The privilege level you are attempting to authenticate with is higher than the maximum allowed for this user. Please try again with a lower privilege. It may also be possible the maximum privilege level allowed for a user is not configured properly on the remote BMC."authentication type unavailable for attempted privilege level"β The authentication type you wish to authenticate with is not available for this privilege level. Please try again with an alternate authentication type or alternate privilege level. It may also be possible the available authentication types you can authenticate with are not correctly configured on the remote BMC."cipher suite id unavailable"β The cipher suite id you wish to authenticate with is not available on the remote BMC. Please try again with an alternate cipher suite id. It may also be possible the available cipher suite ids are not correctly configured on the remote BMC."ipmi 2.0 unavailable"β IPMI 2.0 was not discovered on the remote machine. Please try to use IPMI 1.5 instead. Downgrade era, lowkey π"connection timeout"β Initial IPMI communication failed. A number of potential errors are possible, including an invalid hostname specified, an IPMI IP address cannot be resolved, IPMI is not enabled on the remote server, the network connection is bad, etc. Please verify configuration and connectivity."session timeout"β The IPMI session has timed out. Please reconnect. If this error occurs often, you may wish to increase the retransmission timeout. Some remote BMCs are considerably slower than others. Be patient with them, they're doing their best πΈ"device not found"β The specified device could not be found. Please check configuration or inputs and try again."driver timeout"β Communication with the driver or device has timed out. Please try again."message timeout"β Communication with the driver or device has timed out. Please try again."BMC busy"β The BMC is currently busy. It may be processing information or have too many simultaneous sessions to manage. Please wait and try again. Give it a minute, it's overwhelmed π«Ά"could not find inband device"β An inband device could not be found. Please check configuration or specify specific device or driver on the command line."driver timeout"β The inband driver has timed out communicating to the local BMC or service processor. The BMC or service processor may be busy or (worst case) possibly non-functioning. Worst case is genuinely worst case here, no cap π"internal IPMI error"β An IPMI error has occurred that FreeIPMI does not know how to handle. Please e-mail<freeipmi-users@gnu.org>to report the issue. Report it bestie, they want to know π
π οΈ WORKAROUNDS π οΈ
Okay bestie, listen β literally every vendor out there ships their own little IPMI snowflake, and some of them implemented the protocol wrong. Like, not even a little wrong. Fully wrong. So here's the tea on the workarounds FreeIPMI has available for compliance drama it's already discovered. Where possible these are done transparently and you'll never notice β but some of them you have to explicitly ask for with the -W option. π
The hardware listed below may only indicate the hardware that a problem was discovered on. Newer versions of hardware may fix the problems indicated below. Similar machines from vendors may or may not exhibit the same problems. And plot twist β different vendors may license their firmware from the same IPMI firmware developer, so it may genuinely be worth trying the workarounds listed below even if your motherboard is not listed. iykyk.
If you believe your hardware has an additional compliance issue that needs a workaround to be implemented, please contact the FreeIPMI maintainers at <freeipmi-users@gnu.org> or <freeipmi-devel@gnu.org>. They will absolutely want to hear about it. π«Ά
assumeioβ this workaround flag assumes inband interfaces talk to system I/O instead of being memory-mapped. It works around systems that report invalid base addresses. If you're hitting this you may seedevice not supportedorcould not find inband deviceerrors. Issue observed on HP ProLiant DL145 G1.spinpollβ this workaround flag tells some inband drivers (most notably the KCS driver) to spin while polling instead of putting the process to sleep. This may significantly improve the wall clock running time of tools, because an operating system scheduler's granularity may be much larger than the time it takes to perform a single IPMI message transaction. The tradeoff? By spinning, your system may be performing less useful work by not contexting out the tool for a more useful task. Effort vs. vibes, honestly.authcapβ this workaround flag skips early checks for username capabilities, authentication capabilities, and K_g support, and just lets IPMI authentication succeed. It works around multiple issues where the remote system doesn't properly report username capabilities, authentication capabilities, or K_g status. Hitting this? You may seeusername invalid,authentication type unavailable for attempted privilege level, ork_g invaliderrors. Issue observed on Asus P5M2/P5MT-R/RS162-E4/RX4, Intel SR1520ML/X38ML, and Sun Fire 2200/4150/4450 with ELOM.nochecksumcheckβ this workaround flag tells FreeIPMI to not check the checksums returned from IPMI command responses. It works around systems that return invalid checksums due to implementation errors, where the packet is otherwise valid. β οΈ Users are cautioned on the use of this option, as it removes validation of packet integrity in a number of circumstances. However, it is unlikely to be an issue in most situations. Hitting this? You may seeconnection timeout,session timeout, orpassword verification timeouterrors. On IPMI 1.5 connections, thenoauthcodecheckworkaround may also needed too. Issue observed on Supermicro X9SCM-iiF, Supermicro X9DRi-F, and Supermicro X9DRFR.idzeroβ this workaround flag lets empty session IDs be accepted by the client. It works around IPMI sessions that report empty session IDs to the client. Hitting this? You may seesession timeouterrors. Issue observed on Tyan S2882 with M3289 BMC.unexpectedauthβ this workaround flag allows unexpected non-null authcodes to be checked as though they were expected. It works around an issue when packets contain non-null authentication data when they should be null due to disabled per-message authentication. Hitting this? You may seesession timeouterrors. Issue observed on Dell PowerEdge2850,SC1425. Confirmed fixed on newer firmware. πforcepermsgβ this workaround flag forces per-message authentication to be used no matter what is advertised by the remote system. It works around an issue when per-message authentication is advertised as disabled on the remote system, but it's actually required for the protocol. Hitting this? You may seesession timeouterrors. Issue observed on IBM eServer 325.endianseqβ this workaround flag flips the endian of the session sequence numbers so the session can continue properly. It works around IPMI 1.5 session sequence numbers that are the wrong endian. Hitting this? You may seesession timeouterrors. Issue observed on some Sun ILOM 1.0/2.0 (depends on service processor endian).noauthcodecheckβ this workaround flag tells FreeIPMI to not check the authentication codes returned from IPMI 1.5 command responses. It works around systems that return invalid authentication codes due to hashing or implementation errors. β οΈ Users are cautioned on the use of this option, as it removes an authentication check verifying the validity of a packet. However, in most organizations, this is unlikely to be a security issue. Hitting this? You may seeconnection timeout,session timeout, orpassword verification timeouterrors. Issue observed on Xyratex FB-H8-SRAY, Intel Windmill, Quanta Winterfell, and Wiwynn Windmill.intel20β this workaround flag handles several Intel IPMI 2.0 authentication issues. The issues covered include padding of usernames, and password truncation if the authentication algorithm is HMAC-MD5-128. Hitting this? You may seeusername invalid,password invalid, ork_g invaliderrors. Issue observed on Intel SE7520AF2 with Intel Server Management Module (Professional Edition).supermicro20β this workaround flag handles several Supermicro IPMI 2.0 authentication issues on motherboards w/ Peppercon IPMI firmware. The issues covered include handling invalid length authentication codes. Hitting this? You may seepassword invaliderrors. Issue observed on Supermicro H8QME with SIMSO daughter card. Confirmed fixed on newerver firmware.sun20β this workaround flag handles several Sun IPMI 2.0 authentication issues. The issues covered include invalid lengthed hash keys, improperly hashed keys, and invalid cipher suite records. Hitting this? You may seepassword invalidorbmc errorerrors. Issue observed on Sun Fire 4100/4200/4500 with ILOM. This workaround automatically includes theopensessprivworkaround.opensessprivβ this workaround flag slightly alters FreeIPMI's IPMI 2.0 connection protocol to work around an invalid hashing algorithm used by the remote system. The privilege level sent during the Open Session stage of an IPMI 2.0 connection is used for hashing keys instead of the privilege level sent during the RAKP1 connection stage. Hitting this? You may seepassword invalid,k_g invalid,bad rmcpplus status code, orprivilege level cannot be obtained for this usererrors. Issue observed on Sun Fire 4100/4200/4500 with ILOM, Inventec 5441/Dell Xanadu II, Supermicro X8DTH, Supermicro X8DTG, Intel S5500WBV/Penguin Relion 700, Intel S2600JF/Appro 512X, Quanta QSSC-S4R/Appro GB812X-CN, Dell C5220, and the OpenIPMI software BMC. This workaround is automatically triggered with thesun20workaround.integritycheckvalueβ this workaround flag works around an invalid integrity check value during an IPMI 2.0 session establishment when using Cipher Suite ID 0. The integrity check value should be 0 length, however the remote motherboard responds with a non-empty field. Hitting this? You may seek_g invaliderrors. Issue observed on Supermicro X8DTG, Supermicro X8DTU, and Intel S5500WBV/Penguin Relion 700, and Intel S2600JF/Appro 512X.- No IPMI 1.5 Support β some motherboards that support IPMI 2.0 have been found to not support IPMI 1.5. Hitting this? You may see
ipmi 2.0 unavailableorconnection timeouterrors. This issue can be worked around by using IPMI 2.0 instead of IPMI 1.5 by specifying--driver-type=LAN_2_0. Issue observed on a number of HP and Supermicro motherboards.
πΈ EXAMPLES πΈ
Real commands, no gatekeeping. Go off. β¨
# ipmi-chassis --get-chassis-status
Get the chassis status of the local machine. Your own machine! Main character energy.
# ipmi-chassis -h ahost -u myusername -p mypassword --get-chassis-status
Get the chassis status of a remote machine using IPMI over LAN.
# ipmi-chassis -h mycluster[0-127] -u myusername -p mypassword --get-chassis-status
Get the chassis status across a cluster using IPMI over LAN. A whole cluster, bestie. We love scaling. π
# ipmi-chassis -h ahost -u myusername -p mypassword --chassis-control=POWER-UP
Power on a remote machine using IPMI over LAN. Slay.
π DIAGNOSTICS π
Upon successful execution, exit status is 0. On error, exit status is 1.
If multiple hosts are specified for communication, the exit status is 0 if and only if all targets successfully execute. Otherwise the exit status is 1. Like, one flop and the whole thing flops. No partial credit. π
π KNOWN ISSUES π
On older operating systems, if you input your username, password, and other potentially security relevant information on the command line, this information may be discovered by other users when using tools like the ps(1) command or looking in the /proc file system. It is generally more secure to input password information with options like the -P or -K options. Configuring security relevant information in the FreeIPMI configuration file would also be an appropriate way to hide this information. Please don't be that girl with the password in your shell history. π
In order to prevent brute force attacks, some BMCs will temporarily "lock up" after a number of remote authentication errors. You may need to wait awhile in order for this temporary "lock up" to pass before you may authenticate again. It's not ghosting you, it's just on cooldown. π
π REPORTING BUGS π
Report bugs to <freeipmi-users@gnu.org> or <freeipmi-devel@gnu.org>. They genuinely want to know, fr fr.
Β©οΈ COPYRIGHT Β©οΈ
Copyright Β© 2007-2015 FreeIPMI Core Team
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
π¦ SEE ALSO π¦
freeipmi(7), bmc-device(8), ipmi-config(8), ipmipower(8)
http://www.gnu.org/software/freeipmi/
Okay that's the whole page, bestie β go configure some chassis. π
This lovely little number is from ipmi-chassis version 1.6.20, dated 2026-10-05, and it'll always be IPMI-CHASSIS(8) to me. π periodt.
π¦ where this page comes from
- arch rolling: freeipmi 1.6.20-1 Β· GPL-3.0-or-later
- centos-stream 10: freeipmi 1.6.20-1.el10 Β· GPL-3.0-or-later
- centos-stream 9: freeipmi 1.6.20-1.el9 Β· GPLv3+
- centos-stream 9: freeipmi 1.6.20-1.el9 Β· GPLv3+
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms