Schrift
[thread]11939[/thread]

LinuxMagazin Script Fehler

Leser: 22


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Gast Gast
 2008-05-30 16:22
#110489 #110489
Hallo,

ich versuche gerade die Scripte aus folgenden Linux-Magazin Artikel "Licht ins Dunkel" (2007/02) zum Laufen zu bringen, leider ohne Erfolg.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@lapi:/home/peter/wer_ist_im_netz# ./arpcollect.pl
Can't locate object method "mac_address" via package "WatchLAN::IpAddress" at /usr/local/share/perl/5.10.0/Rose/DB/Object.pm line 1499
Rose::DB::Object::AUTOLOAD('WatchLAN::IpAddress=HASH(0xa676a48)', '00:11:25:d2:14:0f') called at /usr/local/share/perl/5.10.0/Rose/Object.pm line 25
Rose::Object::init('WatchLAN::IpAddress=HASH(0xa676a48)', 'mac_address', '00:11:25:d2:14:0f') called at /usr/local/share/perl/5.10.0/Rose/Object.pm line 13
Rose::Object::new('WatchLAN::IpAddress', 'mac_address', '00:11:25:d2:14:0f') called at /usr/local/share/perl/5.10.0/Rose/DB/Object/MakeMethods/Generic.pm line 5664
Rose::DB::Object::MakeMethods::Generic::__args_to_object('WatchLAN::Activity=HASH(0xa334db8)', 'device',
'WatchLAN::IpAddress', 'SCALAR(0x9dee568)', 'ARRAY(0xa5bf540)') called at /usr/local/share/perl/5.10.0/Rose/DB/Object/MakeMethods/Generic.pm line 2335
Rose::DB::Object::MakeMethods::Generic::__ANON__(undef, 'HASH(0xa676c18)') called at WatchLAN.pm line 64
WatchLAN::cache_flush('WatchLAN=HASH(0xa34db70)') called at WatchLAN.pm line 45
WatchLAN::event_add('WatchLAN=HASH(0xa34db70)', '00:11:25:d2:14:0f', 10.1.2.152) called at ./arpcollect.pl line 43
main::callback('ARRAY(0x95f9880)', 'HASH(0x9726000)',
'\x{0}\x{1b}!\x{0}|\x{be}\x{0}\x{11}%\x{d2}\x{14}\x{f}\x{8}\x{0}E\x{0}\x{0}\x{1c}
\x{0}\x{0}@\x{0}@\x{1}\x{c9}\x{b0}\x{a}\x{1}\x{2}\x{98}\x{d9}\x{92}\x{8b}\x{5}\x{8}
\x{0}$\x{e6}\x{d3}\x{19}\x{0}\x{0}') called at ./arpcollect.pl line 25
root@lapi:/home/peter/wer_ist_im_netz#

Peter
GwenDragon
 2008-05-30 17:49
#110492 #110492
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
Gast Gast
 2008-06-02 12:35
#110615 #110615
Hi,

sorry das ich mich erst jetzt wieder melde, aber dank Blitzschlag bin ich offline@home.
Ich habe zum einen die Listings aus dem Artikel kopiert, zum andern ist mir dann irgenwann aufgefallen, das man sie auch runterladen kann. Ich habe beide probiert, beide ohne Erfolg. Aber ich werd's gleich noch mal ausprobieren mit dem Link.

Peter
Gast Gast
 2008-06-02 15:39
#110624 #110624
Hallo,

ich hab's jetzt nochmal mit den Scripten von der Seite versucht, aber wie ich schon geschrieben habe, ohne Erfolg.
Dubu
 2008-06-07 13:55
#110848 #110848
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ich habe die Skripte auch mal bei mir installiert, CPAN:Net::Pcap, CPAN:NetPacket::Ethernet und den ganzen CPAN:Rose::DB-Kram installiert und die Datenbank angelegt. (Warum ist eigentlich die sql.txt nicht auf dem FTP-Server? Da musste ich von einem Screenshot abtippen. Okay, ich musste ohnehin für PostgreSQL alles umschreiben, aber es wäre trotzdem einfacher.)

Dann als root arpcollect gestartet und es funktioniert.

An dem Skript liegt es also eher nicht.
Dubu
 2008-06-07 14:13
#110849 #110849
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Wenn ich mir nochmal die Fehlermeldung oben anschaue: Die Klasse WatchLAN::IpAddress dürfte es gar nicht geben. Diese Klassen werden automatisch von Rose::DB angelegt, und in der Datenbankdefinition gibt es keine Tabelle ip_address, sondern nur ip_addresses. Bist du sicher, dass du die DB richtig angelegt hast, wie im Artikel angegeben?

Damit andere es nicht auch abtippen müssen, hier das Schema für MySQL, wie im Artikel zu sehen:
Code: (dl )
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
CREATE TABLE ip_addresses (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
string VARCHAR(15),
UNIQUE(string)
) Type=InnoDB;

CREATE TABLE devices (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
mac_address VARCHAR(17),
ip_static_id INTEGER,

FOREIGN KEY (ip_static_id)
REFERENCES ip_addresses(id),
INDEX(ip_static_id),
UNIQUE(mac_address)
) Type=InnoDB;

CREATE TABLE activity (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
minute DATETIME,
counter BIGINT,
device_id INTEGER NOT NULL,
ip_address_id INTEGER NOT NULL,

FOREIGN KEY (device_id)
REFERENCES devices(id),
FOREIGN KEY (ip_address_id)
REFERENCES ip_addresses(id),
INDEX(device_id),
INDEX(ip_address_id)
) Type=InnoDB;


Und hier meine PostgreSQL-Variante (für PostgreSQL 8.1, deshalb kein DROP ... IF EXISTS!):
Code: (dl )
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
DROP INDEX device_id_idx;
DROP INDEX ip_static_id_idx;
DROP INDEX ip_address_id_idx;
DROP TABLE activity;
DROP TABLE devices;
DROP TABLE ip_addresses;

CREATE TABLE ip_addresses (
id SERIAL UNIQUE PRIMARY KEY,
string VARCHAR(15),
UNIQUE(string)
);

CREATE TABLE devices (
id SERIAL UNIQUE PRIMARY KEY,
name VARCHAR(255),
mac_address VARCHAR(17),
ip_static_id INTEGER,

FOREIGN KEY (ip_static_id)
REFERENCES ip_addresses(id),
UNIQUE(mac_address)
);

CREATE TABLE activity (
id SERIAL UNIQUE PRIMARY KEY,
minute TIMESTAMP,
counter BIGINT,
device_id INTEGER NOT NULL,
ip_address_id INTEGER NOT NULL,

FOREIGN KEY (device_id)
REFERENCES devices(id),
FOREIGN KEY (ip_address_id)
REFERENCES ip_addresses(id)
);

CREATE INDEX ip_static_id_idx ON devices (ip_static_id);
CREATE INDEX device_id_idx ON activity (device_id);
CREATE INDEX ip_address_id_idx ON activity (ip_address_id);


(Für eine Version ohne Zeilennummern am besten auf "ANTWORT MIT ZITAT" klicken, Text kopieren und wieder zurück gehen. ;-))

----
Modedit Gwendragon: +Code-Tags
----
Last edited: 2009-05-14 15:00:08 +0200 (CEST)
Gast Gast
 2008-06-07 16:00
#110854 #110854
wäre ein [sql]CREATE TABLE <name> IF NOT EXISTS[/sql] nicht besser?
Dubu
 2008-06-07 18:52
#110861 #110861
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Gast+2008-06-07 14:00:10--
wäre ein [sql]CREATE TABLE <name> IF NOT EXISTS[/sql] nicht besser?

Das kommt darauf an, was man vor hat. Wenn ich am Datenbankschema bastele, muss ich ja die Tabellen vor jedem neu Anlegen löschen, daher das explizite DROP. Natürlich sind dann auch die Daten weg. Bei deiner Syntax würde die Tabelle bei einem neuen Aufruf eben nicht neu angelegt; dafür ist wiederum sicher, dass man keine vorhandene Tabelle aus Versehen überschreibt/löscht.
Gast Gast
 2008-06-10 16:09
#110937 #110937
Hi,

Dubu+2008-06-07 12:13:28--
... und in der Datenbankdefinition gibt es keine Tabelle ip_address, sondern nur ip_addresses. Bist du sicher, dass du die DB richtig angelegt hast, wie im Artikel angegeben?

das war's. Auch ich habe die SQL von dem Bild abgetippt, und dabei aus den ip_adresses halt ip_adress gemacht.
Wie bist du darauf gekommen, ich habe immer in den genannten Code Zeilen gesucht "called at WatchLAN.pm line 64", aber das der Fehler in der DB liegt haette ich nie gefunden.

Vielen vielen Dank

Peter
Dubu
 2008-06-11 00:56
#110961 #110961
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Gast+2008-06-10 14:09:11--
das war's. Auch ich habe die SQL von dem Bild abgetippt, und dabei aus den ip_adresses halt ip_adress gemacht.
Wie bist du darauf gekommen, ich habe immer in den genannten Code Zeilen gesucht "called at WatchLAN.pm line 64", aber das der Fehler in der DB liegt haette ich nie gefunden.

CPAN:Rose::DB erzeugt aus den Tabellen Klassen, ähnlich wie es CPAN:Class::DBI macht. Im Skript werden diese Klassen im Namensraum "WatchLAN::" angelegt. In der Fehlermeldung wurde ein Package "WatchLAN::IpAddress" gesucht, das entspräche einer Tabelle ip_address - die es aber im Schema nicht gibt. Wahrscheinlich wurde die Klasse WatchLAN::IpAddress durch den Foreign Key ip_static_id in der Tabelle devices angesprochen. So kam ich auf meine Vermutung.
Freut mich, dass es geholfen hat.
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2008-05-30 16:22.