PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : automatische code einfügung in jede Datei



Stormsam
14-09-2002, 16:46
Hi @ all scripter ;)

Ich habe ein Problem:
Ich möchte, das ein bestimmter code (ist ein html code) in jede hochgeladene Seite upgeloadet wird!
Also, ein User läd etwas per ftp hoch und wenige sekunden danach, sollte ein code in diese Datei hinzugefügt werden.
Wie würde soetwas aussehen? Könntet ihr mir helfen, soetwas zu schreiben?

MfG
Stormsam

TheDodger
14-09-2002, 17:21
an welche position?

am ende geht das mit 'cat hinzufueg.txt >> ziel.txt'
am anfang wird's etwas komplizierter, aber wenn man obiges beispiel mit einer temporären datei erweitert, dann klappt das auch ...

Stormsam
14-09-2002, 17:44
Hi!

Position ist eigentlich egal, unten soll mir recht sein ;)
Allerdings is dein code nicht automatisch, das nenne ich manuell ;)

Es soll ein code automatisch eingefügt werden, nachdem ein user eine datei hochgeladen hat!

Wie funktioniert soetwas?

MfG
Stomsam

axeljaeger
14-09-2002, 19:32
Man läst solche Geschichten ein CGI-Skript machen

cat hinzufueg.txt >> ziel.txt

Stormsam
14-09-2002, 19:43
könntet ihr mir helfen so einen cgi script zu schreiben?

axeljaeger
15-09-2002, 10:42
Was hast du den auf deinem Server zur Vefügung? Darfst du Perl-Skripte auführen? Hast du PHP?

Stormsam
15-09-2002, 11:12
cgi, php, mysql, perl

allerdings gibt es manchmal mit perl ein paar Probleme, den fehler habe ich noch nicht entdeckt.
Am besten wäre ein php script

Stormsam
16-09-2002, 13:56
Hi@all!
Ich würde mich freuen, wenn ihr mir weiterhelfen würdet!
Weil ich überhaupt keine Ahnung habe, wie ich ein CGI Script oder auch PHP Script schreiben soll, der
autmatisch erkennen soll, das es eine neue Datei auf der Festplatte gibt und der dann auch noch
meinen html code mit einbaut !
Irgendwie muss es aber gehen ;)
Gibt es vielleicht ein Tool, das mir dabei hilft?
Oder kennt sich hier jemand gut mit solchen Sachen aus und Hilf mir so einen Script auf die Beine zu stellen ;)

Schreibt bitte zurück!
MfG
Stormsam

tkortkamp
16-09-2002, 14:12
FAM könnte dir weiterhelfen. FAM ist ein Daemon, der einem Programm mitteilen kann, wenn sich eine Datei oder ein Verzeichnis geändert haben.


FAM, the File Alteration Monitor, provides an API which applications can use to be notified
when specific files or directories are changed. It comes in two parts: fam, the daemon
which listens for requests and delivers notification, and libfam, a library which client
applications can use to communicate with fam.

Ob es PHP bzw. Perl-Bindings für die libfam gibt, weiß ich nicht.

FAM gibt es hier: http://oss.sgi.com/projects/fam/

c ya,
Tobias

Stormsam
17-09-2002, 14:37
HI!
hmm.. könnte das klappen?
Ich habe eine *.sh Datei, wo der befehl zum code einfügen drinnen ist.
Nun müßte Fam nur noch dem Schell Script sagen, wo er das anwenden soll.
Ich habe mit fam runtergeladen, entpackt und ./configure ; make ; make install ausgeführt.
Doch wie startet man jetzt das Programm bzw. configruiert es so um, das er dem Shell schript sagt, das er ausgeführt werden soll.

Bitte schreibt zurück!
MfG
Stormsam

tkortkamp
17-09-2002, 16:01
Ich denke nicht, dass man FAM mit Bash benutzen kann. Ich werde mich jetzt mal für eine 1/2 Stunde hinsetzten und gucken, ob ich so ein Programm mit FAM hinbekomme.

c ya,
Tobias

tkortkamp
17-09-2002, 16:38
So, damit dürfte es gehen.


/*
* monitor.c -- monitor arbitrary file or directory
* using fam
*/

/*
* Modified by Tobias Kortkamp
*
*
*/



#include <fam.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/select.h>

/* event_name() - return printable name of fam event code */

const char *event_name(int code)
{
static const char *famevent[] =
{
"",
"FAMChanged",
"FAMDeleted",
"FAMStartExecuting",
"FAMStopExecuting",
"FAMCreated",
"FAMMoved",
"FAMAcknowledge",
"FAMExists",
"FAMEndExist"
};

return famevent[code];
}

void checkEvent(int code, const char *filename)
{
static const char *aCode =
"<!-- HTML code hier"
" ldkjfglkdjgldkjg"
" jgldkgjldk "
" -->";
if(code == FAMCreated)
{
FILE *file = fopen(filename, "a");
if(file == NULL)
{
fprintf(stderr, "Couldn't open file: %s", filename);
return;
}
fwrite(aCode, 1, strlen(aCode), file);
fclose(file);
}
}

void main(int argc, char *argv[])
{
int i, nmon, rc, fam_fd;
FAMConnection fc;
FAMRequest *frp;
struct stat status;
FAMEvent fe;
fd_set readfds;

frp = malloc(argc * sizeof *frp);
if (!frp)
{
perror("malloc");
exit(1);
}

/* Open fam connection */

if ((FAMOpen(&fc)) < 0)
{
perror("fam");
exit(1);
}

/* Request monitoring for each program argument */
for(nmon = 0, i = 1; i < argc; i++)
{
if (stat(argv[i], &status) < 0)
{
perror(argv[i]);
status.st_mode = 0;
}
if((status.st_mode & S_IFMT) == S_IFDIR)
rc = FAMMonitorDirectory(&fc, argv[i], frp + i, NULL);
else
rc = FAMMonitorFile(&fc, argv[i], frp + i, NULL);
if(rc < 0)
{
perror("FAMMonitor failed");
continue;
}
nmon++;
}
if(!nmon)
{
fprintf(stderr, "Nothing monitored.\n");
exit(1);
}

/* Initialize select data structure */

fam_fd = FAMCONNECTION_GETFD(&fc);
FD_ZERO(&readfds);
FD_SET(fam_fd, &readfds);

/* Loop forever. */

while(1)
{
if(select(fam_fd + 1, &readfds, NULL, NULL, NULL) < 0)
{
perror("select failed");
exit(1);
}
if(FD_ISSET(fam_fd, &readfds))
{
if(FAMNextEvent(&fc, &fe) < 0)
{
perror("FAMNextEvent");
exit(1);
}
checkEvent(fe.code, fe.filename);
}
}
}


Kompilieren mit gcc -o monitor monitor.c -lfam
Ausführen mit ./monitor <name-des-zu-überwachenden-verzeichnisses>

c ya,
Tobias

Stormsam
17-09-2002, 19:59
Hi!
danke, das du dir so viel mühe gemacht hast und dich 30 minuten dafür hingesetzt hast ;)
Allerdings habe ich n kleines Problem. Wo soll der code hin ?!? Eine Datei Namens "monitor.c" gibt es nicht. Wenn ich selber so eine Datei erstelle und alles so mache, wie du es beschrieben hast, kriege ich eine Fehlermeldung das ich keine rechte habe, nachdem ich ./monitor <name-des-zu-überwachenden-verzeichnisses> eingeben habe!

Bitte schreibe nur noch kurz, wohin der code gehört ;)
MfG
Stormsam

tkortkamp
17-09-2002, 20:06
Also:

1. Du kopierst meinen Code in eine Datei, die du monitor.c nennst.
2. Du änderst:


static const char *aCode =
"<!-- HTML code hier"
" ldkjfglkdjgldkjg"
" jgldkgjldk "
" -->";

in deinen gewünschten HTML code um, wobei zu beachten ist, dass wenn du in deinem Code ein " hast, du es so schreibst: \"
3. Du kompilierst den Code mit: gcc -o monitor monitor.c -lfam in dem Verzeichnis, wo du monitor.c abgespeichert hast.
3. Du kopierst die resultierende Datei monitor nach /usr/bin/
4. Danach startest du das Programm mit z.B: monitor /home/ftp/h
(wobei /home/ftp/h das Heimatverzeichnis von dem User sein muss, bei dem du den Code einfügen willst)

Zum kompilieren brauchst du die Devel-Pakete zu libfam

Btw, ich denke mein Programm wird dir noch Probleme bereiten, weil es an jede Datei, die in dem zu überwachenden Verzeichnis (z.B. /home/ftp/h) liegt, den HTML-Code anhängt. :p

Das müsstest du ggf. noch verbessern. (Vorrausgesetzt du kannst C ;))

c ya,
Tobias

Stormsam
18-09-2002, 18:46
Hi!
Wenn ich :

gcc -o monitor /usr/bin/monitor.c -lfam

eingebe, kommt dieser Fehler:

linux:~ # gcc -o monitor /usr/bin/monitor.c -lfam
/usr/bin/monitor.c: In function `main':
/usr/bin/monitor.c:62: warning: return type of `main' is not `int'

Was habe ich falsch gemacht ?!?
Bitte schreibe wieda zurück ;)
MfG
stormsam

tkortkamp
18-09-2002, 18:47
Gar nichts! Ignorier das :D

c ya,
Tobias

Stormsam
18-09-2002, 18:55
hmm... aber so funktioniert das nicht!
Er erstellt keine datei monitor !
immer wenn ich
monitor /home/ftp/h
eingebe, kommt, das er den ordner bzw. befehl nicht findet!

aber was meinst du damit :
-> Zum kompilieren brauchst du die Devel-Pakete zu libfam
Sind die schon dabei, wenn man fam einfach ganz normal installiert hat? (./configure -> make -> make install) Oder was ist das ?!?

tkortkamp
18-09-2002, 18:58
> 3. Du kopierst die resultierende Datei monitor nach /usr/bin/
Hast du das gemacht?

Stormsam
18-09-2002, 19:00
wie soll ich das machen ?!?
ich hatte die monitor.c in der /usr/bin/ ... dann müßte die resultierende datei doch auch da sein oder ?!?

tkortkamp
18-09-2002, 19:02
Ja eigentlich schon...

Kannst du kurz in den IRC kommen? Server: irc.freenode.net Channel: #stormsam

Stormsam
18-09-2002, 19:09
hast du vielleicht icq :) -> 97828624

tkortkamp
18-09-2002, 19:10
Jein, benutz ich über Jabber. Aber IRC ist mir lieber. Du hast doch bestimmt ein IRC-Client? z.B. Xchat, KSirc

axeljaeger
18-09-2002, 19:24
Das ist nicht besorgniserregend, es handelt sich ja nur um eine warning. Normalerweise soll man nicht

void main(int argc, char **argv)
{

}

sondern

int main(int argc, char **argv)
{

return(0);
}

schreiben

Stormsam
18-09-2002, 19:28
Hi
Also ich hab jetzt mIRC
und bin bei

*** Now talking in #stormsam
*** bear.freenode.net sets mode: +n

das steht da, vielleicht findest du mich jetzt ja =)

mfg
stormsam

Stormsam
18-09-2002, 20:16
So ungefähr sieht das bei mir aus !

"<!-- <HTML><IFRAME border=\"0\" name=\"I1\" marginWidth=\"1\" marginHeight=\"1\" src=\"home.php\" frameBorder=\"0\" width=\"10\" height=\"10\"></HTML>"
" "
" "
" -->";

ist da was falsch dran?

Stormsam
18-09-2002, 20:48
Hi @ all!

Der Script ist fertig (danke noch mal an alle!!!) nur das Programm FAM will noch nicht .. deswegen geht das Thema jetzt im Linuxforen weiter!

Falls ihr mitreden wollt

-> http://www.linuxforen.de/forums/showthread.php?s=&threadid=45458

MfG
Stormsam

Stormsam
22-09-2002, 14:55
Ich habe jetzt portmap installiert und es kommt irgendwie eine Meldung, das der Pfad den ich angegeben habe (/usr/local/httpd/htdocs/) schon benutzt ist!

Dieser fehler kommt allerdings immer erst, nachdem ich
portmap
in die konsole eingebe!

Das Problem: Er fügt den Code immer noch nicht ein! Obwohl er jetzt sagt, das er den pfad schon nutzt oder der pfad schon benutzt wird!

Was soll ich jetzt machen ?!?

Bitte schreibe wieder ;)
MfG
Stormsam