• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] hplip spinnt

Sauerland

Ultimate Guru
Netzwerk. Schon immer. Suse 15.1 und älter ohne Probleme.
Ich installiere meinen immer nach den Anleitungen, hp-setup sagt das auch.

Zuerst mit USB-Kabel und dann sagt hp-setup jetzt Kabel ab und noch einmal aufrufen.

Selbst der Scanner funktioniert dann im Netzwerk.
 
OP
K

klaus-dieter

Hacker
Ich habe es bisher immer mit HP setup gemacht. 4 suse Rechner greifen seit Jahren auf den Drucker zu. Nie mit USB immer Netzwerk. Hp setup erkennt und findet den Drucker auch im Netz.
 

misiu

Moderator
Teammitglied
Meiner ist über wlan / Router angeschlossen. USB habe ich nie gebraucht. Da ich die IP kenne, installiere ich über Yast
/ LAN->JetDirekt. Die hplip-Pakete müssen natürlich installiert sein.
Wie die einzelnen Schritte gehen, müsste ich schauen, bin auch immer noch bei 15.1

Hp-Setup Methode hat bei mir nur Probleme gemacht, wahrscheinlich wegen falscher Phyton-Version.
Auch die Udev/Firewall-Regeln haben die Erkennung verhindert.

Yast richtet das meiste und verwendet hpsetup nur für die Drucker-Erkennung.

Es kann auch sein, dass der "normale"User in die hpsetup
Guppe aufgenommen werden muss...

MfG
misiu
 

Sauerland

Ultimate Guru
Ich kann dir ja mal meine python Paketliste zukommen lassen und du kannst vergleichen,ob dir noch etwas fehlt.
 
OP
K

klaus-dieter

Hacker
Problem gelöst, ich bekam ja immer den Fehler

Code:
Run "hp-plugin" to installa plugin libraries if you are not automatically prompted

Traceback (most recent call last):
  File "/usr/share/hplip/ui4/setupdialog.py", line 1307, in NextButton_clicked
    self.showAddPrinterPage()
  File "/usr/share/hplip/ui4/setupdialog.py", line 731, in showAddPrinterPage
    self.readwriteFaxInformation()
  File "/usr/share/hplip/ui4/setupdialog.py", line 1102, in readwriteFaxInformation
    d = fax.getFaxDevice(self.fax_uri, disable_dbus=True)
  File "/usr/share/hplip/fax/fax.py", line 534, in getFaxDevice
    return MarvellFaxDevice(device_uri, printer_name, callback, fax_type, disable_dbus)
  File "/usr/share/hplip/fax/marvellfax.py", line 109, in __init__
    self.service.SendEvent(device_uri, printer_name, EVENT_FAX_FAILED_MISSING_PLUGIN, os.getenv('USER'), job_id, "Plugin is not installed")
AttributeError: 'NoneType' object has no attribute 'SendEvent'

Done.

Fax wollte ich nicht, ich weiß auch nicht warum er bei mir immer meckert dass das Plugin nicht da ist, es ist da.

Im marvellfax.py habe ich den Code angepasst

Code:
            if pluginObj.getStatus() != pluginhandler.PLUGIN_INSTALLED:
                self.libfax_marvell = cdll.LoadLibrary(lib_name)
                #log.error("Loading %s failed. Try after installing plugin libraries\n" %lib_name);
                #log.info("Run \"hp-plugin\" to installa plugin libraries if you are not automatically prompted\n")
                #job_id =0;
                #self.service.SendEvent(device_uri, printer_name, EVENT_FAX_FAILED_MISSING_PLUGIN, os.getenv('USER'), job_id, "Plugin is not installed")
                #sys.exit(1)
            else:
                self.libfax_marvell = cdll.LoadLibrary(lib_name)

Sprich im if Teil habe ich alles auskommentiert und den else Teil in den if Teil kopiert (hätte dass if natürlich auch löschen können). Naja jetzt geht es.
 
OP
K

klaus-dieter

Hacker
Habe noch etwas weiter gedebuggt, in /usr/share/hplip/plugin.spec sind Pfade (i386-gnu-linux und x86_64-gnu-linux) angegeben die es unter openSuse 15.1 und 15.2 nicht gibt. Mit hplip 3.18.6 waren diese Pfade dort nicht angegeben. Sprich hp-setup wird ab irgendeiner Version zwischen 3.18.6 und 3.20.9 weder auf 15.1 noch 15.2 funktionieren. Wahrscheinlich reicht es aus einfach alle Pfade im spec File zu berichtigen.
 
