Des alternatives personnelles: PATCH
Comme je me sentais d'humeur perliere ce matin, j'ai fait un patch contre
update-alternatives qui permet d'implementer les alternatives
personnelles.
Bon, ne revez pas, on peu pas tout faire. Juste --display --config et
--auto (bref, pas possible d'ajouter une nouvelle alternative au systeme,
ou d'en retirer une).
Deuxieme deception : les utilisateurs vont devoir mettre dans leur .bashrc
PATH=$HOME/etc/alternatives:$PATH
MANPATH=$HOME/etc/alternatives:$PATH
(ie, tout est mélangé ensemble, pas moyen de trier les binaires des
manpages). Point positif, si vous voulez un autre répertoire
d'alternatives personelles, c'est possible.
Troisieme deception : pour l'instant, l'executable update-alternatives est
dans /usr/sbin et donc, les utilisateurs pouront pas le lancer. Donc, non
content d'appliquer mon patch, il faudra copier (ou faire un lien) dans
/usr/bin ou /usr/local/bin
Bon, assez décus. Les bonnes nouvelles maintenant. Ben, en fait, y'en a
une seule : ca marche chez moi (tm).
Quand on configure une alternative en tant qu'utilisateur,
/etc/alternatives n'est pas modifié (normal, on a pas les droits en
écritures), mais c'est $HOME/etc/alternatives qui l'est. Et donc, comme on
a changé le PATH et le MANPATH dans le .bashrc, ca marche.
Passer en --auto en tant qu'utilisateur retire le réglage personel, et
repasse en systeme wide.
Quand on fait --config en tant qu'utilisateur, et qu'on a déjà reglé
cette alternative, en plus du '+' pour le meilleur choix et du '*' pour le
system wide, il y a un '@' pour le choix personnel.
Voila, voila. Je fais un rapport de bug (wishlist) sur dpkg des à present
pour filer mon patch. Mais comme je suis pas sur qu'il soit intégré tres
rapidement, je voulais vous le donner ici, pour que vous serviez de
cobayes...
Bye, Mt.
--- DEBIAN/dpkg/scripts/update-alternatives.pl Sat Nov 25 09:58:52 2000
+++ update-alternatives.pl Sat Nov 25 14:13:34 2000
@@ -45,6 +45,7 @@
Options: --verbose|--quiet --test --help --version
--altdir <directory> --admindir <directory>
+ --localaltdir <directory>
END
|| &quit("failed to write usage: $!");
}
@@ -103,6 +104,9 @@
} elsif (m/^--altdir$/) {
@ARGV || &badusage("--altdir needs a <directory> argument");
$altdir= shift(@ARGV);
+ } elsif (m/^--localaltdir$/) {
+ @ARGV || &badusage("--localaltdir needs a <directory> argument");
+ $localaltdir= shift(@ARGV);
} elsif (m/^--admindir$/) {
@ARGV || &badusage("--admindir needs a <directory> argument");
$admindir= shift(@ARGV);
@@ -115,6 +119,19 @@
$aslavelinkcount{$alink} && &badusage("link $link is both primary and slave");
$mode || &badusage("need --display, --config, --install, --remove or --auto");
+if (getpwnam(getpwuid($<))) { # check if user is root
+ $mode eq "auto" || $mode eq "config" || $mode eq "display"
+ || &badusage("If you're not root, you're only allowed to run --config, --auto or --display");
+ $localaltdir=$ENV{"HOME"}.$altdir unless $localaltdir;
+ $localaltdir || &quit("Unable to determine localaltdir. Giving up");
+ &pr("Any changes will apply to $localaltdir.")
+ if $verbosemode > 0;
+ -e $localaltdir || &quit("$localaltdir does not exist. Please create it.");
+ $rootaltdir=$altdir;$altdir=$localaltdir;
+} else {
+ $rootaltdir='';
+ $localaltdir && &badusage("You can't specify a localaltdir option when running as root");
+}
$mode eq 'install' || !%slavelink || &badusage("--slave only allowed with --install");
if (open(AF,"$admindir/$name")) {
@@ -161,8 +178,18 @@
if (!$dataread) {
&pr("No alternatives for $name.");
} else {
- &pr("$name - status is $manual.");
+ if (getpwnam(getpwuid($<))) {
if (defined($linkname= readlink("$altdir/$name"))) {
+ &pr("$name - user alternative link currently points to $linkname");
+ } elsif ($! == &ENOENT) {
+ &pr("$name - using system-wide settings");
+ }
+ }
+ $tmp=getpwnam(getpwuid($<))? "\nSystem wide":"$name - ";
+ $tmp2=getpwnam(getpwuid($<))? " BUT DISCARDED in flavor of user settings":"";
+ &pr("$tmp status is $manual$tmp2.");
+ if ((getpwnam(getpwuid($<))&& defined($linkname = readlink("$rootaltdir/$name")))
+ || defined($linkname= readlink("$altdir/$name"))) {
&pr(" link currently points to $linkname");
} elsif ($! == &ENOENT) {
&pr(" link currently absent");
@@ -225,6 +252,16 @@
# all independent
if ($mode eq 'auto') {
+ if (getpwnam(getpwuid($<)) != 0) { # check if user is root
+ &pr("Setting up selection of $name to site setting.")
+ if $verbosemode > 0;
+ &quit("$name already set to site setting. Nothing done")
+ unless -e "$altdir/$name";
+ &pr("You are not root: I won't change the system wide settings, but only yours.\n");
+ unlink("$altdir/$name") || $! == &ENOENT ||
+ &quit("unable to remove $altdir/$name");
+ exit 0;
+ }
&pr("Setting up automatic selection of $name.")
if $verbosemode > 0;
unlink("$altdir/$name.dpkg-tmp") || $! == &ENOENT ||
@@ -366,6 +403,7 @@
# state=unexpected => manual=manual
# manual=auto => state!=expected-inprogress && state!=unexpected
+exit 0 if (getpwnam(getpwuid($<))); # non-root don't save the DB
open(AF,">$admindir/$name.dpkg-new") ||
&quit("unable to open $admindir/$name.dpkg-new for write: $!");
&paf($manual);
@@ -484,13 +522,30 @@
printf(STDOUT "\nThere are %s programs which provide \`$name'.\n\n", $#versions+1);
printf(STDOUT " Selection Command\n");
printf(STDOUT "-----------------------------------------------\n");
+ $userfixed=0;
for ($i=0; $i<=$#versions; $i++) {
- printf(STDOUT "%s%s %s %s\n",
- (readlink("$altdir/$name") eq $versions[$i]) ? '*' : ' ',
+ $userfixed = $userfixed ||
+ (-e "$altdir/$name" && (readlink("$altdir/$name") eq $versions[$i]));
+ printf(STDOUT "%s%s%s %s %s\n",
+ (getpwnam(getpwuid($<)) ? #non root
+ (-e "$altdir/$name" && (readlink("$altdir/$name") eq $versions[$i]) ? '@' : ' ')
+ : # root => no user specified
+ ' '),
+ (getpwnam(getpwuid($<)) ? #non root
+ ((readlink("$rootaltdir/$name") eq $versions[$i]) ? '*' : ' ')
+ : # root
+ (readlink("$altdir/$name") eq $versions[$i]) ? '*' : ' '),
($best eq $versions[$i]) ? '+' : ' ',
$i+1, $versions[$i]);
}
- printf(STDOUT "\nEnter to keep the default[*], or type selection number: ");
+ &pr("\n");
+
+ &pr("(You are not root: I won't change the system wide settings, but only yours)\n")
+ if (getpwnam(getpwuid($<)));
+
+ printf(STDOUT "Enter to keep the %sdefault[%s], or type selection number: ",
+ (getpwnam(getpwuid($<)) ? ($userfixed ? "user-specified " : "system-wide ") : ""),
+ (getpwnam(getpwuid($<)) ? ($userfixed ? "@" : "*") : "*"));
}
sub config_alternatives {
@@ -559,3 +614,8 @@
exit(0);
# vim: nowrap ts=8 sw=4
+
+
+
+
+
Reply to: