[geklärt] Funktion hostname in FHEM?

Begonnen von TomLee, 24 Januar 2026, 14:15:18

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

auf meinem Hauptsystem kann ich in der Kommandozeile ein {hostname} ausführen und es wird mir der Hostname in FHEMWEB ausgegeben.

Auf einem "frischen" Testsystem ist die Funktion nicht bekannt:
Bareword "hostname" not allowed while "strict subs" in use at (eval 190) line 1.
Auf dem Hauptsystem hab ich alle 99_...er Dateien nach hostname durchsuchen lassen grep -nH "hostname" 99* und es wird keine Funktion mit dem Namen hostname gefunden.

Was kann ich auf meinem Hauptsystem noch suchen/ausprobieren um herauszufinden woher die Funktion hostname kommt?


Gruß Thomas

frober

Ich tendiere dazu, das die Berechtigung fehlt in der sudoers.
Hast du es mal mittels Shellbefehl versucht.
{system(hostname)} o.ä.
Bzw. mit sudo...

Bei mir funktioniert das auf meinem "alten" System auch nicht.



Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

passibe

Kommt vielleicht von Sys::Hostname?
Das dürfte auf deinem neuen System auch funktionieren:
{use Sys::Hostname;; hostname;;}
Also vielleicht mal:
grep -nH "Hostname" 99*oder ggfs. besser case-insensitive:
grep -nHi "hostname" 99*(Natürlich auch sonst alle anderen möglichen Dateipfade, wo du etwas geändert haben könntest, überprüfen.)

TomLee

#3
Hi,

Auf beiden System hab ich nichts an der sudoers geändert, in beiden steht das gleiche:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# This fixes CVE-2005-4890 and possibly breaks some versions of kdesu
# (#1011624, https://bugs.kde.org/show_bug.cgi?id=452532)
Defaults        use_pty

# This preserves proxy settings from user environments of root
# equivalent users (group sudo)
#Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"

# This allows running arbitrary commands, but so does ALL, and it means
# different sudoers have their choice of editor respected.
#Defaults:%sudo env_keep += "EDITOR"

# Completely harmless preservation of a user preference.
#Defaults:%sudo env_keep += "GREP_COLOR"

# While you shouldn't normally run git as root, you need to with etckeeper
#Defaults:%sudo env_keep += "GIT_AUTHOR_* GIT_COMMITTER_*"

# Per-user preferences; root won't have sensible values for them.
#Defaults:%sudo env_keep += "EMAIL DEBEMAIL DEBFULLNAME"

# "sudo scp" or "sudo rsync" should be able to use your SSH agent.
#Defaults:%sudo env_keep += "SSH_AGENT_PID SSH_AUTH_SOCK"

# Ditto for GPG agent
#Defaults:%sudo env_keep += "GPG_AGENT_INFO"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d

TomLee

pi@fhempi:/opt/fhem/FHEM $ grep -nH "Hostname" 99*
pi@fhempi:/opt/fhem/FHEM $ grep -nHi "hostname" 99*
99_myUtils.pm:151:      my $fhemip = (split(/\s+/,qx(hostname -I)))[0];

Mehr ist nicht.

passibe

#5
Dann musst du ggfs. den Suchradius erweitern, vielleicht hast du ja mehr Dateien als nur die 99er angepasst.
Vielleicht mal:sudo -u fhem grep -nri 'Sys::Hostname' /opt/fhem
Bei mir gibt das:
/opt/fhem/configDB.pm:196:use Sys::Hostname;
/opt/fhem/FHEM/70_STV.pm:19:use Sys::Hostname;
/opt/fhem/FHEM/Meta.pm:528:  Sys::Hostname
/opt/fhem/FHEM/37_plex.pm:12:use Sys::Hostname;
/opt/fhem/FHEM/37_fakeRoku.pm:8:use Sys::Hostname;
/opt/fhem/FHEM/70_SamsungAV.pm:21:use Sys::Hostname;

Wenn ich das jetzt aber sehe: Ich vermute mal, dass du eines dieser Module auf dem Hauptsystem im Einsatz hast (configDB?). Sys::Hostname wird dann ja automatisch geladen und steht zur Verfügung. Im frischen Testsystem ist keines der o.g. Module geladen, weil es ja frisch ist, deshalb auch kein {hostname}.

TomLee

ZitatDas dürfte auf deinem neuen System auch funktionieren:

{use Sys::Hostname;; hostname;;}

Ja, hätte ich zuvor einfach auch mal ausprobieren, das es aus dem Modul kommen könnte hab ich schon gelesen gehabt.
Wenn ich ein use Sys::Hostname; in der 99_myUtils.pm des Testsystem ergänze gibts die Funktion.
Dann kommt aber auch hier was zurück:
pi@raspi3b:/opt/fhem/FHEM $ grep -nHi "use Sys" 99*
99_myUtils.pm:11:use Sys::Hostname;

was beim Hauptsystem nicht der Fall ist.

TomLee

#7
pi@fhempi:/opt/fhem/FHEM $ sudo -u fhem grep -nri 'Sys::Hostname' /opt/fhem
/opt/fhem/configDB.pm:196:use Sys::Hostname;
/opt/fhem/contrib/ble2mqttd:53:use Sys::Hostname;
/opt/fhem/FHEM/70_STV.pm:19:use Sys::Hostname;
/opt/fhem/FHEM/37_fakeRoku.pm:8:use Sys::Hostname;
/opt/fhem/FHEM/37_plex.pm:12:use Sys::Hostname;
/opt/fhem/FHEM/70_SamsungAV.pm:21:use Sys::Hostname;
/opt/fhem/FHEM/Meta.pm:528:  Sys::Hostname

Ich hab aber keines der Module im Einsatz.

TomLee

Wenn ich in der Kommandozeile folgendes ausführe:

{use B qw(svref_2object);;
my $cv = svref_2object(\&hostname);;
print "Hostname kommt aus: " . $cv->FILE . "\n";;}

steht im Log:
Hostname kommt aus: /usr/share/perl/5.36/Net/Domain.pm

TomLee

Dann wird es wohl was mit der verwendeten Perl-Version zu tun haben?
pi@raspi3b:/opt/fhem/FHEM $ perl -v
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LC_CTYPE = (unset),
        LC_NUMERIC = "de_DE.UTF-8",
        LC_COLLATE = (unset),
        LC_TIME = "de_DE.UTF-8",
        LC_MESSAGES = (unset),
        LC_MONETARY = "de_DE.UTF-8",
        LC_ADDRESS = "de_DE.UTF-8",
        LC_IDENTIFICATION = "de_DE.UTF-8",
        LC_MEASUREMENT = "de_DE.UTF-8",
        LC_PAPER = "de_DE.UTF-8",
        LC_TELEPHONE = "de_DE.UTF-8",
        LC_NAME = "de_DE.UTF-8",
        LANG = "en_GB.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").

This is perl 5, version 40, subversion 1 (v5.40.1) built for aarch64-linux-gnu-thread-multi
(with 48 registered patches, see perl -V for more detail)

Copyright 1987-2025, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at https://www.perl.org/, the Perl Home Page.

pi@fhempi:/opt/fhem/FHEM $ perl -v

This is perl 5, version 36, subversion 0 (v5.36.0) built for aarch64-linux-gnu-thread-multi
(with 53 registered patches, see perl -V for more detail)

Copyright 1987-2022, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at https://www.perl.org/, the Perl Home Page.

TomLee

#10
Habs.

Mit grep -r "Net::Domain" /opt/fhem/FHEM/ hab ich den "Importeur" sofort ausfindig gemacht:

pi@fhempi:/opt/fhem/FHEM $ grep -r "Net::Domain"
/opt/fhem/FHEM/50_SSChatBot.pm:eval "use Net::Domain qw(hostname hostfqdn hostdomain domainname);1"  or my $SSChatBotNDom = "Net::Domain";   ## no critic 'eval'                                 
/opt/fhem/FHEM/50_SSChatBot.pm:        "Net::Domain": 0       
/opt/fhem/FHEM/96_SIP.pm:use Net::Domain qw(hostname hostfqdn);
/opt/fhem/FHEM/93_Log2Syslog.pm:eval "use Net::Domain qw(hostname hostfqdn hostdomain domainname);1"  or my $MissModulNDom   = "Net::Domain";        ## no critic 'eval'
/opt/fhem/FHEM/93_Log2Syslog.pm:        "Net::Domain": 0

Wenn ich das use Sys::Hostname; aus der 99_myUtils der neuen Testinstallation wieder entferne, einen restart von FHEM mach und eine SIP-Definition ergänze, dann ist die hostname-Funktion bekannt.

betateilchen

Zitat von: passibe am 24 Januar 2026, 14:45:05Bei mir gibt das:
/opt/fhem/configDB.pm:196:use Sys::Hostname;
/opt/fhem/FHEM/70_STV.pm:19:use Sys::Hostname;
/opt/fhem/FHEM/Meta.pm:528:  Sys::Hostname
/opt/fhem/FHEM/37_plex.pm:12:use Sys::Hostname;
/opt/fhem/FHEM/37_fakeRoku.pm:8:use Sys::Hostname;
/opt/fhem/FHEM/70_SamsungAV.pm:21:use Sys::Hostname;

zumindest gibt es noch mehr Module, in denen eine Funktion hostname() aufgerufen wird:

/opt/fhem/contrib/DS_Starter/50_SSChatBot.pm:894:          my $host        = hostname();                                                # eigener Host
/opt/fhem/contrib/DS_Starter/93_Log2Syslog.pm:402:  $hash->{MYHOST} = hostname();                            # eigener Host (lt. RFC nur Hostname f. BSD)
/opt/fhem/contrib/ble2mqttd:91:    substr(sprintf("%s-%s", $ME, hostname()), 0, $MQTT_MAX_CLIENTID_LENGTH)
/opt/fhem/FHEM/70_SamsungAV.pm:1232:  my $host = hostname();
/opt/fhem/FHEM/70_SamsungAV.pm:1233:  my $address = inet_ntoa(scalar gethostbyname(hostname() || 'localhost'));
/opt/fhem/FHEM/39_alexa.pm:331:  #$ip = inet_ntoa( scalar gethostbyname( hostname() || 'localhost' ) );
/opt/fhem/FHEM/50_SSChatBot.pm:895:          my $host        = hostname();                                                # eigener Host
/opt/fhem/FHEM/37_fakeRoku.pm:62:  #$ip = inet_ntoa( scalar gethostbyname( hostname() || 'localhost' ) );
/opt/fhem/FHEM/37_fakeRoku.pm:96:  $hash->{fhemHostname} = hostname();
/opt/fhem/FHEM/39_gassistant.pm:256:  #$ip = inet_ntoa( scalar gethostbyname( hostname() || 'localhost' ) );
/opt/fhem/FHEM/37_plex.pm:74:  #$ip = inet_ntoa( scalar gethostbyname( hostname() || 'localhost' ) );
/opt/fhem/FHEM/37_plex.pm:131:  $hash->{fhemHostname} = hostname();
/opt/fhem/FHEM/74_Nmap.pm:339:    my $hostname = $_->hostname() ? $_->hostname() : $_->ipv4_addr();
/opt/fhem/FHEM/70_STV.pm:76:  my $host = hostname();
/opt/fhem/FHEM/70_STV.pm:77:  my $address = inet_ntoa(scalar gethostbyname(hostname() || 'localhost'));
/opt/fhem/FHEM/93_Log2Syslog.pm:403:  $hash->{MYHOST} = hostname();                                        # eigener Host (lt. RFC nur Hostname f. BSD)
/opt/fhem/FHEM/96_SIP.pm:147:    eval { $addr = inet_ntoa(scalar(gethostbyname(hostname()))); };
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!