#!/usr/bin/ruby =begin Author: Piotr Sowinski psow86 at gmail dot com http://sadi.ovh.org The MIT License Copyright (c) 2010 Piotr Sowinski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================== TODO: - wyczyszczenie kodu - pytanie o link - zapytanie przed usunieciem starego katalogu ============================== =end require 'thread' require 'monitor' def czas(poczatkowy) koncowy = Time.now g = ((koncowy - poczatkowy)/3600).floor m = ((koncowy - poczatkowy - 3600*g)/60).floor s = (koncowy - poczatkowy - 3600*g - 60*m).floor return g, m, s end def wybor_tn(pytanie) puts pytanie wczyt = gets.chomp while !(wczyt.downcase == 't' or wczyt.downcase == 'n') puts 'Zły wybór. Spróbuj jeszcze raz (t/n)' wczyt = gets.chomp end if wczyt == 't' wyjscie = true else wyjscie = false end wyjscie end def wybor_pliki(pytanie, sciezka) pliki = Dir[sciezka] pliki.sort! { |a, b| b <=> a } puts pytanie i = 1 pliki.each do |p| p.gsub!(/.*\//, '') puts "#{i.to_s}) #{p}" i += 1 end wczyt = gets.to_i while wczyt < 1 or wczyt > pliki.length puts "Zły wybór. Spróbuj jeszcze raz (przedział od 1 do #{pliki.length.to_s})" wczyt = gets.to_i end pliki[wczyt-1] end if ARGV.empty? or ARGV.length > 1 or ARGV[0] == '--help' or ARGV[0] == '-h' puts 'Sposób użycia skryptu:' puts 'Podaj wersję jadra, jako jedyny parametr, np.:' puts '$ ./kompiluj.rb 2.6.37' Thread.exit end if Process.uid != 0 puts 'Skrypt został uruchomiony z konta zwykłego użytkownika. Jeżeli nie masz skonfigurowanego sudo, to zalecane jest uruchomienie go z konta roota.' noroot = true fakeroot = ' --rootcmd=fakeroot' sudo = 'sudo ' end wersja = ARGV[0] ARGV.clear archiwum = "linux-#{wersja}.tar.xz" katalog = "linux-#{wersja}" sem = [] sem.extend(MonitorMixin) war = sem.new_cond sciaganie = Thread.new do if !Dir[katalog].empty? # jesli rozpakowany katalog juz istnieje to go usun system("rm #{katalog} -r") end # sciagnij plik i poczekaj z rozpakowaniem az sie sciagnie if katalog.scan(/linux-3.0/).empty? # umozliwia sciaganie zrodel jader 2.6 i 3.0 v = "v2.6" else v = "v3.0" end if wersja.scan(/rc/).empty? system("wget ftp://ftp.kernel.org/pub/linux/kernel/#{v}/linux-#{wersja}.tar.xz -c -q") else system("wget http://www.kernel.org/pub/linux/kernel/#{v}/testing/linux-#{wersja}.tar.xz -c -q") end system("tar xfa #{archiwum}") # rozpakuj archiwum sem.synchronize do sem.push 1 war.signal end end konfikomp = Thread.new do opcje = String.new naglowki = String.new # Wybór pliku konfiguracyjnego jako podstawy do dalszej konfiguracji w menuconfig konf = wybor_pliki('Na którym pliku konfiguracyjnym chcesz bazować? [zalecany najnowszy]', '/boot/config-*') # Wybór wersji kompilatora gcc = wybor_pliki('Której wersji kompilatora GCC chcesz użyć przy kompilacji? [zalecana najwyższa stabilna]', '/usr/bin/gcc-*') # Wybór, czy tworzyć initrd if wybor_tn('Utworzyć initrd dla kompilowanego jądra? (t/n) [zalecane]') opcje += ' --initrd' end # Rozbijanie kompilacji na kilka zadań (procesów) puts 'Na ile zadań rozbić kompilację? [zalecane 1,5x liczba rdzeni procesora]' wczyt = gets.chomp while wczyt.scan(/^\d+$/).empty? or wczyt.to_i < 1 or wczyt.to_i > 128 puts 'Zły wybór. Spróbuj jeszcze raz (liczba całkowita od 1 do 128)' wczyt = gets.chomp end opcje += " -j#{wczyt}" # Wybór, czy kompilować pliki nagłówkowe (headers) if wybor_tn 'Czy kompilować też pliki nagłówkowe jądra (t/n) [zalecane]' naglowki = ' kernel_headers' end # Podanie podwersji puts 'Jaką dodać podwersję? (człon dodawany za wersją jądra; można zostawić pustą)' podwersja = gets.chomp # Wybór, czy skrypt ma sam instalować jądro inst = wybor_tn 'Czy po kompilacji zainstalować jądro? (t/n)' # Wybór, czy usuwać pliki intalacyjne czyscic_rozpak = wybor_tn 'Czy na koniec usunąć zbędne pliki? (t/n) [zalecane]' # Wybór, czy usunąć spakowane pliki źródłowe jądra czyscic_spak = wybor_tn 'Czy na koniec usunąć pobrane archiwum jądra? (t/n)' # Czekanie (jeśli trzeba) na rozpakowanie archiwum jądra sem.synchronize do if sem.empty? puts 'Trwa ściąganie lub rozpakowywanie archiwum...' end war.wait_while { sem.empty? } end # Skopiowanie wybranego pliku konfiguracyjnego i uruchomienie menuconfig system("cp /boot/#{konf} #{katalog}") system("mv #{katalog}/#{konf} #{katalog}/.config") system("cd #{katalog} && make menuconfig") if wybor_tn 'Rozpocząć teraz kompilację? (t - rozpoczyna kompilację, n - wychodzi z programu)' zmierz = Time.new system("cd #{katalog} && make-kpkg clean") system("cd #{katalog} && MAKEFLAGS=\"CC=#{gcc} HOSTCC=#{gcc}\" make-kpkg#{fakeroot} --append_to_version '#{podwersja}'#{opcje} kernel_image#{naglowki}") pomiar = czas(zmierz) if inst pliki_deb = Dir["*#{wersja}#{podwersja}*.deb"] pliki_deb.each do |plik| system("#{sudo}dpkg -i #{plik}") end if !naglowki.empty? system("cd /usr/src && #{sudo}ln -s linux-headers-#{wersja}#{podwersja} linux-#{wersja}#{podwersja}") end end puts 'Zakończono kompilację. Trzymam kciuki za brak Kernel Panic!' puts "Kompilacja trwała #{pomiar[0]} godzin, #{pomiar[1]} minut i #{pomiar[2]} sekund." else puts 'Zrezygnowano z kompilacji.' end if czyscic_rozpak system("rm #{katalog} -r") end if czyscic_spak system("rm #{archiwum}") end end #sciaganie.join konfikomp.join