A jak je to doopravdy??? viz. "Dle další diskuse problém pramení z toho, že pokud direktiva „User=…“ začíná číslem, parsuje se jako UID (tedy číselný identifikátor uživatele), a pokud nejde rozparsovat, celá direktiva se vyhodnotí jako neznámá a ignoruje se." - mně na to jeho definice sedí. Btw vzhledem k tomu, že ignoruje chybový stav tak souhlasím i s druhou "expresivnější" částí ....
Si to zkus:
Normálka:
[Service]
Type=oneshot
User=tomas
ExecStart=/usr/bin/id
Jul 03 09:47:37 raid systemd[1]: Starting t.service...
Jul 03 09:47:37 raid id[12961]: uid=1000(tomas) gid=1000(tomas) ...
Jul 03 09:47:37 raid systemd[1]: Started t.service.
Neexistujíci user:
[Service]
Type=oneshot
User=tomasxxx
ExecStart=/usr/bin/id
Jul 03 09:48:32 raid systemd[1]: Starting t.service...
Jul 03 09:48:32 raid systemd[13357]: t.service: Failed to determine user credentials: No such process
Jul 03 09:48:32 raid systemd[1]: t.service: Main process exited, code=exited, status=217/USER
Jul 03 09:48:32 raid systemd[1]: Failed to start t.service.
Jul 03 09:48:32 raid systemd[1]: t.service: Unit entered failed state.
Jul 03 09:48:32 raid systemd[1]: t.service: Failed with result 'exit-code'.
User s nulou na počátku:
[Service]
Type=oneshot
User=0tomasxxx
ExecStart=/usr/bin/id
Jul 03 09:49:10 raid systemd[1]: /etc/systemd/system/t.service:3: Invalid user/group name or numeric ID, ignoring: 0tomasxxx
Jul 03 09:49:12 raid systemd[1]: Starting t.service...
Jul 03 09:49:12 raid id[13681]: uid=0(root) gid=0(root) groups=0(root)
Jul 03 09:49:12 raid systemd[1]: Started t.service.
Položka User v unit souboru není povinná. Pokud není uvedena nebo má chybný formát a jde o systémový unit file, použije se uživatel root. (Kdyby to tak nebylo a User bylo povinné, budou si ti samí lidé stěžovat, že je to nesmysl, že je přece logické, že chci systémovou službu spouštět jako root.) To, že je nevalidní uživatelské jméno s nulou na začátku, je jen jeden z mnoha případů. Když jako uživatele zadáte třeba @"#!, bude to také vyhodnoceno jako syntakticky chybné uživatelské jméno a řádek bude ignorován. A systemd se chová tak, že pokud narazí na neznámou volbu nebo volbu s chybnou syntaxí, vypíše varování do logu a volbu ignoruje. To zajišťuje zpětnou kompatibilitu, protože jednotku s novou volbou nebo novým formátem volby spustíte i pod starším systemd. Jediným řešením by tedy bylo vybrat některé volby, a v jejich případě chybnou syntaxi nevyhodnocovat jako varování ale jako chybu. Jenže které volby byste do takového seznam u vybral a proč? Není lepší, když jsou pravidla pro všechny volby stejná?
Zkrátka se předpokládá, že správce systému má jednotky napsané správně. Když správce v jednotce uvede jiného uživatele, než chtěl, nebo jiný příkaz, taky se provede něco jiného, než správce zamýšlel.
Jaký má smysl u tak kritické komponenty poskytovat zpětnou kompatibilitu konfigurace na starší verzi systemd místo bezpečného chování - tedy nespuštění služby při nesprávné konfiguraci, o které systém jasně ví? Když např. v smb.conf uvedu blbost - konečná. V my.ini - to samé. Atd. IMO to tak je správně.
Systemd nevidí do hlavy správci, aby mohl rozpoznat každou nesprávnou konfiguraci. Nejde jen o zpětnou kompatibilitu se staršími verzemi systemd, jde i o kompatibilitu s jinými aplikacemi, které používají unit soubory. Při rozpoznání pravděpodobně nesprávné konfigurace vypíše varování do logu.
Tady se ukazuje rozdíl mezi správci, kteří po napsání jednotky otestují, zda funguje, a zkontrolují logy, a správci, které nějaké varování nezajímá a řeší až případ, kdy jim služba vůbec nenastartuje (a nejspíš je pak na to stejně musí upozornit někdo jiný).
To není proto, že jméno začíná nulou.
Ano, při kontrole logů může být pozdě, proto má správce jednotku napsat správně a spustit ji teprve po kontrole. Když do ExecStartPre zadá rm -r /*, tak mu to smaže celý systém. To je také chyba systemd?Když zadá Usr=nobody, spustí se jednotka pod rootem. Taky chyba systemd?
Sorry, ale samotný systemd s tebou nesouhlasí:
systemd[1]: /etc/systemd/system/t.service:3: Invalid user/group name or numeric ID, ignoring: 0tomasxxx
systemd[1]: /etc/systemd/system/t.service:5: Unknown lvalue 'Usr' in section 'Service'
Evidentně to dělá rozdíl mezi neznámou lvalue a mezi vadnou hodnotou známé lvalue.
Ano, oba řádky se to rozhodne ignorovat. To je asi to jediné, co mají společného. Pokud se do User dá jméno, které systemd považuje za validní, tak už to položku User neignoruje a začne se to podle ní řídit.
Což mimochodem taky znamená, že pokud v budoucnu se systemd změní a jméno "0tomasxxx" to bude považoval za validní uživatelské jméno, tak ta unita selže na neznámého uživatele. Unita, která do té doby "zpětně kompatibilně" fungovala.
Nechápu, jak tohle může někdo obhajovat.
Vždyť popisuješ přesně to, co jsem napsal. Neznámá volba nebo neznámý formát volby znamená varování do logu a přeskočení dané volby. Obojí je logické kvůli kompatibilitě s jinými programy. Teprve pokud je volba známá a má známý formát, systemd se ji pokusí zpracovat. V případě uživatelského jména tedy vyhledá uživatele s daným jménem – a pokud neexistuje, je to jednoznačně chyba, proto také systemd danou jednotku nespustí.
Pokud se systemd v budoucnosti změní, může se změnit různými způsoby. Číslice na začátku může být chápána jako prefix – podobně, jako např. spuštění příkazu může mít prefix +. A nebo by číslice na začátku mohla být považována za validní uživatelské jméno, teprve pak platilo to, co jsi napsal – že by jednotka při startu selhala, pokud by ten uživatel neexistoval.
Pokud nechápeš, jak to někdo může obhajovat, měl bys nejprve napsat, co ti vlastně vadí. To, že je volba s neznámou syntaxí ignorována? Nebo obecně princip kompatibility formátu, kdy je ignorována neznámá volba nebo volba s neznámou syntaxí? Nebo ti to vadí jen u volby User a ta by se měla chovat jinak, než ostatní volby?
Já chápu, že to chování je na první pohled divné. Ale to zacházení s neznámými volbami a neznámými formáty voleb je logické, a je logické, že se systemd ke všem volbám chová stejně.
Jak souvisí kompatibilita s jinými programy s neznámým formátem známé volby? Protože o ten tu přece celou dobu jde - místo aby hodil chybu a skončil, nastavení ignoruje a místo něj použije default. A klidně by to mohlo fungovat stejně pro všechny známé volby - neumím zpracovat obsah - končím. Jako je to u jiných projektů.
Pokud nechápeš, jak to někdo může obhajovat, měl bys nejprve napsat, co ti vlastně vadí.
Pokud napíšu lvalue= tak očekávám:
* Pokud lvalue nezná, tak mě na to upozorní. Ocenil bych možnost, kdyby to nebylo jen upozornění, ale kdyby to s neznámým atributem vůbec nejelo (prostě tato unita nebude provedena, dokud jsou v ní chyby nebo neznámé atributy).
* Pokud lvalue zná, tak očekávám, že se to pokusí zpracovat hodnotu a pokud toto zpracování selže, unita nebude provedena a systemd ohlásí chybu (tak jak se děje, pokud dám do User neexistujícího uživatele).
Prostě tak jak se chovají jiné programy. Pokud jinému programu dám lvalue=nesmysl, tak typicky ani nenastartuje.
Pokud jinému programu dám neznámou lvalue, tak většina z nich mě na to upozorní (systemd taky, v logu).
Co ovšem nechci je to, aby chování záleželo syntaxe hodnot. Tady, syntax error znamená, že se to bude celé ignorovat. Tohle je chyba o které se tady diskutuje.
Pokud se systemd v budoucnosti změní, může se změnit různými způsoby. Číslice na začátku může být chápána jako prefix – podobně, jako např. spuštění příkazu může mít prefix +. A nebo by číslice na začátku mohla být považována za validní uživatelské jméno, teprve pak platilo to, co jsi napsal – že by jednotka při startu selhala, pokud by ten uživatel neexistoval.
Aha, takže máme bezpečnostní problém (spouštění unit za roota, pokud správce nastavil attibut User, považuji za vážný bezpečnostní problém), ale budeme ho ignorovat, protože větší výhodu má budoucí změna syntaxe.
Takhle se systémový software opravdu nepíše.
Ale asi je to fakt o těch správcích, jak jsi psal. Já mám rád software, který svou práci bere vážně. Kdysi jsem psal o jednom příběhu s MySQL, který se taky rozhodl ignorovat to, že innodb (po změně konfigu) nenajelo, ignorovalo to create table ... engine=innodb a vytvořilo to typ mysiam, ignorovalo to begin tranaction a rollack (myisam nepodporuje). Však co na tom, že někdo přišel o data, sere pes...
Jestli tímto způsobem autoři software přemýšlí (a u Lennarta na to máme důkazů už dost), tak je celkem dobré ten software nepoužívat. U normálního softu mě to na nestandardní konfiguraci upozorní. Pokud hodnota neodpovídá typu konfigurační volby, tak to nenajede. Apod. Je soft, kde to jeho autoři berou vážně. A potom je ten zbytek.
Oba požadavky znamenají, že syntaxe jednotkového souboru je striktně vázána na jednu verzi systemd. Předpokládám, že jednotkový soubor má ambici být univerzálním formátem, který budou používat i jiné nástroje spravující služby. Dovedu si třeba představit, že v jednotkovém souboru bude i popis toho, na kolika a jakých strojích v clusteru se má jednotka spustit.
To, že program ignoruje neznámé hodnoty, je běžná situace – zejména v případech, kdy nepoužívá formát souboru určený jenom pro daný program.
To, že se ignorují neznámé formáty (ty píšeš „syntax error“) je nedílná součást té otevřené definice formátu, která umožňuje budoucí úpravy. Třeba v HTML prohlížeče ignorují jak neznámé tagy (což by odpovídalo těm neznámým volbám), tak neznámé atributy na známém tagu (což by odpovídalo tomu neznámému formátu). Jenom díky tomu se HTML může vůbec vyvíjet – kdyby to tak nebylo, HTML už dávno zemřelo ve verzi 1.0.
Mně se ten formát jednotkových souborů vůbec nelíbí, ale když už byl zvolen takhle, zachází se s ním logicky, konzistentně, a je možné, aby se programy používající ten formát rozvíjely. Ostatně i samotné systemd už několikrát využilo toho, že přidalo nový formát volby.
Pokud správce nastavil User na neplatnou hodnotu a pokusí se to spustit, je to jeho chyba, ne bezpečnostní chyba systemd. root má milion způsobů, jak omylem něco spustit jako root – a musí si to pohlídat, od toho je root.
Systemd na nestandardní konfiguraci upozorňuje. Ale změnit to na tvrdou chybu by znamenalo úplně rezignovat na kompatibilitu formátu jednotkových souborů. Může se ti to nelíbit, třeba bys dal přednost formátu souboru svázaného s konkrétní verzí systemd (což by byl krok i proti modulárnosti systemd). Ale autoři systemd se rozhodli pro kompatibilní formát, což má tenhle důsledek. To ale neznamená, že to autoři systemd neberou vážně.
Citace Filipa Jirsaka: "Pokud správce nastavil User na neplatnou hodnotu a pokusí se to spustit, je to jeho chyba, ne bezpečnostní chyba systemd. root má milion způsobů, jak omylem něco spustit jako root – a musí si to pohlídat, od toho je root."
Nevazeny pokrytce FJ, asi jste uz zapomnel na nasi diskusi ohledne vynucenych windowsovskych aktualizaci, ktere jste tak nadsene obhajoval. Proc v pripade windows povazujete spravce systemu za natolik neschopneho, aby si sam rozhodoval o bezpecnostnich otazkach a o zodpovednost se podle vas musi postarat MS, zatimco v pripade unixu je podle vas vse zodpovednosti spravce a nikoho jineho. Nechci vam rozporovat ani jedno z toho, jen se vas chci zeptat, jak se sam sobe dokazete vylhat z nekonzistentnosti vaseho uvazovani.
Citace: "Vynucené automatické aktualizace Windows se týkají domácích Windows, které žádného správce nemají."
No to je slusna demagogie. Tenhle argument by se "jakz takz" dal uznat, pokud by se to tykalo pouze verze Home. Bezny uzivatel si proste verzi Professional neporidi, ale jelikoz se to pouze Home netyka, vas argument je nepravdivy.
"Windows, které mají správce, používají pro distribuci aktualizací WSUS." ...
Ne, nepouzivaj, protoze to nefunguje. Windowsy ktery maj spravce pouzivaj vsemozny samorobo scripty ktery se je snazej dokopat k tomu aby se aktualizovaly. Wsus je naprosto khovnu, protoze neumi ani takovou primitivni vec jako zjistit, jesli danej stroj nejakou aktualizaci potrebuje ... a odpoved kretenu v M$ je, ze je to tak prece vporadku.
Zrovna ted vsechny widlostroje na desitkach (vcetne tech serverovych) pry "needujou" podle wsusu 110 aktualizaci. Ale kazdej jeden nareportuje, ze zadny dalsi nejsou.
"Azerbaijani (Latin, Azerbaijan)" LanguageInterfacePack - Windows 10 Version 1703 for x64-based Systems - (KB4016509) [az-Latn-AZ_LIP]
"Hausa (Latin, Nigeria)" LanguageInterfacePack - Windows 10 Version 1703 for x64-based Systems - (KB4016509) [ha-Latn-NG_LIP]
"Serbian (Cyrillic, Bosnia and Herzegovina)" LanguageInterfacePack - Windows 10 Version 1703 for x64-based Systems - (KB4016509) [sr-Cyrl-BA_LIP]
"Uzbek (Latin, Uzbekistan)" LanguageInterfacePack - Windows 10 Version 1703 for x64-based Systems - (KB4016509) [uz-Latn-UZ_LIP]
Mala ukazka toho co prej ty widle nutne potrebujou ...
Pane J:
To co popisujete je důsledkem toho, že jste ve WSUS konzoli zaškrtl že chcete dostávat přes WSUS Windows 10 language packy.
Když jste je potřeboval, nevím proč si zde stěžujete.
A za druhé - tajemné kouzlo WSUSu je v tom, že si můžete aktualizace o které nemáte zájem odmítnout. Klienti pak nebudou hlásit že je potřebují.
Přeji pěkný den.
2bez přezdívky : Ano radis se k tem kokotum z M$, maj na to svym foru thread s +- 10 000 posty ... pokud je nekde napsano NEED = vyzaduje/potrebuje ... tak to rozhodne NENI aktualizace, kterou MOZNA NEKDY NECO ...
A jiste, bude kazdej admin co tejden prochazet 10k aktualizaci a vyhazovat z nich tyhle kokotiny ... jenom proto aby mu to nereportovalo picoviny.
Zajimavy ze se tam nevypisuje hromada dalsich aktualizaci, ktery si do tech widli taky muzu rucne nainstalovat ...
Všiml jste si, že čím slušněji Vás oslovuji, tím hruběji píšete?
To vaše "MOZNA NEKDY NECO " řeší on-demand aktualizace které nejsou needed. Např pro novější desítky .net framework 3.5. Ale máte pravdu, že se to zatím používá méně než by mohlo.
Needed u jazykového balíčku dává docela smysl, když chcete mít na WSUS jazykové balíčky (já tedy ne). A chcete tam mít téměř všechny větové jazyky, tak WSUS jasně hlásí, že má v databází něco co klient nemá nainstalované. Můžete je tedy bud odmítnout, nainstalovat, nebo ignorovat.
Nenapadá mě které aktualizace pro Windows 10 nejsou na WSUS, ale pro ostatní systémy občas vycházejí hotfixy které jsou dostupné na update catalogu. Z catalogu je můžete imporotvat do wsusu. Například SMB patch pro XP/2003 naposledy.
Stačí definovat pravidla a je to kompatibilní napříč verzema:
1. Pravidla se prochází postupně. Platí poslední bezchybná verze klíče.
2. Pokud se změní formát, definuje se nový klíč.
3. Neznámý pravidlo se ignoruje
4. Chybějící klíčový parametr znamená chybu a služba se nespustí
Stará verze:
USER = LOJZA
funguje OK.
USER označeno za zastaralý, náhrada USERNAME:
USER=LOJZA
USERNAME=LOJZA
ze začátku funguje tak, že se použije USER, pak obojí, nakonec USERNAME. Přechodný období funguje, na konci se objeví warning na zastaralý USER.
Po odstranění USER z kódu je starý nastavení ignorováno, přechodová verze funguje dál, USER možno smazat. V nové verzi stačí
USERNAME = LOJZA
Je to tak velký problém, aby kvůli tomu museli dělat takový problémy? Přechodná verze bude fungovat v obojím. A kdo neaktualizuje balíky, neaktualizuje ani systemd...
A proč ne? Pokud mám jasně daný pravidla, jak se postupuje s úpravou souboru a jasně dokumentovaný volby v něm, tak jsou tyhle možnosti:
a) Uživatel neupdatuje, tak se mu to nemá jak rozbít.
b) Správce aplikace neupdatuje, tak se to rozbije (ale dá se to fixnout použitím staré volby, kterou by nový systemd ignorovalo a on v aplikaci ignoruje novou volbu)
c) Aplikace bude udržovaná a holt se použije to, co je aktuální
d) Použije se nějaká komponenta na parsování s dokumentovaným API, sdílená mezi aplikacema, co s tím souborem pracují.
Kdežto když nechám klíče "jak jsou, aby to bylo kompatibilní", jsou tyhle možnosti:
a) Uživatel neupdatuje, tak se mu to nemá jak rozbít.
b) Správce aplikace neupdatuje, tak se to rozbije na neznámým formátu parametru (tebou vychvalovaný prefix). Fixnout se to obecně nedá, protože stejný klíč s různou hodnotou.
c) Aplikace bude udržovaná a holt se použije to, co je aktuální
d) Použije se nějaká komponenta na parsování s dokumentovaným API, sdílená mezi aplikacema, co s tím souborem pracují.
Takže když změním název klíče, mám možnost pro nekompatibilní program dál používat starý. Když změním jenom formát dat v tom klíči, se starým systémem to obecně fungovat nemusí. To je celý rozdíl.
====
Systemd nevidí do hlavy správci, aby mohl rozpoznat každou nesprávnou konfiguraci.
====
?? Očividně o té chybě ví, když ji zaloguje jako warning.
====
Nejde jen o zpětnou kompatibilitu se staršími verzemi systemd, jde i o kompatibilitu s jinými aplikacemi, které používají unit soubory.
====
Máš nějaký konkrétní příklad? Tomu argumentu nerozumím. Proč by měl systemd akceptovat formát svého vlastní direktivy, kterému nerozumí (a jen to přejít logem), jenom proto, že jej může používat jiná aplikace? Ta si přece může použít jiný název direktivy.
=====
Tady se ukazuje rozdíl mezi správci, kteří po napsání jednotky otestují, zda funguje, a zkontrolují logy, a správci, které nějaké varování nezajímá a řeší až případ, kdy jim služba vůbec nenastartuje (a nejspíš je pak na to stejně musí upozornit někdo jiný).
=====
Pokud se mi služba i jen pro otestování spustí pod rootem, může to nadělat pěknou paseku třeba na filesystému - vyrobí mi klíčové soubory pod rootem a budu pak pěkně dlouho dohledávat a měnit práva souborů, aby mi zase běžela pod neprivilegovaným userem. Zkus si takto spustit třeba mysql, když bude při spuštění vyrábět ibdata + adresáře/soubory systémových db pod rootem a máš o práci postaráno. To mohu tak testovat leda v kontejneru.
Očividně o té chybě ví, když ji zaloguje jako warning.
Systemd očividně rozlišuje mezi chybou a varováním.
Máš nějaký konkrétní příklad? Tomu argumentu nerozumím. Proč by měl systemd akceptovat formát svého vlastní direktivy, kterému nerozumí (a jen to přejít logem), jenom proto, že jej může používat jiná aplikace? Ta si přece může použít jiný název direktivy.
To není direktiva systemd, je to direktiva jednotky (unit file). Jiná aplikace je třeba budoucí verze systemd. Váš přístup by znamenal, že s každou změnou formátu by se musel změnit i název volby. Já osobně považuju formát jednotkových souborů za to nejhorší na celém systemd, ale prostě zvolili takovýhle formát a to, že různé formáty hodnot voleb budou označovat různé chování, tak to respektuju.
Pokud se mi služba i jen pro otestování spustí pod rootem, může to nadělat pěknou paseku třeba na filesystému - vyrobí mi klíčové soubory pod rootem a budu pak pěkně dlouho dohledávat a měnit práva souborů, aby mi zase běžela pod neprivilegovaným userem.
Taky si má nejdřív správce zkontrolovat, co spouští. Když takhle spustí přímo MySQL nebo nějaký skript, může napáchat úplně stejné škody.
V případě jednotky ale správce tu službu nemusí hned spouštět, může nejprve na jednotku spustit systemd-analyze verify, která mu ta varování vypíše bez nutnosti jednotku spouštět.
======
Jiná aplikace je třeba budoucí verze systemd.
....
Váš přístup by znamenal, že s každou změnou formátu by se musel změnit i název volby.
======
Samozřejmě. Protože když změním formát a ponechám název volby, stejně jsem rozbil onu zpětnou kompatibilitu nové unity na starý systemd. Starý systemd nový formát nepozná a volbu ignoruje - tudíž jsem nic nenastavil a nastartovaná služba (s warningem v logu) nefunguje správně. Zatímco když přidám novou volbu, mohu mít v unitě obě dvě a udržet zpětnou kompatibilitu pro starší verze, minimálně po nějakou dobu. A unita může být tak kompatibilní pro více verzí systemd. Dokonce bych v ní mohl uvádět rozsah verzí.
A nebo zpětnou kompatibilitu konfigurace nevyžaduji a mohu formát změnit s tím, že starší verze zahlásí chybu a skončí. Systemd má přece možnost přetížit konfiguraci konkrétní unity v /etc/systemd, používá se třeba pro zkrácení nesmyslného nekonečného timeoutu při změně síťovky v networking.service. Tak konkrétní volbu přetížím správnou hodnotou pro mé staré systemd a služba normálně najede.
Také se musím nějak popasovat s tím, že zvolili takovýto divný postup, nic jiného mi nezbývá. Ale mohu to kritizovat, a ne obhajovat, že je to tak správně a logické.
To, že se přidal formát, neznamená nutně, že nová jednotka se starým systemd nefunguje správně. Když se k volbě Description přidá možnost prefixem @lang= zadat jazyk popisku jednotky, start služby to nijak neovlivní.
Vy to pořád popisujete, jako kdyby to byl formát jen pro systemd – jenže tak evidentně nebyl zamýšlen.
Mně se ten formát nelíbí, radši bych formát, kde se příznaky nebudou zapínat tím, že se použije nový formát zápisu hodnoty, radši bych formát, kde bude možné udělat podmínku na zpracovávající aplikaci nebo její verzi. Ale autoři systemd zvolili tenhle formát, a v rámci toho formátu je to chování logické a konzistentní.
Já osobně považuju formát jednotkových souborů za to nejhorší na celém systemd, ale prostě zvolili takovýhle formát a to, že různé formáty hodnot voleb budou označovat různé chování, tak to respektuju.
Já osobně považuji tento formát za velmi vhodný.
Prostě ini-like, [sekce] klíč=hodnota
Stejný formát napříč vším, logind.conf vypadá stejně jako .network nebo .mount. Tohle mi vyhovuje.
Co mi nevyhovuje je, že někdo obhajuje, že klíč=hodnota vlastně není klíč=hodnota, ale že to ještě navíc záleží na syntaxi té hodnoty a vlastně to může znamenat něco úplně jiného.
Váš přístup by znamenal, že s každou změnou formátu by se musel změnit i název volby.
Což by bylo správné řešení. Pokud by si někdo vymyslel seznam uživatelů, klidně může vzniknout UserList=. Nevidím na tom nic špatného, právě naopak, protože seznam uživatelů je evidentně něco jiného, než jeden uživatel.
Co mi nevyhovuje je, že někdo obhajuje, že klíč=hodnota vlastně není klíč=hodnota, ale že to ještě navíc záleží na syntaxi té hodnoty a vlastně to může znamenat něco úplně jiného.
To je přesně to, co mi na tom formátu nejvíc vadí. Jenže pokud by to mělo být jinak, s tím postupem [sekce] klíč=hodnota by to nejspíš nešlo. Stačí se podívat jenom na ExecStart, který se může opakovat a může obsahovat prefix @, + a -. Rozepsat do klíč=hodnota by šlo, ale jak by to vypadalo…
Stačí se podívat jenom na ExecStart, který se může opakovat a může obsahovat prefix @, + a -. Rozepsat do klíč=hodnota by šlo, ale jak by to vypadalo…
Vypadalo by to úplně normálně a hlavně by to nerozbilo zpětnou kompatibilitu. Prostě ExecStart je plná cesta k binárce a její parametry. Pokud si někdo později vymyslel @+-, stačilo zavést třeba ExecMod, do kterého by šlo zadat mod spouštění (třeba jako bitmapu, nebo pomocí symbolů @+-). Vůbec to není potřeba cpát do hodnoty parametru ExecStart a porušit tím předchozí kompatibilitu (@/bin/bash evidentně není validní cesta k souboru).
Jenže ExecStart se může opakovat a ty prefix se týkají každého příkazu zvlášť. Navíc ty modifikátory nemusely být zavedeny najednou, takže pak by pro ně nestačil jeden ExecMod, ale podle pravidla „při každé změně novou volbu“ by těch voleb muselo být několik. Takže ze současného
ExecStart=@+-/opt/backup/run-backup.sh backup-home ExecStart=@+-/opt/backup/run-backup.sh backup-var ExecStart=/opt/backup/upload-backup.sh
by se stalo
ExecStartArgv0=backup-home ExecStartFullPrivileges=yes ExecStartIgnoreError=yes ExecStart=/opt/backup/run-backup.sh ExecStartArgv0=backup-var ExecStartFullPrivileges=yes ExecStartIgnoreError=yes ExecStart=/opt/backup/run-backup.sh ExecStart=/opt/backup/upload-backup.sh
Ten první zápis je hrozný, ten druhý je ještě horší.
Ten první zápis je hrozný, ten druhý je ještě horší.
Tak to je otázka vkusu. Asi jako všechny flamy v historii o tom, která syntaxe je lepší, která horší, která je úsporná a která je readonly.
Mě osobně druhý zápis nijak nevadí. Pokud by se to naformátovalo pěkně, tj mezi každou skupinu ExecStart dala třeba mezera, tak osobně nemám problém s čitelností.
Ale to je věc vkusu.
2Dustin: "...To mohu tak testovat leda v kontejneru." ... nemuzes, se sytemd je lepsi ani netestovat. Protoze i kdyz dojdes cirou nahodou k tomu, ze to asi funguje, tak to jeste vubec neznamena, ze to bude fungovat i za 10 minut. Jeden takovej pokusnej stroj sem nakou dobu mel ... a pokazdy kdyz sem po mesici chtel neco vyzkouset, bylo tuhy sshcko. Zjevne se systemd rozhod, ze ho zrovna neni treba ... a uz nikdy nenabehlo ...jo, byl to prakticky cistej centos ...
systemd ignoruje volby, které nezná. Nehodnotím teď, zda je to dobře či špatně. Naposledy jsem narazil na MTUBytes, kde to na starší verzi sice prošlo, ale MTU se nenastavilo. V logu byla chyba, že to MTUBytes nezná. Ok, dejme tomu, to je jiné téma.
Jenže položka User je pro systemd známá.
Problém vidím v tom, že zatímco za neznámého usera to zahlásí chybu (a poměrně hlasitě), tak za neparsrovatelného usera to volbu v klidu ignoruje a pustí to za roota.
Takže pokud admin zadá to tvé User=@"#! tak je asi zřejmé, že chtěl položku User nastavit (a tedy pustit unitu pod konkrétním uživatelem), jen tam uvedl nevalidní hodnotu. V takovém případě by měla unita selhat (prostě je to neexistující uživatel) a nikoliv tento řádek ignorovat.
Systemd neignoruje jen volby, které nezná, ale také volby, které mají neznámou syntaxi. Což umožňuje syntaxi volby rozšířit – třeba se později někdo rozhodne, že bude možné uvést seznam uživatelů oddělených čárkou, a použije se první, který v systému existuje. Jiná věc je, jestli je vhodný tenhle způsob konfigurace, kdy se různé nové volby zavádějí třeba tak, že se před hodnotu zadá nějaký prefix (plus, zavináč apod.).
Z hlediska syntaxe unit souboru zkrátka není rozdíl mezi tím, zda uvedu UserXXX=nobody nebo User=@"#!, v obou případech je to pro aktuální systemd neznámá volba (a v obou případech to něco může znamenat pro jinou aplikaci nebo pro budoucí verze systemd).
Proč pořád řešíte špatně zadanou volbu? Tady jde o případ, kdy správce zadal tu volbu zcela správně a s platnou hodnotou. Je tam prostě User=0day, což je normální platný uživatel.
Jak systemd reaguje na chyby je opravdu podružné. Tady je problém v tom, jak reaguje na platné username.
Proč pořád řešíte špatně zadanou volbu? Tady jde o případ, kdy správce zadal tu volbu zcela správně a s platnou hodnotou. Je tam prostě User=0day, což je normální platný uživatel.
Neznámá volba a neznámý formát hodnoty volby jsou pro systemd to samé. Obojí umožňuje kompatibilitu jednotek s jiným softwarem (např. budoucími verzemi systemd).
0day pro systemd není platný uživatel.
systemd neví nic, ten jenom plní instrukce. Ty musí být jednoznačný, jinak je nemůže admin jednoznačně sdělit.
1) Pokud je uvedena známá volba USER, má se jí řídit. Bez pardonu. Neprojde regexp a nenajde ho v db, chyba, nespouštět. Admin projevil přání specifikovat uživatele, asi pro to měl důvod. Pod roota nesmí, neví, pod koho. Není jiná možnost, než error.
2) Pokud chce někdo v budoucnu používat v USER seznam uživatelů, má USER označit za zastaralou a používat třeba USER_LIST. Když se vyspecifikuje, že pozděj uvedený platí a neznámý si ignoruje, tak je to na dva řádky - USER a USER_LIST, rozumí stará, nová a přechodná verze. Není důvod kvůli tomu prznit stávající verzi. Tam je warning s upozorněním na novou verzi plně na místě.
3) Parser nemá hádat význam volby, ten má být vždycky daný explicitně. Ideálně rozlišení USER a UID.
4) Teprv až nepadne v chybě a nezná hodnotu, může šaškovat s defaultem.
5) Nabízí se otázka, jestli nemít USER/UID jako mandatory volbu, bez které systemd jenom ukazuje prostředníček jak Lennart póvlu kolem něj.
Nabízí se otázka, jestli nemít USER/UID jako mandatory volbu, bez které systemd jenom ukazuje prostředníček jak Lennart póvlu kolem něj.
O tom žádná, defaultní root je nesmysl. Jen to ukazuje, že je ten projekt ušitý horkou jehlou a před rozšířením měl projít pár lety připomínkování. Stejně jako svého času to samé pro pulseaudio.
Jenže dnes už by to byl zásah do většiny stávajících unit filů, chápu, že nechtějí ničit dopřednou kompatibilitu.
Co je validní sytaxe pro username nemá co rozhodovat systemd. Mám systém s čistě číselným username. Problémy to dělá jen v případě aplikací, které se snaží být chytrejší, než správce. Od adduser jsem žádné varování nedostal, protože je beru z LDAP-u. A vše funguje.
Proč mi najednou musí začít kecat nějaké systemd do toho, že je něco špatně?
Mimochodem Jirsáku, takového b*ba jako jsi Ty jsem tu dlouho neviděl. Proč prostě nedokážeš pochopit, že to je chybné chování a připustit to? Proč musíš za každou cenu obhajovat každou blbost, kterou Lenart řekne? To nemáš soudnost, nebo vlastní úsudek? Třetina důvodu proč nesnáším systemd jsou lidi, jako jsi Ty. Kdyby byla v systemd chyba, že když pomocí vypínacího tlačítka morseovkou vyťukáš slovo „explode“, tak by počítač vybouchl a Lenart by řekl, že nikdo přece nemačká takhle tlačítka, že to není chyba, tak to taky budeš hájit, dokud Ti to někdo nepříjde namačkat na počítači? Chováš se jako malé děcko, měl bys konečně dospět.
Ne, to nezajistuje kompatibilitu, to je naprosta picovina ...
Jedna vec je, kdyz mam v konfiguraku neznamej parametr, pak je OK ho ignorovat stejne jako koment.
Uplne jina vec je, kdyz tam mam znamej parametr, pak ho ignorovat v zadnym pripade nic nesmi a pokud je v nem neco co neprojde, tak to proste nema nastartovat a ma to skoncit s chybou. VZDY
Kazda normalni vec si pak tohle kontroluje jeste pred tim nez se pokusi neco spoustet.
Pokud chci menit syntax user, tak si musim zmenit nazev parametru ... trebas na user006 ... uz jen proto, ze jakejkoli externi tool nemuze tusit, jestli toho usera ma vyplnovat v syntaxi verze 01, 50 ... nebo 132. Alternativne musi byt povinou soucasti konfiguraku trebas verze. A pak mi holt starsi verze aplikace zcela spravne pri startu vynada, ze mam konfigurak pro novejsi verzi a odmitne nastartovat.
Ale jo, du napsat tvurcum postfixu ... ze by trebas pri spatny syntaxi mohli proste tu vec odignorovat a nastartovat to jako openrelay ...
"...Pokud není uvedena nebo má chybný formát a jde o systémový unit file, použije se uživatel root..."
A to je presne ta ober-pitomost! Protoze spravna implementace by mela byt:
Pokud neni uvedena, pouzije se defaultni hodnota a pokud ma chybny format, sluzba se nespusti s chybovym hlasenim!