[Risolto]Problemi con autocompletamento di "apt-get install"

Sezione dedicata alle problematiche sull'uso dei tool di installazione e gestione di pacchetti, in una distribuzione Debian-based.

[Risolto]Problemi con autocompletamento di "apt-get install"

Messaggioda s3v » 30/05/2017, 19:34

Ho un problema abbastanza fastidioso quando utilizzo l'autocompletamento con l'installazione dei pacchetto con "apt-get install".
Ad esempio, se voglio installare il pacchetto "pacchettoA":
Codice: Seleziona tutto
# apt-get install pacch[TAB][TAB]

e dovrebbe comparirmi la lista dei pacchetti disponibili per l'installazione che iniziano con "pacch"; questo però non avviene.
Sono costretto ogni volta a:
Codice: Seleziona tutto
# apt-get install pacch
Lettura elenco dei pacchetti... Fatto
Generazione albero delle dipendenze       
Lettura informazioni sullo stato... Fatto
E: Impossibile trovare il pacchetto pacch

e poi, al secondo tentativo, l'autocompletamento funziona.
È come se si dovesse popolare una sorta di cache, boh.

L'autocompletamento funziona regolarmente con "apt-get purge" e "apt-get remove" (quelli che ho provato).

Uso Debian testing (Stretch).
Codice: Seleziona tutto
#  apt-get -v
apt 1.4.4 (amd64)
Moduli supportati:
*Ver: Standard .deb
*Pkg:  Debian dpkg interface (Priority 30)
 Pkg:  Debian APT solver interface (Priority -1000)
 Pkg:  Debian APT planner interface (Priority -1000)
 S.L: 'deb' Debian binary tree
 S.L: 'deb-src' Debian source tree
 Idx: Debian Source Index
 Idx: Debian Package Index
 Idx: Debian Translation Index
 Idx: Debian dpkg status file
 Idx: Debian deb file
 Idx: Debian dsc file
 Idx: Debian control file
 Idx: EDSP scenario file
 Idx: EIPP scenario file
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: Problemi con autocompletamento di "apt-get install"

Messaggioda s3v » 30/05/2017, 20:05

Qualche prova.
Dopo aver "popolato la cache" (diciamo così), tutto funziona regolarmente anche dopo un logout/login sia su tty sia su emulatore di terminale (Konsole nel mio caso).
Il problema torna a presentarsi al riavvio del sistema.
Ho provato anche a rimuovere tutti i cronjob all'avvio e a riavviare ma senza risultato.
Lo stesso comportamento lo ho con:
Codice: Seleziona tutto
# apt install ...


Altre informazioni:
Codice: Seleziona tutto
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion

$ cat /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.

# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default.
# If this is an xterm set the title to user@host:dir
#case "$TERM" in
#xterm*|rxvt*)
#    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
#    ;;
#*)
#    ;;
#esac

# enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: Problemi con autocompletamento di "apt-get install"

Messaggioda s3v » 30/05/2017, 21:28

Il problema penso fosse dovuto ad un cronjob di root:
Codice: Seleziona tutto
@reboot /usr/bin/apt-get clean

Infatti il problema nasce proprio dopo un "apt-get clean". Non capisco però cosa c'entra quel comando con l'autocompletamento a meno che non venga cancellata qualche cache non documentata nella manpage.
Nei sorgenti di bash-completion c'è:
Codice: Seleziona tutto
...
           *)
                COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" \
                    2> /dev/null ) )
                return 0
                ;;

https://sources.debian.net/src/bash-com ... s/apt-get/
ma mi sfugge la relazione tra "apt-get clean" e "apt-cache --no-generate pkgnames" :(
Comunque ho cambiato il cronjob così:
Codice: Seleziona tutto
@reboot /usr/bin/apt-get clean && apt-get check > /dev/null 2>&1

e sembra andare. Praticamente cancella la cache (a questo punto credo non solo dei pacchetti scaricati) e poi la ricrea.
Vedo come va per qualche tempo.
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: Problemi con autocompletamento di "apt-get install"

Messaggioda Aki » 30/05/2017, 22:59

Se non erro, il comando apt-get clean (vedi la funzione pkgCacheFile::RemoveCaches) cancella la cache di apt (posizione nel file system della cache in Dir::cache::pkgcache) gestita da apt ed usata dal comando apt-cache (vedi la funzione ShowPkgNames() e la funzione BuildCaches()), come hai rilevato, per interrogare l'elenco dei pacchetti nell'autocompletamento .
Aki
Global Moderator
Global Moderator
 
Messaggi: 7753
Iscritto il: 27/12/2007, 16:59

Re: Problemi con autocompletamento di "apt-get install"

Messaggioda s3v » 31/05/2017, 9:29

Grazie delle informazioni ;)