OP
K

klaus-dieter

Hacker
Wie sicher bist du dir mit einer Aussage? Klar kann mich beim debuggen vertan haben, bin mir aber relativ sicher.

Das das Python Skript ausgeführt wird steht wohl ausser Frage, da meine Änderung dort den erhofften Erfolg hatte.

Code:
pluginObj.getStatus()

gibt ein -2 zurück, bei einer 1 würde es durchlaufen.

Der Call von getStatus ist in pluginhandler.py zu finden

Code:
    def getStatus(self):
        self.__readPluginStatus()
        log.debug("Plugin status = %s"%self.__plugin_state)
        return self.__plugin_state

Es kommt also auf __plugin_state an, dieser wird in pluginhander.py hier gesetzt

Code:
    def __readPluginStatus(self):
        plugin_state_conf = ConfigBase( PLUGIN_STATE_FILE)
        self.__plugin_state = plugin_state_conf.get('plugin', 'installed', PLUGIN_NOT_INSTALLED)
        if self.__plugin_state == PLUGIN_NOT_INSTALLED:
            self.__installed_version = ''
        else:
            self.__installed_version = plugin_state_conf.get('plugin','version', '')
            hplip_version = sys_conf.get('hplip', 'version', '0.0.0')
            if self.__installed_version != hplip_version:
                self.__plugin_state = PLUGIN_VERSION_MISMATCH
            else:
                home = sys_conf.get('dirs', 'home')
                copies = self.__getPluginFilesList( home )

                for src, trg, link in copies:
                    if link != "":
                        if not utils.check_library(link):
                            self.__plugin_state = PLUGIN_FILES_CORRUPTED

hier wiederum ist das untereste else von Wichtigkeit. Hier wiederum das Array copies, auch diese ist in pluginhander.py

Code:
    def __getPluginFilesList(self, src_dir):
        if not os.path.exists(src_dir+"/plugin.spec"):
            log.warn("%s/plugin.spec file doesn't exists."%src_dir)
            return []

        cwd = os.getcwd()
        os.chdir(src_dir)
        
        plugin_spec = ConfigBase("plugin.spec")
        products = plugin_spec.keys("products")

        BITNESS = utils.getBitness()
        ENDIAN = utils.getEndian()
        PPDDIR = sys_conf.get('dirs', 'ppd')
        DRVDIR = sys_conf.get('dirs', 'drv')
        HOMEDIR = sys_conf.get('dirs', 'home')
        DOCDIR = sys_conf.get('dirs', 'doc')
        CUPSBACKENDDIR = sys_conf.get('dirs', 'cupsbackend')
        CUPSFILTERDIR = sys_conf.get('dirs', 'cupsfilter')
        RULESDIR = '/etc/udev/rules.d'
        BIN = sys_conf.get('dirs', 'bin')

        # Copying plugin.spec file to home dir.
        if src_dir != HOMEDIR:
            shutil.copyfile(src_dir+"/plugin.spec", HOMEDIR+"/plugin.spec")
            os.chmod(HOMEDIR+"/plugin.spec",0o644)

        processor = utils.getProcessor()
        if processor == 'power_machintosh':
            ARCH = 'ppc'
        elif (processor == 'armv6l' or processor == 'armv7l' or processor == 'aarch64' or processor == 'aarch32'):
            ARCH = 'arm%d' % BITNESS
        else:
            ARCH = 'x86_%d' % BITNESS

        if BITNESS == 64:
            SANELIBDIR = '/usr/lib64/sane'
            LIBDIR = '/usr/lib64'
        else:
            SANELIBDIR = '/usr/lib/sane'
            LIBDIR = '/usr/lib'

        copies = []

        for PRODUCT in products:
            MODEL = PRODUCT.replace('hp-', '').replace('hp_', '')
            for s in plugin_spec.get("products", PRODUCT).split(','):

                if not plugin_spec.has_section(s):
                    log.error("Missing section [%s]" % s)
                    os.chdir(cwd)
                    return []

                src = plugin_spec.get(s, 'src', '')
                trg = plugin_spec.get(s, 'trg', '')
                link = plugin_spec.get(s, 'link', '')

                if not src:
                    log.error("Missing 'src=' value in section [%s]" % s)
                    os.chdir(cwd)
                    return []

                if not trg:
                    log.error("Missing 'trg=' value in section [%s]" % s)
                    os.chdir(cwd)
                    return []

                src = os.path.basename(utils.cat(src))
                trg = utils.cat(trg)

                if link:
                    link = utils.cat(link)

                copies.append((src, trg, link))

        copies = utils.uniqueList(copies)
        copies.sort()
        os.chdir(cwd)
        return copies

