Wolna amerykanka w PLD?

Pawel Wilk siefca w entropy.echelon.pl
Wto, 8 Kwi 2003, 16:02:57 CEST


Tomku, wyluzuj, było na wstępie, że nieśmiałe marzenia. Wracałem
wcięty do domu jakiś czas temu i mi to przyszło do głowy. :-) Wiem, że
głupi był pomysł, ale gdyby nie on to bym tego nie przypomniał teraz
co sobie przypomniałem...

Apropos pierwotnych założeń -- chciałbym spytać co sądzić o
rozwiązaniu takim, że za lokalizację katalogu na konfigurację
odpowiada jakaś mała biblioteka, która działa na podobnej zasadzie
co gettext i podmienia nazwy ścieżkowe (albo po prostu je uzyskuje)
w zależności od ustawień dla konkretnych aplikacji.

Mamy pliki:

	/etc/switches	(globalny)
	~/.switches	(lokalny)

składnia pliku:

	nazwa_aplikacji.nazwa_zmiennej = wartość

z możliwością substytucji zmiennych:

	aplikacja.zmienna = @inna.aplikacja.inna_zmienna
albo
	aplikacja.zmienna = @po_prostu_zmienna


i z możliwością substytucji zmiennych środowiskowych:

	aplikacja.zmienna = $zmienna_środowiskowa

i z substytucją ~ na katalog domowy (w pewnych okolicznościach)

i z komentarzami oznaczonymi przez #

to w skrócie tyle o budowie plików konfiguracyjnych samej biblioteki.

Do pliku /etc/switches wpadają łańcuchy dodawane przy instalacji
pakietu. Ten plik jest przeszukiwany jeśli klucz nie zostanie
znaleziony w pliku .switches użytkownika, chyba że aplikacja
zdecyduje inaczej.

* przykład dla programu mplayer

w /etc/switches mamy:

	user_cf_dir = ~/etc/

	mplayer.global.config_dir = /etc/mplayer
	mplayer.local.config_dir = @user_cf_dir/mplayer

w ~/.switches może być to samo
ale może być np. taki myk:

	user_cf_dir = ~/jestem_inny_tu_mam_konfigi

i tyle! bo wartości zdefiniowane przez usera
zawsze przykrywają te globalne, więc user nie musi
już dopisywać sobie linijki:

	mplayer.local.config_dir = @user_cf_dir/mplayer

chyba że bardzo tego chce, np.:

	mplayer.local.config_dir = ~/mamplajer

co robi nasz program, gdy chce znaleźć nazwę
dla katalogu konfiguracyjnego użytkownika?

wzywa funkcje:

sw_setdomain("mplayer");
pathname = sw_getvar_path("local.config_dir",
			  "/home/users/siefca");
		
sw_getvar_path dla każdego klucza próbuje go uzyskać najpierw
z ~/.switches, a jeśli tam go nie ma to z /etc/switches
więc tutaj pathname będzie wskazywać na bufor ścieżkowy
zawierający: /home/users/siefca/etc/mplayer

Przykładową funkcję celowo nazywam sw_getvar_path() bo
ma być z założenia tym co sw_getvar() plus zamiana ~ na
nazwę katalogu domowego użytkownika. Katalog domowy musi
być wprost podany bo to już brocha aplikacji jak go uzyska.

Przemek Borys dwa lata temu zaproponował też takie
rozwiązanie:

sw_setdomain("mplayer");
pathname = sw_pathget("~/.mplayer/");

przy czym sw_pathget zachowywałoby się jak makro _() z
gettext, czyli w jakimś tam pliku musiłyby być pary
w stylu:

~/.mplayer	~/etc/mplayer

Pomysł na /etc/switches jest rozszerzeniem tego
pomysłu. W tym przypadku mamy znów problem
co robić, gdy pliku jeszcze nie ma. Możnaby by default
brać wtedy tą drugą nazwę.


ps.: nazwy kluczy i zmiennych wewnątrz plików konfiguracyjnych
     dla biblioteczki to kwestia umowna ofkors

rfc..

-- 
Pawel Wilk ( siefca @ entropy echelon pl )           ) pld-devel )

                 żyj skromnie. szanuj swojego admina.



Więcej informacji o liście dyskusyjnej pld-devel-pl