Downloader für Homeserver (NAS System)

  • Hallo Leute,

    ich habe zuhause einen NAS Server stehen den ich über einen DNS IP ansteuern kann.
    Das ganze geht über eine FTP Software im Server.

    Also kann ich den Server nur mit einem Account und einem Passwort ansteuern.
    Nun wollte ich einen Downloader machen mit dem man diese Daten nicht eingeben muss
    sondern so das man einfach den Downloader auf macht und er beginnt den Download.

    Noch dazu wollte ich mir noch ein Uploader für den Server machen das ganze soll so sein.:
    Man hat nach dem Öffnen ein Login Menu wo der Account Name schon drin steht (dieses Programm ist für meine User) und da muss man nur noch sein PW eingeben und dann kann man seine Ordner sehen und Daten hoch und Runter laden.

    Wie kann ich diese beiden Ideen umsetzen oder hat von euch jemand schon so etwas oder kann mir dabei helfen?

  • Das alles kann man mit der FTP.au3 erledigen ^^
    Ich habe so etwas schoneinmal geschrieben.

    Schau es dir an und passe es auf deine Daten an.


    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GuiComboBoxEx.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiImageList.au3>
    #include <WindowsConstants.au3>
    #include <ListBoxConstants.au3>
    #include <GuiListBox.au3>
    #include <StaticConstants.au3>
    ;Bilder einbinden
    ; Url zum Webverzeichnis
    Global $ServerUrl = "http://bennes-music.no-ip.biz/Files/"
    ;Dim $ServerUrl = "http://testuser:qwert@http://www.kroegers-web.de/testdaten/"
    ; Dateiliste die runtergeladen werden soll
    Global $FileList = "files.txt"
    ;Notiz
    Global $Notice = "notice.txt"
    ;Speicherpfad für die Liste
    Global $SaveFileList = @TempDir & "\files.txt"
    ;Speicherpfad für die Notiz
    Global $SaveNotice = @TempDir & "\notice.txt"
    ;Textdatei laden
    If InetGet($ServerUrl & $FileList, $SaveFileList, 1) = 0 Then
    MsgBox(48, "Fehler...", "Fehler beim download der Dateiliste")
    Exit 1
    EndIf
    ;Notiz Laden
    If InetGet($ServerUrl & $Notice, $SaveNotice, 1) = 0 Then
    MsgBox(48, "Fehler...", "Fehler beim download der Notiz")
    Exit 1
    EndIf
    ;Dateiliste zum lesen öffnen
    Global $fso = FileOpen($SaveFileList, 0)
    ;Notiz zum Lesen öffnen
    Global $fsn = FileOpen($SaveNotice, 0)
    ;Inhalt der Datei einlesen
    Global $txt = FileRead($fso)
    ;Inhalt der Notiz einlesen
    Global $ntxt = FileRead($fsn)
    ;Dateiliste schliessen
    FileClose($fso)
    ;Notiz schließen
    FileClose($fsn)
    ;@CRLF aus der $txt Variabele entfernen
    $txt = StringReplace($txt, @CRLF, "|")

    [/autoit] [autoit][/autoit] [autoit]

    ;##################################
    ; Email Variables
    ;##################################
    Global $SmtpServer = "smtp.googlemail.com" ; address for the smtp-server to use - REQUIRED
    Global $FromName = "MusicLoader" ; name from who the email was sent
    Global $FromAddress = "********" ; address from where the mail should come
    Global $ToAddress = "*******************" ; destination address of the email - REQUIRED
    Global $Subject = "Neuer Titel!" ; subject from the email - can be anything you want it to be
    Global $Body = "Nachrichtentext" ; the messagebody from the mail - can be left blank but then you get a blank mail
    Global $AttachFiles = "" ; the file you want to attach- leave blank if not needed
    Global $CcAddress = "" ; address for cc - leave blank if not needed
    Global $BccAddress = "" ; address for bcc - leave blank if not needed
    Global $Importance = "Normal" ; Send message priority: "High", "Normal", "Low"
    Global $Username = "********" ; username for the account used from where the mail gets sent - REQUIRED
    Global $Password = "********" ; password for the account used from where the mail gets sent - REQUIRED
    ;~ $IPPort = 25 ; port used for sending the mail
    ;~ $ssl = 0 ; enables/disables secure socket layer sending - put to 1 if using httpS
    Global $IPPort = 465 ; GMAIL port used for sending the mail
    Global $ssl = 1 ; GMAILenables/disables secure socket layer sending - put to 1 if using httpS
    Global $oMyRet[2]
    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
    Global $txtList = StringSplit($txt, "|"), $txtlistlen, $txtliststart, $txtlistcount, $txtlistresult, $nMsg, $id
    $txt = ""
    For $i = 1 To $txtList[0]
    $txtlistlen = StringLen($txtList[$i]) + 1
    $txtliststart = StringInStr($txtList[$i], "/") + 1
    If $txtliststart = 0 Then
    $txt = $txt & $i & "-" & $txtList[$i] & "|"
    Else
    $txtlistcount = $txtlistlen - $txtliststart
    $txtlistresult = StringMid($txtList[$i], $txtliststart, $txtlistcount)
    $txt = $txt & $i & "-" & $txtlistresult & "|"
    EndIf
    Next
    $txt = StringTrimRight($txt, 1)
    ;Form suche
    Global $hSuche = GUICreate("Treffer ", 350, 300, 1000, 325)
    Global $hListBox = GUICtrlCreateList("", 2, 2, 340, 250, BitOR($WS_BORDER, $LBS_NOTIFY, $LBS_DISABLENOSCROLL, $WS_VSCROLL))
    Global $hOK = GUICtrlCreateButton("OK", 24, 270, 100, 20)
    Global $hAbbruch = GUICtrlCreateButton("Abbruch", 200, 270, 100, 20)
    GUISetState(@SW_HIDE)
    ;Form
    Global $frmMain = GUICreate("Musik Loader", 285, 540, 693, 325)
    Global $File = GUICtrlCreateInput("Suche", 24, 200, 235, 20, 0)
    Global $Suche = GUICtrlCreateButton("Suche", 24, 225, 237, 25, 0)
    Global $PlayButton = GUICtrlCreateButton("Play Music =)", 24, 255, 237, 25, 0)
    Global $NoticeWindow = GUICtrlCreateEdit($ntxt, 24, 285, 237, 250, BitOR($WS_VSCROLL, $ES_READONLY))
    Global $SongAskInput = GUICtrlCreateInput("Welches Lied fehlt?", 24, 132, 233, 20, 0)
    Global $SongAskSend = GUICtrlCreateButton("Absenden", 24, 155, 234, 25, 0)
    Global $pcbDownload = GUICtrlCreateProgress(24, 64, 233, 17)
    Global $infoLabel = GUICtrlCreateLabel("", 24, 84, 233, 25);, $SS_CENTER )
    Global $cmdButton = GUICtrlCreateButton("Start Download", 24, 103, 233, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    Global $FileList = GUICtrlCreateCombo("FileList", 24, 24, 233, 25)
    GUICtrlSetData(-1, $txt)
    GUISetState(@SW_SHOW)
    ;Variable für die derzeit Ausgewählte Datei
    Global $selectet
    ;Variable für die Dateiendung
    Global $mediaformat
    ;Speicherort
    Global $SaveFile, $Auswahl, $sText, $rc, $aSearchResult

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg(1); Erweiterte Messageabfrage einschalten
    Switch $nMsg[1]; Switch Message from HwnD
    Case $frmMain;Message von der Hauptgui
    Switch $nMsg[0];Switch GuiControls
    Case $GUI_EVENT_CLOSE
    Exit
    Case $cmdButton
    $SaveFile = FileSaveDialog("Datei Speichern...", @DesktopDir, "Musik (*." & $mediaformat & ")", 2, GUICtrlRead($FileList))
    If Not @error Then RunDownload()
    Case $FileList
    GUICtrlSetData($infoLabel, "")
    $id = StringLeft(GUICtrlRead($FileList), StringInStr(GUICtrlRead($FileList), "-") - 1)
    $selectet = $ServerUrl & $txtList[$id]
    InetGetSize($selectet)
    If @error Then
    GUICtrlSetState($cmdButton, $GUI_DISABLE)
    Else
    GUICtrlSetState($cmdButton, $GUI_ENABLE)
    EndIf
    $mediaformat = StringRight(GUICtrlRead($FileList), 3)
    Case $SongAskSend
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, "Hey, der neue Titel:" & GUICtrlRead($SongAskInput), $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If @error Then
    MsgBox(0, "Error!", "E-mail konnte nicht gesandt werden!")
    Else
    MsgBox(0, "Song Mail!", "Die E-mail wurde erfolgreich versand an:" & $ToAddress)
    EndIf
    Case $PlayButton
    SoundPlay($selectet)
    Case $Suche
    $aSearchResult = _Titelsuche(GUICtrlRead($File))
    If $aSearchResult[0] = 0 Then
    MsgBox(0, "Suche", "Es wurde nichts gefunden ")
    Else
    _GUICtrlListBox_BeginUpdate($hListBox)
    For $i = 1 To $aSearchResult[0]
    _GUICtrlListBox_AddString($hListBox, $aSearchResult[$i])
    Next
    _GUICtrlListBox_UpdateHScroll($hListBox)
    _GUICtrlListBox_EndUpdate($hListBox)
    _GUICtrlListBox_SetCurSel($hListBox, 0)
    GUISetState(@SW_SHOW, $hSuche)
    EndIf
    EndSwitch
    Case $hSuche;Message von der TrefferGui
    Switch $nMsg[0];Switch GuiControls
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $hSuche)
    _GUICtrlListBox_ResetContent($hListBox)
    Case $hAbbruch
    GUISetState(@SW_HIDE, $hSuche)
    _GUICtrlListBox_ResetContent($hListBox)
    Case $hOK
    $Auswahl = _GUICtrlListBox_GetText($hListBox, _GUICtrlListBox_GetCurSel($hListBox))
    For $i = 0 To _GUICtrlComboBox_GetCount($FileList)
    _GUICtrlComboBox_GetLBText($FileList, $i, $sText)
    If StringInStr($sText, $Auswahl, 0) > 0 Then _GUICtrlComboBox_SetCurSel($FileList, $i)
    Next
    GUICtrlSetData($infoLabel, "")
    $id = StringLeft(GUICtrlRead($FileList), StringInStr(GUICtrlRead($FileList), "-") - 1)
    $selectet = $ServerUrl & $txtList[$id]
    InetGetSize($selectet)
    If @error Then
    GUICtrlSetState($cmdButton, $GUI_DISABLE)
    Else
    GUICtrlSetState($cmdButton, $GUI_ENABLE)
    EndIf
    $mediaformat = StringRight(GUICtrlRead($FileList), 3)
    GUISetState(@SW_HIDE, $hSuche)
    _GUICtrlListBox_ResetContent($hListBox)
    EndSwitch
    EndSwitch
    WEnd
    Func _Titelsuche($sTitel)
    Local $aTempArray[1], $Count = 0
    $aTempArray[0] = 0
    For $i = 1 To $txtList[0]
    If StringInStr($txtList[$i], $sTitel, 0) > 0 Then
    _ArrayAdd($aTempArray, $txtList[$i])
    $Count += 1
    $aTempArray[0] = $Count
    EndIf
    Next
    Return $aTempArray
    EndFunc ;==>_Titelsuche
    Func RunDownload()
    Local $FileSize,$curFileSize, $curSize
    GUISetState(@SW_DISABLE)
    $FileSize = InetGetSize($selectet)
    InetGet($selectet, $SaveFile, 1, 1)
    $curSize = 0
    Do
    GUICtrlSetData($pcbDownload, $curSize)
    $curFileSize = FileGetSize($SaveFile)
    $curSize = $curFileSize * 100
    $curSize = $curSize / $FileSize
    $curSize = Ceiling($curSize)
    $curFileSize = Round($curFileSize / 1024 / 1024, 2)
    GUICtrlSetData($infoLabel, $curFileSize & " - " & Round($FileSize / 1024 / 1024, 2) & " MB (" & $curSize & "%)")
    Sleep(200)
    Until $curSize >= 99
    GUISetState(@SW_ENABLE)
    GUICtrlSetData($infoLabel, "Download beendet!!!")
    GUICtrlSetData($pcbDownload, 0)
    EndFunc ;==>RunDownload

    ;######### Der ganze Email Kram ###########
    Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance = "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
    $objEmail.HTMLBody = $as_Body
    Else
    $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
    Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
    For $x = 1 To $S_Files2Attach[0]
    $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
    ConsoleWrite('@@ Debug(62) : $S_Files2Attach = ' & $S_Files2Attach & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
    If FileExists($S_Files2Attach[$x]) Then
    $objEmail.AddAttachment($S_Files2Attach[$x])
    Else
    ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
    SetError(1)
    Return 0
    EndIf
    Next
    EndIf
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 Then $IPPort = 25
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
    Case "High"
    $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "High"
    Case "Normal"
    $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Normal"
    Case "Low"
    $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
    SetError(2)
    Return $oMyRet[1]
    EndIf
    $objEmail = ""
    EndFunc ;==>_INetSmtpMailCom
    ;
    ;
    ; Com Error Handler
    Func MyErrFunc()
    Local $HexNumber
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ConsoleWrite("### COM Error ! Number: " & $HexNumber & " ScriptLine: " & $oMyError.scriptline & " Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
    EndFunc ;==>MyErrFunc

    [/autoit]

    Das ist natürlich ein wenig sehr anders ^^

    Einfach mal um dir eine Anregung zu geben.

  • Nee das trifft es nicht ich wollte das eingeltich ganz einfach haben.
    So wie das hier z.B.

    [autoit]

    #include <GUIConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Opt("GUICloseOnESC", 0)
    MsgBox(48, "Download","Es werden 10 MB geladen. Dieser vorgang kann etwas dauern.")
    $vorher = 0
    $Refresh = 100 ;Zeit in Millisekunden wie oft das ganze refresht werden soll

    InetGet("http://m-wessa.bplaced.net/Gutscheine.pdf", "Gutscheine.pdf", 1, 1)
    While @InetGetActive
    $speed = ((@InetGetBytesRead - $vorher) / 1024) * (1000 / $Refresh)
    $vorher = @InetGetBytesRead
    TrayTip("Download der Datei", "MegaBytes = " & @InetGetBytesRead / 1024 &@CRLF&"Geschwindigkeit:" & $speed & " kb/s", 10, 16)
    Sleep($Refresh)
    Wend

    [/autoit][autoit][/autoit][autoit]

    MsgBox(48, "Download","Der Download war Erfolgreich, die Daten befinden sich nun auf ihrm PC.")

    [/autoit]
  • Achso

    Tut mir Leid!
    Wenn du das so löst, dann musst du aber für jede Datei ein Extra Skript schreiben.


    Könntest du mir einfach ein GUI schreiben wie es nachher aussehne soll?
    Ich werde dann mal versuchen etwas zu schreiben ;)

  • Wo bekomme ich die FTP.au3 her?
    ich habe den Code mal genommen von dir aber ich bekomme ne fehler meldung..

  • hast du die ftp.au3 runtergeladen und in den Inculdeordner kopiert? Der ist wenn du AutoIt standartmäsig instaliert hast unter "C:\Programme\AutoIt3\Include" wenn der Fehler immernoch kommt Poste doch mal die Fehlermeldung!

    EDIT: Benutz mal die Suchfunktion oder Google!

    mfg. Jam00

  • Diese Datei gibt es bei mir nicht(FTP.au3) der Link von dir oben geht nicht kommt nur ne fehler seite..

  • Ahja ok danke =)

    Welsche daten muss ich jetzt alles änderen damit ich auf mein NAS Syste zugreifen kann?
    Und warum ist da noch eine eMail Funktion dabei? oO

    Und was soll das sein? oO

    [autoit]

    Global $FileList = "files.txt"
    ;Notiz
    Global $Notice = "notice.txt"
    ;Speicherpfad für die Liste
    Global $SaveFileList = @TempDir & "\files.txt"
    ;Speicherpfad für die Notiz
    Global $SaveNotice = @TempDir & "\notice.txt"
    ;Textdatei laden

    [/autoit]
  • Filelist ist eine Datei, wo alles aufgelistet ist was ich auf meinem Server habe

    Und notice ist für dich uninteressant und auch die Email Funktion.

    Ich hatte keine Zeit alles groß rauszulöschen ^^

  • mmmmh Okey also diese daten brauch ich nicht iwie aufm Server liegen zu haben?!
    Also brauche ich eigenltich nur mein Server einzutragen also meine IP.: 192.168.0.8 beziehungsweiße die DNS IP oder!?

  • Hallo.

    Also ich habe eine Linkstation und die rufe ich über DynDNS auf (so ich sie angeschlatet habe).

    Wichtig ist das man nach meinem Wissen nicht die DNYDNS Adresse zur Linkstation vom selben Netzwerk aufrufen kann. Eigentlich auch sinnlos, da man ja sowieso einen direkten Zugriff hat. Haber ich habe schon öfters gelesen, das User/innen angeben, das sie auf Ihre DnyDNS Adresse nicht zugreifen können und es war fast immer der Grund, das sie am selben Netz waren und mit der DnyDNS Adresse die Verbindung testen wollten. Also das sollte man auf jeden Fall beachten.

    Dazu kommt, das einige auch für die Nutzung des "HomeServers" ein Login angeben müssen. Also bei mir wäre das ein Benutzername und ein Passwort und dazu muß ich noch die Login-Daten zuvor angeben und die/den User/in für die Ordner eintragen, auf die sie dann später zugreifen müssen. Auch hier sollte man sich vorher ausreichen schlau machen.

    Bei den o. g. Script sind keine Login-Daten (oder habe ichd as übersehn???) die man eintragen muß. Also dieses sollte dann nachträglich noch irgendwie an die richtige Stelle ins Script eingearbeitet werden.

    Also, soviel von meiner Seite zu diesem Thema.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Wichtig ist das man nach meinem Wissen nicht die DNYDNS Adresse zur Linkstation vom selben Netzwerk aufrufen kann. Eigentlich auch sinnlos, da man ja sowieso einen direkten Zugriff hat. Haber ich habe schon öfters gelesen, das User/innen angeben, das sie auf Ihre DnyDNS Adresse nicht zugreifen können und es war fast immer der Grund, das sie am selben Netz waren und mit der DnyDNS Adresse die Verbindung testen wollten. Also das sollte man auf jeden Fall beachten.


    So sinnlos finde ich das nicht! Schließlich erleichtert es das Testen eines FTP- oder Webservers ungemein.

    Leider ist die Aussage für die meisten wohl richtig, da viele Router kein (nat.) Loopback können und somit die Anfrage wieder auf dem Router (oder sonstwo ?( ) landet.
    Bei Routern mit (nat.) Loopback-Unterstützung funktionierts aber auch aus dem eigenen Netzwerk.

  • Hi,
    habe ich das richtig verstanden?
    Du betreibst einen FTP-Server, auf diesem sollen mehrere User Daten schreiben/lesen können.
    Ich habe das so gelöst, daß jeder User das Programm downloaden kann. Die für die einzelnen Konten notwendigen Zugangsdaten Username und Passwort bekommt der User dann per Mail. Nach dem erfolgreichen Connect zum Server bietet das Programm an, die Zugangsdaten zu speichern, so daß der nächste Login "automatisch" vorgenommen werden kann.

    Zitat

    Also brauche ich eigenltich nur mein Server einzutragen also meine IP.: 192.168.0.8 beziehungsweiße die DNS IP oder!?


    Bei Verwendung von Dyndns braucht man keine IP mehr, das ist der Sinn und Zweck der Geschichte!
    D.h. du connectest den Server von extern über den NAMEN z.B. ftp:\\user:passwort@dyndns.serv.ftp und der User ist sofort "online". Um den Server netzinternanzusprechen, solltest du über die von deinem Netz dem Server zugeordnete IP connecten. Es kommt auf dein Netzwerk und die Einstellungen an, mein Router z.B. leitet interne Anfragen an die DynDNS-Adresse sofort weiter, d.h. der connect "per Internet"(über die DynDNS-Adresse) funktioniert auch ohne bestehende Internetverbindung
    ciao
    Andy