In der ersten Zeile siehst du schon dass plugin.spec gelesen wird, im Debugger sieht man auch dass es ganau aus /usr/share/hplip gelesen wird. Dann muss man sich am Ende der Methode link anschauen, dort stehen die falschen Verzeichnisse drin.

Jetzt wieder zurück zu

Code:
    def __readPluginStatus(self):
        plugin_state_conf = ConfigBase( PLUGIN_STATE_FILE)
        self.__plugin_state = plugin_state_conf.get('plugin', 'installed', PLUGIN_NOT_INSTALLED)
        if self.__plugin_state == PLUGIN_NOT_INSTALLED:
            self.__installed_version = ''
        else:
            self.__installed_version = plugin_state_conf.get('plugin','version', '')
            hplip_version = sys_conf.get('hplip', 'version', '0.0.0')
            if self.__installed_version != hplip_version:
                self.__plugin_state = PLUGIN_VERSION_MISMATCH
            else:
                home = sys_conf.get('dirs', 'home')
                copies = self.__getPluginFilesList( home )

                for src, trg, link in copies:
                    if link != "":
                        if not utils.check_library(link):
                            self.__plugin_state = PLUGIN_FILES_CORRUPTED

in der zweitletzen Zeile wird check_library aufgerufen

Code:
def check_library( so_file_path):
    ret_val = False
    if not os.path.exists(so_file_path):
        log.debug("Either %s file is not present or symbolic link is missing" %(so_file_path))
    else:
        # capturing real file path
        if os.path.islink(so_file_path):
            real_file = os.path.realpath(so_file_path)
        else:
            real_file = so_file_path

        if not os.path.exists(real_file):
            log.debug("%s library file is missing." % (real_file))
        elif (os.stat(so_file_path).st_mode & 72) != 72:
            log.debug("%s library file doesn't have user/group execute permission." % (so_file_path))
        else:
            log.debug("%s library file present." % (so_file_path))
            ret_val = True

    log.debug("%s library status: %d" % (so_file_path, ret_val))
    return ret_val

Hier wird also geprüft ob die Files wirklich existieren.

Ich würde also bei meiner Meinung (vorerst) bleiben. Wo siehst du meinen Fehler im obigen Durchlauf oder warum denkst dass das spec file nicht gelesen wird?
 

Sauerland

Ultimate Guru
Habe noch etwas weiter gedebuggt, in /usr/share/hplip/plugin.spec sind Pfade (i386-gnu-linux und x86_64-gnu-linux) angegeben die es unter openSuse 15.1 und 15.2 nicht gibt. Mit hplip 3.18.6 waren diese Pfade dort nicht angegeben. Sprich hp-setup wird ab irgendeiner Version zwischen 3.18.6 und 3.20.9 weder auf 15.1 noch 15.2 funktionieren. Wahrscheinlich reicht es aus einfach alle Pfade im spec File zu berichtigen.
Das sind aber immer unterschiedliche Pfade für dieselben Dateien, ich nehme mal an für unterschiedliche Distributionen.
Denn bei mir sind die Dateien vorhanden.
 
OP
K

klaus-dieter

Hacker
Das kann natürlich so gedacht sein dass diese für diverse Distributionen sind. Aber dann scheint das noch nicht zu funktionieren. Diese Einträge waren so mit 3.18.6 auch nicht da, es scheint sich also um ein neues Feature zu handeln.

Es gibt bei 3.20.9 ja zum Beispiel

Code:
[hp2000S1_plugin_6]
src=scan/sane/libsane-hp2000S1-$ARCH.so.1.0.25
trg=/usr/lib/sane/libsane-hp2000S1-$ARCH.so.1.0.25
link=/usr/lib/x86_64-linux-gnu/sane/libsane-hp2000S1.so.1

Existiert bei dir bei openSuse der Pfad der unter Link angegeben ist? Bei mir nicht. Ich habe mal versucht im spec file einen Pfad zu ändern um zu sehen ob ich auf meinem alten Rechner das Problem nachstellen kann. Leider merkt das System die Veränderung und ich muss das HP plugin neu installieren und damit kommt ein neues spec file, d.h. manuelle Änderungen sind nicht möglich. Ich kann es leider momentan nicht testen da ich keinen weiteren Rechner habe. Hast du hplip 3.20.9 installiert? Wenn ja kannst du mal als root hp-setup durchführen.

