Changes

Jump to navigation Jump to search

Module:Hatnote list

5,275 bytes added, 14:59, 24 November 2017
m
1 revision imported
It Finally happened. I have this bad habit of updating all of my virtual Ubuntu servers at once which ---------------------------------------------------------------------------------- Module:Hatnote list ---- ---- This module produces and formats lists for use in turn puts a lot of load on the hostshatnotes. Tonight was In particular, ---- it implements the first time that I lost the main solid state cache drive on the host which in turn took the main servers that host this site along with my othersfor-see list, i. Luckily I have shared storage (which is backed up) on my NAS4Free boxe. The big dilemma was manually migrating the config files on the other host to activate the Virtual Serverslists of "For X, see Y" statements, ---- as used in {{about}}, {{redirect}}, and their variants. With a bit of googling I ran across a very helpful command which I tweaked a bit Also introduced ---- are andList & orList helpers for my younger version of Proxmox. The commands below will bring your virtual machines back to lifeformatting lists with those conjunctions.----------------------------------------------------------------------------------
*First you will need to be absolutely sure that the dead node is indeed dead. Otherwise you are going to complicate life in a terrible way.local mArguments --initialize lazily*Second, you will want to set the expected votes in quorum to 1 to make the live host realize that its the only one that matters anymore. pvecm e 1*Next you will issue a series of commands being mindful that you will need '''edit to coincide with your host names and the VM IDlocal mHatnote = require('sModule:Hatnote''' of the virtual machines you which to manually migrate.)*For Example mv etc/pve/nodes/local libraryUtil = require('libraryUtil''yourdeadhostname'''/qemu-server/'''deadvmID.conf''' /etc/pve/nodes/'''yourlivehostname'''/qemu-server/)*If you are watching your live node at this point, you will see your virtual machines automagically appear on the live hostlocal checkType = libraryUtil.checkType*You can now fire your VM's up while you prepare to rebuild your failed host.local p = {}
Original info found [http://pve---------------------------------------------------------------------------------- List stringification helper functions---- These functions are used for stringifying lists, usually page lists inside-- the "Y" portion of "For X, see Y" for-see items.proxmox.com/pipermail/pve-------------------------------------------------------------------------------user/2013-May/005616.html HERE]
--default options table used across the list stringification functionslocal stringifyListDefaultOptions = { conjunction = "and", separator = ",", altSeparator = ";", space = " ", formatted = false} -- Stringifies a list generically; probably shouldn't be used directlyfunction stringifyList(list, options) -- Type-checks, defaults, and a shortcut checkType("stringifyList", 1, list, "table") if #list == 0 then return nil end checkType("stringifyList", 2, options, "table", true) options = options or {} for k, v in pairs(stringifyListDefaultOptions) do if options[k] == nil then options[k] = v end end local s = options.space -- Format the list if requested if options.formatted then list = mHatnote.formatPages(unpack(list)) end -- Set the separator; if any item contains it, use the alternate separator local separator = options.separator --searches display text only function searchDisp(t, f) return string.find(string.sub(t, (string.find(t, '|') or 0) + 1), f) end for k, v in pairs(list) do if searchDisp(v, separator) then separator = options.altSeparator break end end -- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§" local conjunction = s .. options.conjunction .. s if #list == 2 and searchDisp(list[1], "§") or #list > 2 then conjunction = separator .. conjunction end -- Return the formatted string return mw.text.listToText(list, separator .. s, conjunction)end --DRY functionfunction conjList (conj, list, fmt) return stringifyList(list, {conjunction = conj, formatted = fmt})end -- Stringifies lists with "and" or "or"function p.andList (...) return conjList("and", ...) endfunction p.orList (...) return conjList("or", ...) end ---------------------------------------------------------------------------------- For see---- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the-- {{about}} and {{redirect}} templates and their variants.-------------------------------------------------------------------------------- --default options table used across the forSee family of functionslocal forSeeDefaultOptions = { andKeyword = 'and', title = mw.title.getCurrentTitle().text, otherText = 'other uses', forSeeForm = 'For %s, see %s.'} --Collapses duplicate punctuationfunction punctuationCollapse (text) local replacements = { ["%.%.$"] = ".", ["%?%.$"] = "?", ["%!%.$"] = "!", ["%.%]%]%.$"] = ".]]", ["%?%]%]%.$"] = "?]]", ["%!%]%]%.$"] = "!]]" } for k, v in pairs(replacements) do text = string.gsub(text, k, v) end return textend -- Structures arguments into a table for stringification, & optionsfunction p.forSeeArgsToTable (args, from, options) -- Type-checks and defaults checkType("forSeeArgsToTable", 1, args, 'table') checkType("forSeeArgsToTable", 2, from, 'number', true) from = from or 1 checkType("forSeeArgsToTable", 3, options, 'table', true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- maxArg's gotten manually because getArgs() and table.maxn aren't friends local maxArg = 0 for k, v in pairs(args) do if type(k) == 'number' and k > maxArg then maxArg = k end end -- Structure the data out from the parameter list: -- * forTable is the wrapper table, with forRow rows -- * Rows are tables of a "use" string & a "pages" table of pagename strings -- * Blanks are left empty for defaulting elsewhere, but can terminate list local forTable = {} local i = from local terminated = false -- Loop to generate rows repeat -- New empty row local forRow = {} -- On blank use, assume list's ended & break at end of this loop forRow.use = args[i] if not args[i] then terminated = true end -- New empty list of pages forRow.pages = {} -- Insert first pages item if present table.insert(forRow.pages, args[Categoryi + 1]) -- If the param after next is "and", do inner loop to collect params -- until the "and"'s stop. Blanks are ignored:Proxmox"1|and||and|3" → {1, 3} while args[i + 2] == options.andKeyword do if args[i + 3] then table.insert(forRow.pages, args[i + 3]) end -- Increment to next "and" i = i + 2 end -- Increment to next use i = i + 2 -- Append the row table.insert(forTable, forRow) until terminated or i > maxArg return forTableend -- Stringifies a table as formatted by forSeeArgsToTablefunction p.forSeeTableToString (forSeeTable, options) -- Type-checks and defaults checkType("forSeeTableToString", 1, forSeeTable, "table") checkType("forSeeTableToString", 2, options, "table", true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k]== nil then options[k]= v end end -- Stringify each for-see item into a list local strList = {} for k, v in pairs(forSeeTable) do local useStr = v.use or options.otherText local pagesStr = p.andList(v.pages, true) or mHatnote._formatLink(mHatnote.disambiguate(options.title)) local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr) forSeeStr = punctuationCollapse(forSeeStr) table.insert(strList, forSeeStr) end -- Return the concatenated list return table.concat(strList, ' ')end -- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps-- but not blank/whitespace values. Ignores named args and args < "from".function p._forSee (args, from, options) local forSeeTable = p.forSeeArgsToTable(args, from, options) return p.forSeeTableToString(forSeeTable, options)end -- As _forSee, but uses the frame.function p.forSee (frame, from, options) mArguments = require('Module:Arguments') return p._forSee(mArguments.getArgs(frame), from, options)end return p

Navigation menu