21 Aralık 2013 Cumartesi

Online Installer Yapımı | Anlatım


Online Installer, Türkçe'ye Çevrim içi Yükleyici olarak çevirebiliriz. Peki nedir bu Online Installer? Katılımsız kurulumu yaparken ya da üreticilerin yayınladıkları programları kurarken standalone/offline(çevrim dışı) yani tüm gerekli bileşenlere sahip elimizde var olan bir dosyayı kurduruyoruz. Çevrim içi yükleyici ise dosyayı belirlediğimiz bir indirme adresinden çeken daha sonra yüklemeyi başlatan yükleyicidir. Normal yüklemeden tek temel farkı da budur aslında. Daha da geliştirmek istersek sürüm denetimi yaptırabiliriz. Programına göre sadece güncellemesini indirtebiliriz. vs. Gerisi sizin hayal gücünüze ve bilginize kalmış.
Bu tür çalışmalar yapmaya başladıktan sonra nasıl yapıldığına dair bazı istekler oldu. Şimdi tüm ayrıntılarını tamamen dökmeyeceğim ama yeterince olgunlaştığını düşündüğüm bazı fonksiyonları paylaşacağım. Geliştirmeye devam ettiğim bir konu. Yeterince uygun hale geldiğinde tamamını paylaşmayı düşünüyorum.
Online Installer için bazı ufak sıkıntılara da değineyim. ilk olarak indirme adresi sabit değilse değiştiğinde güncelleyecek bir sistem oluşturmak lazım. Bazı programlar nev-i şahsına münhasır özelliklere sahip olduğundan çok farklı kodlamalar gerekebiliyor. indirme adresini siteden çekerken site kodlaması değiştiğinde bu sorun ortaya çıkıyor. Diğer bir konu bazı programlar doğrudan indirilmeye müsait olmuyor. Hotlink(doğrudan bağlantı) yoksa başka bir kaynak aramak lazım. (K-Lite Codec Pack gibi) bununla paralel başka bir sorun dosyalar ziplenmiş olarak yayınlanıyorsa dosyaları çıkarmak için ek işlemler gerekebiliyor. Kısacası her program için yazılan kodlar kendine özgüdür. Sadece belli noktaları ortak olabilir. İlk başlayacağımız konuda bu ortak noktalardan biri İndirme fonksiyonu. Neyse fazla uzatmadan kodları vereyim. Devamı zamanla eklenecek.(Siteden sürüm numarası indirme adresi vs. bilgileri çekmek, Sürüm Denetimi, Kendini Güncelleme gibi konular)
Download() Fonksiyonu
Kodların başına şu kütüphaneleri eklemeniz gerekiyor.
;Libraries - Kütüphaneler
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
;Constants - Sabitler
$title = "Internet Download Manager"
;İndirme Adresi
$downloadurl="http://mirror2.internetdownloadmanager.com/idman618.exe"
;İndirme konumu ve dosya adını belirleyelim.(Burada mevcut dizine setup.exe olarak)
$downloadlocation=@ScriptDir&"\Setup.exe"

;Fonsiyonu çağıralım.
Download($downloadurl, $downloadlocation)

;Dosya İndirme Fonksiyonu
Func Download($address, $dest)
 $gui = GUICreate($title, 300, 70,-1,-1,$WS_CAPTION,$WS_EX_TOOLWINDOW)
 $blabel = GUICtrlCreateLabel("Dosya İndiriliyor...",50,10,250,20)
 $icon = GUICtrlCreateIcon(@ScriptDir&"\download.ico",-1, 2, 11, 48, 48)
 $gprogress = GUICtrlCreateProgress(50,27,180,20)
 $close = GUICtrlCreateButton("İptal", 242, 25, 50, 25, BitOR($BS_FLAT,$BS_ICON))
 GUICtrlSetTip(-1,"İndirmeyi durdurur ve uygulamayı kapatır.","İndirmeyi İptal Et",2)
 $glabel = GUICtrlCreateLabel("İndirme Başlıyor...",50,52,250,20)

 GUISetState(@SW_SHOW)
 ;Pencere sürekli en üstte olsun
 WinSetOnTop($title,"", 1)

 Local $downloaded = 0
 Local $hDownload = InetGet($address,$dest,1,1)

 Do
  $msg = GUIGetMsg()
  Select
   Case $msg = 0
    Local $aData = InetGetInfo($hDownload)
    $nsize = Round($aData[0]/1048576,2)
    $ntotal = Round($aData[1]/1048576,2)
    ;Altta son kısımda 2 ile çarpıyoruz çünkü 500 ms bekliyor ve 1 sn(1000 ms) deki değeri alacağız.
    $dspeed = AutoSizeFormat(($aData[0]-$downloaded)*2)
    $downloaded = $aData[0]
    GUICtrlSetData($gprogress,Round($nsize*100/$ntotal,2))
    If $aData[0] <> "" Then
     GUICtrlSetData($glabel,"%"&Round($nsize*100/$ntotal, 0)&" Tamamlandı - "&$nsize&"/"&$ntotal&" MB ("&$dspeed&")")
    EndIf
    ;Döngüdeyken işlemciyi yormamak ve değişimi aşırı sık güncellememek için biraz bekletelim.
    Sleep(500)
   Case $msg = $close
    InetClose($hDownload)
    GUIDelete($gui)
    FileDelete($dest)
    TraySetState(1)
    TrayTip($title, "İndirme işleminden vazgeçildi.", 5, 4)
    Sleep(5000)
    Exit
  EndSelect
 ;İndirme bitene kadar döngüyü sürdür.
 Until InetGetInfo($hDownload,2)
 GUICtrlSetData($gprogress, 100)
 InetClose($hDownload)
 ;Bitiş anınıda göstermek için biraz bekleyelim. Şart değil.
 Sleep(500)
 GUIDelete($gui)
EndFunc

;Byte olarak gelen değeri daha düzenli bir şekle çeviriyoruz.
Func AutoSizeFormat($size)
 If $size<1024 Then
  $size = $size&" Byte/sn"
 ElseIf $size>1024 AND $size<1024 * 1024 Then
  $size = (Round($size / 1024, 2)&" KB/sn")
 ElseIf $size>1024 * 1024 AND $size<1024 * 1024 * 1024 Then
  $size = (Round($size / 1024 / 1024, 2)&" MB/sn")
 ElseIf $size>1024 * 1024 * 1024 AND $size<1024 * 1024 * 1024 * 1024 Then
  $size = (Round($size / 1024 / 1024 / 1024, 2)&" GB/sn")
 EndIf
 Return $size