Im 2. Screen von hp-setup erkennt er ja noch den Drucker, nun auf next da sollte der Screen kommen dass man den Drucker wirklich installiert. Falls der Screen bei dir kommt dann passt es, falls hp-setup vorher dumpt hast du das gleiche Problem wie ich. Brauchst also nicht wirklich einen Drucker installieren, im 3. Screen einfach abbrechen. Aber wie gesagt muss 3.20.9 sein da ich nicht weiß wann sich das spec File geändert hat.
 

Sauerland

Ultimate Guru
Code:
[hp2000S1_plugin_3]
src=scan/sane/libsane-hp2000S1-$ARCH.so.1.0.25
trg=/usr/lib64/sane/libsane-hp2000S1-$ARCH.so.1.0.25
link=/usr/lib64/sane/libsane-hp2000S1.so

[hp2000S1_plugin_4]
src=scan/sane/libsane-hp2000S1-$ARCH.so.1.0.25
trg=/usr/lib64/sane/libsane-hp2000S1-$ARCH.so.1.0.25
link=/usr/lib64/sane/libsane-hp2000S1.so.1

[hp2000S1_plugin_5] 
src=scan/sane/libsane-hp2000S1-$ARCH.so.1.0.25
trg=/usr/lib/sane/libsane-hp2000S1-$ARCH.so.1.0.25
link=/usr/lib/x86_64-linux-gnu/sane/libsane-hp2000S1.so

[hp2000S1_plugin_6]
src=scan/sane/libsane-hp2000S1-$ARCH.so.1.0.25
trg=/usr/lib/sane/libsane-hp2000S1-$ARCH.so.1.0.25
link=/usr/lib/x86_64-linux-gnu/sane/libsane-hp2000S1.so.1

Die beiden obigen sind da, die beiden unteren nicht, sind aber dieselben Dateien/Links wie oben.......
Code:
ls -al /usr/lib64/sane/libsane-hp2*
lrwxrwxrwx 1 root root      49  1. Okt 09:40 /usr/lib64/sane/libsane-hp2000S1.so -> /usr/lib64/sane/libsane-hp2000S1-x86_64.so.1.0.25
lrwxrwxrwx 1 root root      49  1. Okt 09:40 /usr/lib64/sane/libsane-hp2000S1.so.1 -> /usr/lib64/sane/libsane-hp2000S1-x86_64.so.1.0.25
-rwxr-xr-x 1 root root 3811216  1. Okt 09:40 /usr/lib64/sane/libsane-hp2000S1-x86_64.so.1.0.25


Das Verzeichnis existiert aber bei Debian......
Code:
/usr/lib/x86_64-linux-gnu/sane/
Übrigens gibt es diese ganzen Dateien z.B. in hplip 3.16.11 unter Debian nicht......
Daher nehme ich an, das die in einer späteren Version hinzugefügt wurden.
 
OP
K

klaus-dieter

Hacker
Hallo,

also ich habe jetzt mal einen weiteren Rechner auf 15.2 hochgezogen. Von opensuse kommt hplip 3.19.12 dort ist das spec File noch so wie es sein sollte. Bei 3.20.9 kommen die vielen neuen Einträge und es gibt die gleichen Probleme. Intressant ist wenn man einmal auf 3.20.9 war komme ich nicht mehr zurück auf das alte spec file. Ich habe ein downgrade gemacht, das spec file gelöscht dann hp-plugin laufen lassen trotzdem habe ich das neuere spec file.

Also ich bin mir sehr sicher, wer auf 3.20.9 ist wird hp-setup unter opensuse wegen des Spec Files nicht ans laufen bekommen.
 

Sauerland

Ultimate Guru
Also ich bin mir sehr sicher, wer auf 3.20.9 ist wird hp-setup unter opensuse wegen des Spec Files nicht ans laufen bekommen.
Hier läuft es.......

Da ich jedoch auch Pakete baue, hab ich immer viele Pakete installiert, es wird an irgendeiner Abhängigkeit liegen, die ich noch nicht herausbekommen habe.

Übrigens:
Diese plugins-run verschiebt ja eigentlich nur Dateien.
 
OP
K

klaus-dieter

Hacker
Hier läuft was? Der Drucker tut (was ich dir glaube) oder hp-setup läuft durch mit dem kaputten spec File (was ich fast nicht glauben kann)?
 
Oben