[PHP] Automatisch updaten

  • Goedenavond,


    Ik ben voor een persoonlijk project bezig om een op afstand te beheren updater te maken, hiermee kan de gebruiker een controle doen op een versie nummer.


    Korte uitleg:
    Ik wil het voor gebruikers mogelijk maken op afstand te kunnen updaten zonder hiervoor hun account te benaderen. De code moet dus met één klik volledig bijgewerkt worden naar een nieuwe versie die door ons aangeleverd wordt.


    Waar lijkt het op:
    WordPress heeft een soort gelijke functie als je een controle doet op de core updater, zoiets wil ik dus ook maken maar dan voor eigen code.


    Kent iemand, of weet iemand soort gelijke code, mag betaalde code zijn mits ik wel volledig toegang heb tot de code ervan om het uit te lezen. Wil de veiligheid ervan kunnen garanderen dus encoded versies accepteer ik niet voor gebruik.

  • Goedenavond MiCa-,


    Het is niet de bedoeling dat deze updates openbaar of via andere bronnen gaan, we houden de updates binnen eigen bron omdat het een om een gesloten directory gaat die alleen via het bestand bereikbaar is.


    Edit:
    Mogelijk dat ik het zelf toch maar ga schrijven, heb de versie nummer controle momenteel al draaien.
    Nu moet ik eigenlijk alleen het update gedeelte nog schrijven welke het bestand toegang geeft tot onze downloads directory.


    De directory is voor de rest afgesloten en onbereikbaar, alleen het upgrade bestand (welke met ioncube encode gegeven wordt) zal automatisch controleren. Indien een update beschikbaar is kan de gebruiker zelf op elk gewenst moment een update uitvoeren.


    Edit:
    Het is inmiddels al gelukt, moet alleen de beveiliging ervan op orde zetten.

  • Ik deel de code liever niet maar kan wel erop in gaan hoe ik de beveiliging precies gedaan heb, onthoud dat de upgrade bestand in mijn geval dus encoded is en niet uitgelezen kan worden.


    Stap 1:
    Ik heb met de file_get_contents() functie een POST uitgevoerd op een bestand die op eigen server aanwezig is. In dit bestand stuur ik login gegevens en de gewenste versie die gedownload zal worden.


    Voorbeeld code:


    Stap 2:
    Nu heb ik op eigen server een bestand genaamt "download.php" dit wordt aangeroepen in stap 1. Via de $postdata variable heb ik login gegevens gestuurd die controleert of de aanvraag geldig is gedaan via eigen bestand. Ik weet immers als enigste wat de login gegevens hiervan zijn aangezien die door mij ook ingestelt zijn.


    Hier controleer ik simpelweg of de POST waarde overeenkomt, dus klopt de username/password combinatie met wat ingesteld is.



    Stap 3:
    Wanneer alles klopt kan ik een bestand aanroepen buiten de publieke map, ik wil namelijk niet dat iedereen zomaar toegang heeft tot die bestanden. Omdat ik deze bestanden zelf bijwerk kan ik dus ook als enigste de versies vrij geven.




    Korte samenvatting is eigenlijk dat het toch iets makkelijker voor me was dan ik in eerste instantie dacht, ik heb deze code in vrije tijd gemaakt dus mijn late reactie is omdat ik na me eigen werk hier pas aan verder kan werken.


    Hopelijk heeft iemand er nog iets aan, mochten jullie vragen hebben hoor ik dit graag :)

  • Wellicht is het toch verstandiger om een Version Control System te gebruiken, je hebt dan namelijk ook een historie van vorige versies en wijzigingen. Mocht er dan onverhoopt iets fout gaan als je je code pusht kun je weer terug naar een vorige versie.


    Waarschijnlijk/hopelijk heb je daarnaast al allerlei voorzieningen getroffen die de kans op problemen minimaliseren:
    - continuous integration (push vaak (kleine) wijzigigen in plaats van af en toe mega-updates)
    - backwards compatible ontwikkelen (alle code die je schrijft conflicteert niet met bestaande code maar is (bij voorkeur) backwards compatible)
    - ontwikkel- en testomgeving benaderen zo goed mogelijk de productie-omgeving (platform, versies van gebruikte technologieën et cetera)


    @MiCa- interessant idee, maar ik weet niet of het handig is dat wijzigingen automatisch gepusht worden naar live; zelfs al heb je hiervoor een aparte (master) branch, mogelijk moet je voordat je iets live zet toch al dingen handmatig regelen, dus het moment dat updates binnen komen wil je wellicht zelf bepalen. Daarnaast is er na afloop (als het goed is) ook een zekere controle of alles goed is overgekomen. Het zou niet echt een goed idee zijn om je wijzigingen te committen en er dan maar vanuit te gaan dat alles goed staat op productie :s.

  • @FangorN
    Ik heb zelf een selectief groepje mensen waar ik het vooraf bij ga testen alvorens deze als een live productie gegeven wordt. Heb in het verleden deze fout al eens eerder gemaakt dus heb hiervoor wel de voorzorgsmaatregelen genomen.


    Het betreft hier een module op een bestaand systeem (WHMCS), ik ben dus vrij snel op de hoogte mocht er iets wijzigen. Heb zelf een speciale developers licentie waarbij ik eerst de nieuwe versie kan testen met de huidige code.


    De downloads worden inderdaad wel gecontroleerd, ik heb een aparte controle gemaakt die precies ziet welke versie de licentie houder draait.


    Edit:
    @J.Rijdes
    Geen verklaring voor eerlijk gezegd, had het inderdaad met cURL op kunnen lossen. Denk dat ik de code toch maar om ga zetten in cURL, file_get_contents was toen het eerste wat in me op kwam.


    Edit:
    @Ferhat.Remory
    Niet alleen sneller, cURL heeft vele voordelen zover ik weet.

  • Zojuist alles omgezet in cURL, hierbij heb ik een extra beschermlaag geplaatst op de download.


    1. Een aanvraag kan alleen door geldige licentie houders opgevraagd worden.
    2. De update staat buiten de publieke map en is dus alleen via mijn bestand op te vragen.
    3. Alle geldige licentie sleutels staan in de database opgeslagen die worden vergelijkt voor download.


    Hebben jullie nog tips, laat het zeker weten :)

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!