Ho visto la funzione "pkgCacheFile::RemoveCaches()" di apt su Jessie e Stretch:
(Jessie) http://sources.debian.net/src/apt/1.0.9 ... l=182#L182
(Stretch) http://sources.debian.net/src/apt/1.4.4 ... l=281#L281

Ma non sembrano esserci differenze sostanziali.
Bisognerebbe cercare la parte riguardante "apt-get clean" per la versione su jessie.

Domanda: su Jessie funziona l'autocompletamento di "apt-get install" dopo un "apt-get clean"?
Io ricordo che questa situazione in passato non capitava.

EDIT:
La pagina di manuale non parla di pulizia della cache:
clean
Clears out the local repository of retrieved package files. It removes everything but the lock file from /var/cache/apt/archives/ and /var/cache/apt/archives/partial/.
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: Problemi con autocompletamento di "apt-get install"

Messaggioda Aki » 02/06/2017, 7:12

s3v ha scritto:su Jessie funziona l'autocompletamento di "apt-get install" dopo un "apt-get clean"?
Io ricordo che questa situazione in passato non capitava.
EDIT:
La pagina di manuale non parla di pulizia della cache:
clean
Clears out the local repository of retrieved package files. It removes everything but the lock file from /var/cache/apt/archives/ and /var/cache/apt/archives/partial/.

Ho provato su Debian Jessie 8.8 ed il comportamento dell'autocompletamento corrisponde a quello che hai descritto nella discussione; confermo che il comando apt-get clean cancella la cache di apt :
Codice: Seleziona tutto
# lsb_release -d
Description:    Debian GNU/Linux 8.8 (jessie)
# apt-config dump | grep "Dir::Cache"
Dir::Cache "var/cache/apt/";
Dir::Cache::archives "archives/";
Dir::Cache::srcpkgcache "srcpkgcache.bin";
Dir::Cache::pkgcache "pkgcache.bin";
# ls /var/cache/apt/pkgcache.bin -la
-rw-r--r-- 1 root root 43717430 giu  2 08:01 /var/cache/apt/pkgcache.bin
# apt-get clean
# ls /var/cache/apt/pkgcache.bin -la
ls: impossibile accedere a /var/cache/apt/pkgcache.bin: File o directory non esistente
# apt-get check
# ls /var/cache/apt/pkgcache.bin -la
-rw-r--r-- 1 root root 43717430 giu  2 08:06 /var/cache/apt/pkgcache.bin

Al riavvio probabilmente il sistema avvia un job che aggiorna la cache di apt se allo shutdown la cache è svuotata (probabilmente è un job di systemd). In ogni caso, fermo restando le osservazioni che ho sopra riportato, sulla mia installazione di Debian Stretch all'avvio del sistema operativo l'autocompletamento del comando apt-get install funziona regolarmente.
Aki
Global Moderator
Global Moderator
 
Messaggi: 7753
Iscritto il: 27/12/2007, 16:59

Re: Problemi con autocompletamento di "apt-get install"

Messaggioda s3v » 05/06/2017, 10:58

Grazie di aver confermato lo stesso comportamento su Jessie, evidentemente ricordavo male io :)

Ho cambiato il file "/usr/share/bash-completion/completions/apt-get" così:
...
*)
if [ -f /var/cache/apt/pkgcache.bin ]; then
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" \
2> /dev/null ) )
else
COMPREPLY=( $( apt-cache pkgnames "$cur" 2> /dev/null ) )
fi

return 0
;;
...

(in grassetto le aggiunte). Ora va bene ma con un leggerissimo tempo per creare la cache al momento dell'autocompletamento. Meglio che niente ;)

Sicuramente nei prossimi giorni invio una segnalazione di bug per la manpage di apt in quanto la cache viene svuotata anche per i pacchetti non installati:
Codice: Seleziona tutto
# apt-get clean
# apt show gnome[TAB][TAB]
(nessun output)
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54


Torna a Apt-get and friends

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti