[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: