ubuntuusers.de

Manuell Installierte Pakete bzw. alternative zu apt-mark showmanual

Status: Ungelöst | Ubuntu-Version: Xubuntu 18.04 (Bionic Beaver)
Antworten |

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1092

Hallo alle miteinander,

ich möchte die manuell installierten Pakete von xubuntu 18.04.6 LTS nach xubuntu 20.04.4 LTS händig übernehmen. D. h. die Liste der Manuel installierten Pakete auf 18.04 würde Zeile für Zeile geprüft ob das Paket nun wirklich auch auf 20.04 installiert werden soll. Das bisher kompakteste Ergebnis mit ca. 594 Zeilen liefert bisher

apt-mark showmanual

Aber auch das liefert z.B. Einträge wie systemd.
Selbst auf dem frisch installierten 20.04 liefert apt-mark showmanual 60 Zeilen obwohl hier gerade ein Paket manuell installiert wurde.

Gibt es noch eine Möglichkeit die Liste der manuell installierten Pakete weiter zu präzisieren?
Ggf. wenn man über den Zeitpunkt wann ein Paket installiert wurde geht?
Aber wo befinden sich diese Zeitangaben?

Bisherige Recherche bzw. beste Ergebnisse:

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1214

Hallo sh4711,

etwas mehr Informationen erhalte ich durch

apt list | grep -i "\[install" | grep -v automatisch

Dabei kann ich sehen, aus welcher Quelle das Paket kommt und wenn ich die obige Ausgabe nach ",lokal" durchsuche finde ich alle die Pakete, die ich direkt aus einer lokalen .deb Datei installiert habe. Die Anzahl der aufgelisteten Pakete entspricht allerdings der aus "apt-mark showmanual".

Aber wo befinden sich diese Zeitangaben?

Es gibt im Verzeichnis "/var/log/apt" die Dateien "term.log" und "history.log" (mit ihren älteren gzip Versionen). Diese kann mit awk oder anderen Programmen auswerten, um die dich interessierende Daten (auch Zeitstempel) zu extrahieren und mit denen aus "apt-mark showmanual" oder obigem "apt list" in Relation zu setzen.

Was interessiert dich im Speziellen?

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1214

Ich habe mal das Thema weiter gesponnen und die Einträge unter "/var/log/apt" hinsichtlich des Zeitstempels mit dem folgenden 3-Zeiler ausgewertet:

apt list | grep -i "\[install" | grep -v automatisch | sed 's#/#\t/#' | sort -k1 >x1.txt

zgrep -a -E "^(Log started|Setting up|Entpacken von)" /var/log/apt/term.log* | tr -d '\r' | cut -d: -f2- |
 awk -F":" 'BEGIN{ts="";OFS="\t"}{
  if($1=="Log started"){ts=substr($2,2)":"$3":"$4}
  else{if(substr($0,1,1)=="S"){prod=substr($0,12)}else{prod=substr($0,15)};sub(" ",OFS,prod);print ts,prod}}' | 
 sort -t$'\t' -k2,2 -k1r,1 | awk -F$'\t' '{if($2!=old){print $0;old=$2}}' >x2.txt

join -t$'\t' -a 1 -o 2.1,1.1,2.3,1.2 -1 1 -2 2 x1.txt x2.txt >x3.txt
localc x3.txt

Leider reicht bei mir die Historie in den "term.log*" Dateien nicht weit genug zurück, um bei jedem Produkt einen Zeitstempel zu finden. Aber relativ viele Pakete waren bei mir beim join zu matchen. Beim Import der x3.txt in LibreOffice Calc sollte als "Trennoption" auch der "Tabulator" zugelassen sein und die erste Spalte nicht als "Standard" sondern als "Datum (JMT)" importiert werden.

PS: Ich habe einige Punkte gefunden, um die join-matching Ausbeute zu erhöhen...

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11229

Wohnort: München

Mal in eine andere Richtung gedacht - die manuell installierten Pakete, die du nicht nachinstalliert hast, kommen ja daher, weil der Installer Metapakete wie ubuntu-minimal, xubuntu-desktop usw. installiert hat - deren Abhängigkeiten kannst du ja einfach bestimmen und aus der Paketliste entfernen.

sh4711

(Themenstarter)

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1092

Vielen Dank für deine Rückmeldungen.

Zwischenstandsbericht:

shiro schrieb:

... Es gibt im Verzeichnis "/var/log/apt" die Dateien "term.log" und "history.log" (mit ihren älteren gzip Versionen). Diese kann mit awk oder anderen Programmen auswerten, um die dich interessierende Daten (auch Zeitstempel) zu extrahieren und mit denen aus "apt-mark showmanual" oder obigem "apt list" in Relation zu setzen. ...

Die history.log* fand ich sehr interessant. Mit folgendem Code durchforstet:

program gia; //getinstalledapps
uses crt, SysUtils;

var
  f : text;
  sText, sPath, searchString : string;
  iPos : integer;
  fInfo : TSearchRec;


begin
  sPath := '/home/myusername/programmierung/lazarus/getinstalledapps/history/';
  searchString := 'history*';
  if FindFirst (sPath + searchString, faAnyFile, fInfo) = 0 Then
  begin
    repeat
      //AssignFile(f,'/home/myusername/programmierung/lazarus/getinstalledapps/history/history.log.12');
      if (fInfo.Attr and faDirectory) <> faDirectory then
      begin
        //writeln(sPath + fInfo.Name);
        AssignFile(f,sPath + fInfo.Name);
        reset(f);
        while not eof(f) do
        begin
          readln(f,sText);
          iPos := pos('apt-get install', sText);
          if iPos <> 0 then
          begin
            delete(sText,1,iPos-1);
            writeln(sText);
          end;
        end;

        close(f);

      end;

    until FindNext(fInfo) <> 0;
    FindClose(fInfo);
  end;
end.                                      

und habe das selbe Phänomen wie gefunden:

Leider reicht bei mir die Historie in den "term.log*" Dateien nicht weit genug zurück,...

Zumindest ist das meine Vermutung, da z.B. eines der stets als ersten installierten Programme (synaptic) nicht gefunden wird.

Dein Skript, welches am Ende die dir Datei x3.txt auswirft ist schon ziemlich gut und ausgedünnt 👍 Danke!

Ich bin noch auf der Suche nach den history oder log Dateien von Synaptic. Bzw. wenn ich das richtig sehe dann stehen die auch in der Ausgabe von apt list ... teste ich mal ... es sieht auf den ersten Blick gut aus wenn man hier nach [installiert] filtern würde ... in progress ...

sh4711

(Themenstarter)

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1092

sh4711 schrieb:

... Ich bin noch auf der Suche nach den history oder log Dateien von Synaptic. Bzw. wenn ich das richtig sehe dann stehen die auch in der Ausgabe von apt list ... teste ich mal ... es sieht auf den ersten Blick gut aus wenn man hier nach [installiert] filtern würde ... in progress ...

@shiro OK, nehme ich wieder zurück. Deine Liste in der x3.txt beinhaltet auch die mit Synaptic installierten Pakete. Ich war nur irritiert, dass in meiner x3.txt der firebird sql server fehlte ... aber der wurde anscheinend nicht explizit durch mich mittels synaptic installiert sondern durch libreoffice-base ... was das ganze Projekt direkt sympatisch macht 😉

seahawk1986 schrieb:

... deren Abhängigkeiten kannst du ja einfach bestimmen und aus der Paketliste entfernen.

Danke für deine Rückmeldung ... werde ich mir anschauen ... wobei ich ehrlich gesagt noch nicht weiß wie. Wie kann ich denn die Abhängigkeiten bestimmen bzw. die Meta-Pakete herausfinden, welche installiert wurden?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11229

Wohnort: München

sh4711 schrieb:

seahawk1986 schrieb:

... deren Abhängigkeiten kannst du ja einfach bestimmen und aus der Paketliste entfernen.

Danke für deine Rückmeldung ... werde ich mir anschauen ... wobei ich ehrlich gesagt noch nicht weiß wie. Wie kann ich denn die Abhängigkeiten bestimmen bzw. die Meta-Pakete herausfinden, welche installiert wurden?

Es gibt eine Hand voll Metapakete, die auf einem Xubuntu-System relevant sein können - die werden entweder aus https://packages.ubuntu.com/source/bionic/ubuntu-meta oder aus https://packages.ubuntu.com/source/bionic/xubuntu-meta gebaut und es lässt sich leicht nachsehen, was davon installiert ist.

Mit Hilfe von apt-deps kann man sich rekursiv alle Abhängigkeiten (und deren Abhängigkeiten) für ein Pakets auflisten lassen - also z.B.:

sudo apt install python3-pip python3-apt
pip3 install --user -U apt_deps
~/.local/bin/apt-deps ubuntu-minimal 

Und dann kann man die Listen der von apt-mark showmanual gelieferten Pakete und die obige Ausgabe jeweils sortieren und z.B. mit uniq eindampfen - oder man nimmt gleich die Python-Bindings für apt und löst das über die Differenz aus dem Set der als manuell installiert markierten Pakete und einem Set aus den als Abhängigkeiten der Metapakete installierten Paketen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python3
import apt

# see https://gitlab.com/michaelgugino/apt-deps/-/blob/master/apt_deps/get_deps.py
# this is GNU General Public License v2.0+ code
class DepFinder(object):

    def __init__(self, pkg_list, recommends=False):
        self.dep_set = set()
        self.apt_cache = apt.cache.Cache()
        self.apt_cache.open()
        for item in pkg_list:
            p = self.apt_cache[item]
            self.deps_recurse(self.dep_set, p, recommends)
        self.apt_cache.close()

    def __call__(self, pkg_list, recommends=False):
        self.dep_set.clear()
        self.apt_cache.open()
        for item in pkg_list:
            p = self.apt_cache[item]
            self.deps_recurse(self.dep_set, p, recommends)
        self.apt_cache.close()

    def deps_recurse(self, s, p, recommends=False):
        deps = p.candidate.get_dependencies('Depends')
        pre_deps = p.candidate.get_dependencies('PreDepends')
        all_deps = deps + pre_deps
        if recommends:
            all_deps.extend(p.candidate.get_dependencies('Recommends'))
        for i in all_deps:
            dp = i.installed_target_versions
            if len(dp) > 0:
                if not dp[0].package.name in s:
                    s.add(dp[0].package.name)
                    self.deps_recurse(s, dp[0].package, recommends)


if __name__ == '__main__':
    c = apt.cache.Cache()

    manually_installed_packages = set(p for p in c if p.is_installed and not p.is_auto_installed)
    meta_pkgs = ('ubuntu-minimal', 'xubuntu-core', 'xubuntu-desktop')
    df = DepFinder(meta_pkgs, True)
    deps = df.dep_set
    for pkg in sorted(manually_installed_packages - deps):
        print(pkg)
Antworten |