EndFunc
Bilgi Çekme Fonksiyonu
Online Installer için önemli bir başka konu da sürüm denetimi. Programın üreticisinin sitesinden programın sürüm bilgisi indirme bağlantısı vs. gibi bilgileri çekmek gerekir ki mevcut sistemdeki sürüm bilgisini aldıktan sonra karşılaştırma yapabilelim. Ve sonuca göre indirme durumunu belirleyelim. Kendi sitesi olması şart değil yayınlanan başka bir yerde olabilir ama en sağlıklısı kendi sitesi. Yeni vereceğim fonksiyonlar GETINFO() ve CheckVersions(). Ben fonksiyonlara ingilizce isim vermekten yanayım siz değiştirebilirsiniz. Neyse fazla uzatmadan işleyişini anlatayım. Sürüm bilgisinin veya indirme bağlantısının bulunduğu web sayfasını metin olarak indiriyoruz. Bu metinden işimize yarayacak kısımları(sürüm numarası indirme bağlantısı vs.)alıyoruz. Diğer taraftan sistemde yüklü programın sürüm bilgisini alıyoruz.(dosyadan yada kayıt defterinden). Aldığımız sürüm değerlerini karşılaştırıyoruz. Farklı ise yeni bir sürüm vardır indirelim, aynı ise zaten son sürüm kurulu indirmeye gerek yok. Önemli bir konudan daha bahsedeyim. Bilgiyi çekeceğimiz web sayfası programa göre değişeceğinden fonksiyonu çağırırken göndereceğimiz veri de değişecek. Programa özel işlem yaptırıyoruz başka bir deyişle. web site düzeni değişirse gönderilen veri de değişir. bunu unutmayın o yüzden gerektiğinde düzenleme yapmak gerekebilir. Fonksiyonlara geçelim.
Siteden işaretlediğim kısmı istiyoruz. Sayfaya sağ tıklayıp "Kaynağı Göster" diyelim ve html kodlarından bu kısmı bulalım. Kırmızı ile işaretlediğim kısmı nasıl alırız?
Sürüm bilgisinin fonksiyonu çağırmadan belirlediğimiz $fs ve $ls sabitleri arasında olduğuna dikkat edin. Fonksiyona istediğimiz kısmın öncesinden ve sonrasından bir kesit($fs ve $ls) gönderiyoruz o da bize arasını gönderiyor.
GETINFO() Fonksiyonu
;Sabitler - Örneğimiz Notepad++
$title = "Notepad++"
$verurl = "http://notepad-plus-plus.org/download"
$fs = "<title>Notepad++ v"
$ls = " - Current Version"
$repeat = 0
$fstart = 1
;Siteyi okuyalım. "binary" olarak okuyacak ama sonra "string" olarak çevireceğiz.
$read = BinaryToString(InetRead($verurl,1),4)

;İstediğimiz değer fonksiyondan dönecek. siteyi okuyup sürümü gönderecek.
$version = GetINFO($read, $fs, $ls,$repeat,$fstart)
;Aldığımız sürüm bilgisini karşılaştıralım.
CheckVersion($title,$version)

;StringRegExp() komutu ile belki daha kolay alınabilir ama daha bu komutu çözemedim.
Func GetINFO($read, $fstring, $lstring, $repeat,$stringfstart)
 For $i=0 To $repeat
  $stringfstart = StringInStr($read,$fstring,0,1,$stringfstart+1)
 Next
 $stringlstart = StringInStr($read,$lstring,0,1,$stringfstart)
 $nsc = $stringlstart-$stringfstart
 $sfl = StringLen($fstring)
 ;istenilen bilgiyi ayıklayıp gönderiyoruz.
 Return StringMid($read,$stringfstart+$sfl,$nsc-$sfl)
EndFunc

Sürüm Karşılaştırma Fonksiyonu
ilk olarak sistemden sürüm bilgisini çekelim. Bu program için Kayıt Defterinden çekeceğiz. Dosya üzerinden de çekebiliriz. FileGetVersion() komutu ile. x86 ve x64 sisteme göre işlemler farklılık gösterebilir.
CheckVersion() Fonksiyonu
Func CheckVersion($title,$vers)
 If @OSArch = "X64" Then
  $currentversion=RegRead("HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Notepad++","DisplayVersion")
 Else
  $currentversion=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Notepad++","DisplayVersion")
 EndIf
;Sürüm aynı ise bilgi verip kapatıyoruz, farklı ise fonksiyondan çıkar.
 If $vers = $currentversion Then
  MsgBox(64,$title,"Son sürümü kullanıyorsunuz!")
  Exit
 EndIf
EndFunc
Boyut: 4 KB | MD5: C81605A3DBC28E6EA4F95B2ABE985357
Fonksiyon Script Dosyaları
Mesenger Windows Live Facebook Twitter MySpace E-Posta

Hiç yorum yok:

Yorum Gönder

Yorum yazarken düzgün bir Türkçe kullanmaya özen gösteriniz.
Sorularınızı ilgili konuda ya da İletişim kısmından sorunuz.