Hjälp med FTP-automatisering

Tråden skapades och har fått 46 svar. Det senaste inlägget skrevs .

Jag har behov av en lösning som med 5 min intervall laddar ner ett antal filer via http och sedan laddar upp dom till en FTP-server.

En basketklubb jag är med i använder Google Kalendern ihop med Phpicalendar. Vi har alla träningar, matcher etc inlagt där och visar detta på vår hemsida. Google används på grund av att det är lätt att administrera för mig när det ser lika ut för alla inblandade oberoende av dator.

Det finns dock stora problem med prestandan med Phpicalendar ihop med Google. Vi har inte tillgång till webbservern för diverse cache-lösningar som förslås när man frågar runt lite. Jag tänkte istället ladda ner .ics-filerna från Google och ladda upp dom tiill vår FTP. Det kan räcka med ett intervall på 5 minuter. Jag har tillgång till en OS X-server som rullar 24/7 som jag skulle kunna använda.

Finns det något avancerat FTP-program som skulle kunna sköta större delen av jobbet eller behöver man scripta lösningen (vilket jag i så fall behöver hjälp med)?

En typisk länk som ska laddas ner ser ut så här:
http://www.google.com/calendar/ical/ei8lhrf06f3pvv7704f33a9vl8%40group.calendar.google.com/public/basic.ics

Fick tips om JaSFtp. Kan både ladda ner från webben och ladda upp till FTP med inbyggd automatisering.

  • Medlem
  • Stockholm
  • 2007-08-07 18:16
Ursprungligen av Anders Täpp:

Fick tips om JaSFtp. Kan både ladda ner från webben och ladda upp till FTP med inbyggd automatisering.

100USD verkade ju inte lite väll dyrt för det programmet, men om du verkligen vill så, detta är annars lätt löst genom lite shellscriptning som då kostar 0USD eftersom verktygen redan finns med i OS X.

personligen använder jag en liten ftp klient som är för terminalen som heter lftp som man kan installera med hjälp av macports eller fink etc, denna stödjer att man laddar den med väldigt enkla scripts som den utför samt att ladda ner saker över http (och en del andra protokol), den laddar bland annat upp en rss feed åt mig automatiskt.

Jag rekommenderar att använda scp (kopiering via ssh). Om du genererar nycklar och ställer in det rätt kan du med ett cronskript kopiera fil från lokal dator till server på bestämda interval. Det går säkert lösas med applescript eller automator också.

  • Oregistrerad
  • 2007-08-08 21:30
Ursprungligen av Ciryon:

Jag rekommenderar att använda scp (kopiering via ssh). Om du genererar nycklar och ställer in det rätt kan du med ett cronskript kopiera fil från lokal dator till server på bestämda interval. Det går säkert lösas med applescript eller automator också.

Hur tusan ska han lösa ftp och http överföringar med secure copy ????

Ursprungligen av studiox:

Hur tusan ska han lösa ftp och http överföringar med secure copy ????

scp är istället för ftp. Betydligt bättre eftersom lösenord inte skickas i klartext. http-överföringen (tanka ner från google) är ju inga problem, går att fixa med curl, wget eller Automator.

Jag skulle gjort:
(var femte minut, cron)
* Ladda ner från google med curl
* Ladda upp till servern med scp

Det är ungefär samma som mry's kodsnutt gör men med scp istället för ftp.

  • Medlem
  • Stockholm
  • 2007-08-07 22:26

Hej!

Enklast är att schemalägga ett script för detta.

Du kan köra curl som kommer med os x för att hämta hem filen och sedan ladda upp den till din ftp yta.

Ett exempel för din ovanstående fil:

curl http://www.google.com/calendar/ical/ei8lhrf06... | curl -u användarnamn:lösenord  ftp://ftp.domän.se/katalognamn/basics.ics

Den här snutten kan du spara och sedan schemalägga via cron.

/matt

Ursprungligen av mry:

...Den här snutten kan du spara och sedan schemalägga via cron.

/matt

Jag tror du misstar mig för någon som kan sånt här

FTP-problemet med extern uppladdning är löst så nu tänkte jag försöka komma till skott med ett test.

1. Vad gör jag med cron-raden så det blir ett script?
2. Ingår det omdöpning i exemplet du gjorde? Alla filer heter basic.ics när de laddas ner med behöver få nya namn på flykten så att säga.
3. Var laddas den temporära filen ner? Skriver den över nästa gång automatiskt?
4. Hur gör jag för att schemalägga filen med cron?

Ursprungligen av Anders Täpp:

1. Vad gör jag med cron-raden så det blir ett script?

Testa först att bara klistra in kodraden i terminalen. Glöm inte att ersätta med ditt eget login/lösen.

Ursprungligen av Anders Täpp:

2. Ingår det omdöpning i exemplet du gjorde? Alla filer heter basic.ics när de laddas ner med behöver få nya namn på flykten så att säga.

Filen kommer aldrig "sparas" lokalt utan det som tankas ner från google kommer direkt laddas upp till ftp.

Ursprungligen av Anders Täpp:

3. Var laddas den temporära filen ner? Skriver den över nästa gång automatiskt?

Se ovan. Finns ingen temporär fil.

Ursprungligen av Anders Täpp:

4. Hur gör jag för att schemalägga filen med cron?

Du skriver crontab -e i Terminalen och lägger till en cronrad som ser ut som

0,5,10,15,20,25,30,35,40,45,50,55 * * * * kommandot

där kommandot ersätts med kodraden i inlägget ovan. crontab -e startar editering av fil med Mac OS X default editor i terminalen, jag kommer inte ihåg vilken det är, kanske vi eller emacs. Om du inte kommer på hur du sparar efter modifikationen säg till.

Lysande Matt! Ska testa så fort jag får möjlighet.

Just nu stötte vi på ett annat bekymmer. Vår hemsida ligger på lokala kabeloperatörens nät och de tillåter bara FTP-anslutning inifrån nätet, dvs jag kan administrera min hemsida från datorn hemma men inte från jobbet som är på annan ort. Servern som jag tänkte låna till det här befinner sig på jobbet. Förhoppningsvis kan vi få dom till att göra ett undantag.

Tack för inlägget Ciryon. De frågor jag har just nu är följande.

1. Jag vill testa av lösningen steg för steg för att hänga med i allt som händer. Jag testar således att köra en sån curl-rad i terminalen men det vill sig inte. Den verkar för det första inte gilla att det inte finns en fil med det namnet i FTP. Jag lägger då dit filen först. Då startar nerladdningsprocessen som jag kan se i Terminal. På slutet blir det dock ett fel:

BEGIN:VCALENDAR
VERSION:2.0
X-WR-CALNAME:Extra
... ...
END:VEVENT
END:VCALENDAR
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 32  3419   32  1170    0     0   2019      0  0:00:01 --:--:--  0:00:01  2019
curl: (23) Failed writing body

Detta kör jag

curl http://www.google.com/calendar/ical/ei8lhrf06... | curl -u kontonamn:password  ftp://ftp.server.net/kalendertest/calendars/Extra.ics

2. Jag ska som sagt ladda ner 10-15 sådana -ics-filer. Kan jag använda samma tidsintervall för samtliga cron-kommandon?

  • Medlem
  • International user
  • 2007-08-13 16:52
Ursprungligen av Anders Täpp:

2. Jag ska som sagt ladda ner 10-15 sådana -ics-filer. Kan jag använda samma tidsintervall för samtliga cron-kommandon?

Det kan du göra genom att "loopa" flera filer

for filen in a.ics b.ics c.ics d.ics
do
  ...kod för att ftp:a... $filen
done
Ursprungligen av Wire:

Det kan du göra genom att "loopa" flera filer

for filen in a.ics b.ics c.ics d.ics
do
  ...kod för att ftp:a... $filen
done

Är a, b, c, d exempel som motsvarar hela länken till Google?

Vad ska in istället för "filen"?

Jag googlade fram lite Terminal-tips om FTP. Jag har skickat upp en .ics-fil vilket gick bra.

ftp> put Extra.ics
local: Extra.ics remote: Extra.ics
227 Entering Passive Mode (81,16,....).
125 Data connection already open; Transfer starting.
100% |*************************************|  3550      17.01 MB/s    --:-- ETA
226 Transfer complete.
3550 bytes sent in 00:00 (15.98 KB/s)
ftp> 

Grejen är ju att du vill skicka upp till ftp automatiskt, utan att behöva logga in. Det var därför jag rekommenderade scp ovan. Om du gör en ny fil och kallar den "getandsend.sh" t.ex. så kan du fylla den med:

#!/bin/sh

curl http://www.google.com/calendar/ical/ei8lhrf06... > ~/basic.ics
scp ~/basic.ics username@din.server.com:~/din/mapp/pa/servern

(ersätt med din info)

Ställ in cron så att getandsend.sh körs istället. Det du måste göra för att få detta att funka är

1) Kolla att du kan komma åt servern med SSH (är det en Mac så finns det klart)
2) Kolla guiden för scp jag länkade till ovan och ställ in så du slipper skriva in lösen då filen kopieras.

edit: Jag sticker hem från jobbet nu, så nån annan kanske kan fortsätta snickra ihop ett lämpligt skript (eller anann lösning)

Det är lokala kabelbolagets webbserver där deras kunder har sina hemsidor. Det är väl inte troligt att jag kan SSH:a in där eller? Det är en Win-burk för övrigt.

Remote server is running Microsoft FTP Service.
220: webserver Microsoft FTP Service (Version 5.0).

  • Medlem
  • Stockholm
  • 2007-08-13 19:59

Jag orkade inte med att se era försök och hade inget bättre för mig ute i hängmattan då jag slösurfade.. så här kommer en lösning till problemet.

(entity@ran ~/downloads): ./magic-uploader.sh 
download of name.ics ok
upload of name.ics ok
download of name2.ics ok
upload of name2.ics ok
download of name3.ics ok
upload of name3.ics ok

så ser det ut då man kör, är ett script som heter magic-uploader.sh (i brist på annat fyndigt namn) och en configurationsfil som då heter configfile.conf

http://www.dnz.se/misc/magic-uploader.sh

http://www.dnz.se/misc/configfile.conf

configfilen funkar som så att det är:

<namn som du vill att den skall laddas upp som>|<url till google cal basics.ics fil>
<namn som du vill att den skall laddas upp som>|<url till google cal basics.ics fil>
<namn som du vill att den skall laddas upp som>|<url till google cal basics.ics fil>

en per rad.

scriptet i sig kan ni läsa här:

#!/bin/sh
# magic uploader by anders.lindback [at] dnz.se
# provided under BSD license.
# no implied or stated warranty applies.
# if this eats your data or ends your marrige, dont blame me.


# SETTINGS
CONFFILE="/some/path/to/configfile.conf"
WORKDIR="/tmp/"                 # dont change unless needed.
UPLOADHOST="host.domain.tld."
UPLOADDIR="/path/to/dir"        # remember / as first char.
UPLOADUSER="somerandomuser"
UPLOADPASS="somerandompass"


# MAGIC DONT TOUCH UNLESS YOU HAVE A CLUE
cd $WORKDIR
for i in `cat $CONFFILE`; do
NAME=`echo $i | awk -F"|" '{print $1}'`
URL=`echo $i | awk -F"|" '{print $2}'`

ftp -o ${WORKDIR}${NAME} $URL >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "dowload of $NAME failed"
continue
else
echo "download of $NAME ok"
fi

ftp -u ftp://${UPLOADUSER}:${UPLOADPASS}@${UPLOADHOST}/${UPLOADDIR}/${NAME} ${NAME} >/dev/null 2>&1 
if [ $? -eq 255 ]; then
echo "upload of $NAME ok"
else
echo "upload of $NAME might have failed, errorcode: $?"
fi
rm ${WORKDIR}/${NAME}
done

finns ingen anledning att använda nått annat än det inbyggda ftp komnandot i OS X då detta är standardunix ftp hanterar det även http etc.

  • Medlem
  • Stockholm
  • 2007-08-13 20:36

Hej!

Mitt exempel hämtar en ics fil och skickar upp den till din ftp. Kodsnutten är en rad men innehåller två kommandon; den första hämtar och den andra skickar upp den. Det är samma program som används.

Om du skall hämta flera filer är det enklast att samla alla steg i ett script. Scriptet schemalägger du mha cron.

Angående namnet på filen som skickas upp så kan du välja vad som helst.

Scriptet är ju bara en textfil. Den skall sedan flaggas som "executable".
chmod +x /sökvägtillscriptet

Cron är ju ett ganska rudimentärt schemasystem men funkar kanon. Formatet är kryptiskt dock, precis som allt annat unix...

Först MÅSTE du dock kontrollera att det inte redan finns schemalagda job via cron. Bäst är väl om du kollar med server admin innan...

Jag brukar dumpa ut crontab resultatet till en fil, så jag alltid har en backup:

crontab -l > crontab_schedule

Denna fil kan du sedan ändra i och skicka till crontab (efter du backat den...). Om det inte finns några cron job, så skapas inte filen.

Filen har följande format (http://en.wikipedia.org/wiki/Crontab#Common_mistakes):

# Use the hash sign to prefix a comment
# +---------------- minute (0 - 59)
# |  +------------- hour (0 - 23)
# |  |  +---------- day of month (1 - 31)
# |  |  |  +------- month (1 - 12)
# |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed

Så i ditt fall borde din rad för scriptet vara:
5 * * * * /sökväg/scriptnamn.sh

dvs, var femte minut varje dag.

curl kan även skicka via ftps om du vill ha det säkert. Men varför komplicera det? Det är ju ändå bara kalender filer. Du kan ju skapa en användare som är låst till en viss katalog och bara tillåta ics filer vid uppladdning.

  • Medlem
  • Stockholm
  • 2007-08-13 20:46

crontab är dock smart nog att inte låta dig skriva ngt som är uppåtväggarna fel..

(entity@ran ~): crontab -e
crontab: no crontab for entity - using an empty one
crontab: installing new crontab
"/tmp/crontab.GZ64o0uCxP":0: bad minute
crontab: errors in crontab file, can't install
Do you want to retry the same edit? 

knappade in "random jibberish" i min crontab..

detta är ju dock om man öppnar ens crontab med editor-wrappern som man gör med -e flaggan, att manuelt ändra i crontab utan denna är bara dumt..

mry: 5 * * * * är _INTE_ var femte minut, det är 5min över varje heltimma..

för att köra något var femte minu är det:

*/5 * * * * som man skriver som tidsangivelse.

crontab kan göra mycket mer avancerade saker än så dock, ex:

*/7 11-15 * * 1-5 kör kommandot som man anger var 7minut mellan 11-15 på dagen under vardagar (mån - fre).

Det fina är dock att man måste inte krångla till det:

för att bara köra ett kommando då cron startar (vanligtvis vid boot) kan man skriva

@reboot istället för en tid, andra saker som man skriva är uppenbara så som @hourly @daily @weekly etc.

Senast redigerat 2007-08-13 20:56

ntity nu har jag din grej redo att testas men hur kör jag .sh-scriptet? Jag vill inte lägga det i crontab innan jag testat att det funkar.

  • Medlem
  • Stockholm
  • 2007-08-13 21:26
Ursprungligen av Anders Täpp:

ntity nu har jag din grej redo att testas men hur kör jag .sh-scriptet? Jag vill inte lägga det i crontab innan jag testat att det funkar.

Ladda ner båda filerna magic-uploader.sh & configfile.conf, se sedan till att du har rätt inställningar, testvärdena i configfile.conf borde funkar för dig som test iaf.

Kontrollera sedan inställningarna i magic-uploader.sh, du måste ställa in lite saker i settingsdelen, så som vars du har config filen och host, mapp, användare & lösen till ftp servern som din ISP har.

efter det, öppna terminalen ställ dig i den mapp som du har magic-uploader.sh i, ställ in rättigheterna om den inte har rätt redan och kör det ex:

cd /Users/entity/Desktop
ls -al magic-uploader.sh
chmod 750 magic-uploader.sh
./magic-uploader.sh

den spottar nu ur sig lite om den hittar config filen, funkar allt skall de se ut som exemplet som jag visade i mitt tidigare inlägg.

PS. ändra är lättast att du använder nano i terminalen till, då det minskar riskten att du får med skräptecken eller MSDOS radbryt av textedit eller så.

nano magic-uploader.sh

i terminalen då du står i mappen som du har magic-uploader i.

  • Medlem
  • Stockholm
  • 2007-08-13 22:09

ah att ftp klarar http hade jag ingen aning om! Bra att veta!

Måste dock säga att jag gillar lösningen med pipning bättre Nu har du ju en onödigt komplicerad lösning för en enkel uppgift.

Men skönt att det verkar ha löst sig för dig Anders!

  • Medlem
  • Stockholm
  • 2007-08-13 22:39
Ursprungligen av mry:

ah att ftp klarar http hade jag ingen aning om! Bra att veta!

Måste dock säga att jag gillar lösningen med pipning bättre Nu har du ju en onödigt komplicerad lösning för en enkel uppgift.

Men skönt att det verkar ha löst sig för dig Anders!

Nja, han skall ju hantera en 10-15 kalendrar så lika bra att göra en bra lösning som hanterar dessa smidigt än 15st hack rader i crontab..

Ursprungligen av ntity:

Nja, han skall ju hantera en 10-15 kalendrar så lika bra att göra en bra lösning som hanterar dessa smidigt än 15st hack rader i crontab..

Precis. Jag gillar config-filen där jag lätt kan ändra under resans gång.

Får dock inte scriptet att funka. Jag hade lista ut hur man ställer in i config-filen och nu kör jag i terminalen enligt inlägget en bit upp:

Anders-MacbookPro:~ anders$ cd /Users/anders
Anders-MacbookPro:~ anders$ ls -al magic-uploader.sh
-rwxr-x---   1 anders  admin  997 Aug 13 22:37 magic-uploader.sh
Anders-MacbookPro:~ anders$ chmod 750 magic-uploader.sh
Anders-MacbookPro:~ anders$ ./magic-uploader.sh
download of Styrelsen.ics ok
upload of Styrelsen.ics might have failed, errorcode: 1
download of Avbokningar.ics ok
upload of Avbokningar.ics might have failed, errorcode: 1
download of Bollskola.ics ok
upload of Bollskola.ics might have failed, errorcode: 1
download of Extra.ics ok
upload of Extra.ics might have failed, errorcode: 1

Inga uppladdningar verkar funka och den stannar varje försök på 4:e raden dvs Extra.ics

  • Medlem
  • Stockholm
  • 2007-08-13 22:58

är du helt säker på login uppgifter och annat som du har fyllt i?

Sen problemet om att den endast kör fyra rader låter som om du saknar en del av config filen, notera att det är viktigt med "|" tecknet mellan namnet och urlen till kalendern den måste vara med mellan fälten på varje rad.

för att se problemet med uppladdningarna, ändra på denna raden:

ftp -u ftp://${UPLOADUSER}:${UPLOADPASS}@${UPLOADHOST}/${UPLOADDIR}/${NAME} ${NAME} >/dev/null 2>&1 

så att den ser ut så här:

ftp -u ftp://${UPLOADUSER}:${UPLOADPASS}@${UPLOADHOST}/${UPLOADDIR}/${NAME} ${NAME}

notera att det är ">/dev/null 2>&1" som är borta inget annat, då styr den inte om streamen från ftp så du ser eventuella felmedelanden etc.

PS du behöver inte köra chmod och resten av kommandon varje gång som du testar, endast ./macgic-uploader.sh då du redan ställt in rättigheterna på den en gång.

Ursprungligen av ntity:

är du helt säker på login uppgifter och annat som du har fyllt i?

Sen problemet om att den endast kör fyra rader låter som om du saknar en del av config filen, notera att det är viktigt med "|" tecknet mellan namnet och urlen till kalendern den måste vara med mellan fälten på varje rad.

Filen efter har ett mellanslag i namnet. Är det misstänkt?
Flickor 90.ics|http://www.google.....

Såg även några filnamn med snedstreck i namnet. Har ändrat "Flickor 93/94" till "Flickor 93-94" etc. Dock får jag samma fel fortfarande.

Anders-MacbookPro:~ anders$ cd /Users/anders
Anders-MacbookPro:~ anders$ ./magic-uploader.sh
download of Styrelsen.ics ok
Connected to min-server.
220 webserver Microsoft FTP Service (Version 5.0).
331 Password required for mitt-usernamn.
230 User mitt-usernamn logged in.
Remote system type is Windows_NT.
200 Type set to I.
250 CWD command successful.
550 mitt-usernamn: The system cannot find the file specified. 
221  
upload of Styrelsen.ics might have failed, errorcode: 1
download of Avbokningar.ics ok
Connected to min-server.
220 webserver Microsoft FTP Service (Version 5.0).
331 Password required for mitt-usernamn.
230 User mitt-usernamn logged in.
Remote system type is Windows_NT.
200 Type set to I.
250 CWD command successful.
550 mitt-usernamn: The system cannot find the file specified. 
221  
upload of Avbokningar.ics might have failed, errorcode: 1
download of Bollskola.ics ok
Connected to min-server.
220 webserver Microsoft FTP Service (Version 5.0).
331 Password required for mitt-usernamn.
230 User mitt-usernamn logged in.
Remote system type is Windows_NT.
200 Type set to I.
250 CWD command successful.
550 mitt-usernamn: The system cannot find the file specified. 
221  
upload of Bollskola.ics might have failed, errorcode: 1
download of Extra.ics ok
Connected to min-server.
220 webserver Microsoft FTP Service (Version 5.0).
331 Password required for mitt-usernamn.
230 User mitt-usernamn logged in.
Remote system type is Windows_NT.
200 Type set to I.
250 CWD command successful.
550 mitt-usernamn: The system cannot find the file specified. 
221  
upload of Extra.ics might have failed, errorcode: 1
  • Medlem
  • Stockholm
  • 2007-08-13 23:27
Ursprungligen av Anders Täpp:

Såg även några filnamn med snedstreck i namnet. Har ändrat "Flickor 93/94" till "Flickor 93-94" etc. Dock får jag samma fel fortfarande.

Anders-MacbookPro:~ anders$ cd /Users/anders
Anders-MacbookPro:~ anders$ ./magic-uploader.sh
download of Styrelsen.ics ok
Connected to min-server.
220 webserver Microsoft FTP Service (Version 5.0).
331 Password required for mitt-usernamn.
230 User mitt-usernamn logged in.
Remote system type is Windows_NT.
200 Type set to I.
250 CWD command successful.
550 mitt-usernamn: The system cannot find the file specified. 
221  
upload of Styrelsen.ics might have failed, errorcode: 1
download of Avbokningar.ics ok
Connected to min-server.
220 webserver Microsoft FTP Service (Version 5.0).
331 Password required for mitt-usernamn.
230 User mitt-usernamn logged in.
Remote system type is Windows_NT.
200 Type set to I.
250 CWD command successful.
550 mitt-usernamn: The system cannot find the file specified. 
221  
upload of Avbokningar.ics might have failed, errorcode: 1
download of Bollskola.ics ok
Connected to min-server.
220 webserver Microsoft FTP Service (Version 5.0).
331 Password required for mitt-usernamn.
230 User mitt-usernamn logged in.
Remote system type is Windows_NT.
200 Type set to I.
250 CWD command successful.
550 mitt-usernamn: The system cannot find the file specified. 
221  
upload of Bollskola.ics might have failed, errorcode: 1
download of Extra.ics ok
Connected to min-server.
220 webserver Microsoft FTP Service (Version 5.0).
331 Password required for mitt-usernamn.
230 User mitt-usernamn logged in.
Remote system type is Windows_NT.
200 Type set to I.
250 CWD command successful.
550 mitt-usernamn: The system cannot find the file specified. 
221  
upload of Extra.ics might have failed, errorcode: 1

Ser ut som om den inte hittar den mapp som du har angett i inställningarna då den säger "550 mitt-usernamn: The system cannot find the file specified. " sen är det inte en bra ide att ha mellanslag i namnen i den version som du har, håller på fixa v2 som klarar det och har lite mer felsöknings funktioner.

Ursprungligen av ntity:

Ser ut som om den inte hittar den mapp som du har angett i inställningarna då den säger "550 mitt-usernamn: The system cannot find the file specified. " sen är det inte en bra ide att ha mellanslag i namnen i den version som du har, håller på fixa v2 som klarar det och har lite mer felsöknings funktioner.

Jag har kopierat sökvägen från mitt fungerande bokmärke i FTP-programmet Transmit. Den är /mitt-username/kalendertest/calendars

Jag testade att ta bort mellanslagen och då rullar den igenom hela listan, men med samma grundfel dvs inget laddas upp.

Bevaka tråden