2016-11-04 18:11:08 +01:00
#!/usr/bin/python3
# Milis Linux Konsol Kurulum Betiği
# Dialog manuali için: http://pythondialog.sourceforge.net/doc/
import os , sys , re , subprocess , time
## For legacy isos.
os . system ( " mps -GG " )
if os . path . exists ( " /usr/bin/pip3 " ) is False :
os . system ( " mps -G " )
time . sleep ( 3 )
os . system ( " mps kur python3-pip && pip3 install pythondialog " )
if os . path . exists ( " /usr/bin/acp " ) is False :
os . system ( " mps -G " )
time . sleep ( 3 )
os . system ( " mps kur advcp " )
#lsb-release tamiri
time . sleep ( 3 )
os . system ( " mps -sz lsb-release && mps -ik lsb-release " )
from dialog import Dialog
d = Dialog ( dialog = " dialog " )
log = open ( " /tmp/kurulum.log " , " w " )
def runShellCommand ( c ) :
out = subprocess . check_output ( c , stderr = subprocess . STDOUT , shell = True , universal_newlines = True )
return out . replace ( " \b " , " " ) #encode byte format to string, ugly hack
2016-11-09 23:23:33 +01:00
def isEFI ( ) :
return os . path . isdir ( " /sys/firmware/efi " )
2016-11-04 18:11:08 +01:00
def greetingDialog ( ) :
greeting = """
Milis GNU / Linux kurulum aracı Milis ' i bilgisayarı nı za güvenli bir şekilde kurmanı zı sağlamak amacı yla geliştirilmiş basit bir kurulum aracı dı r.
Bu araç sayesinde disklerinizi bölümlendirebilir , sistemi kuracağı nı z ve takas alanı için kullanacağı nı z disk bölümünü seçebilir , kullanı cı oluşturma ve diğer bazı sistem ayarları nı yapabilirsiniz .
Deneyimsiz kullanı cı lar için kuruluma başlamadan önce https : / / milis . gungre . ch / kurulum . html adresine bakmaları nı öneririz .
Kuruluma devam etmek istiyor musunuz ?
"""
status = d . yesno ( title = " Milis GNU/Linux kurulum aracı na hoş geldiniz ! " , text = greeting , width = 70 , height = 22 )
if status == " ok " :
checkUsername ( )
else :
sys . exit ( )
def checkUsername ( ) :
#status ok ya da cancel gibi durumları çekiyor.
status , username = d . inputbox ( title = " Adı m 1: Kullanı cı İşlemleri " , text = " Sistemi daha güvenli ve sağlı klı bir şekilde kullanabilmeniz açı sı ndan normal bir kullanı cı hesabı na ihtiyacı nı z vardı r ve bu zorunlu bir adı mdı r. \n \n \
Bu kullanı cı güvenlik nedeniyle bazı işlemler için kı sı tlı yetkilere sahiptir fakat bunu gerektiğinde \' sudo <komut_adi> \' komutuyla yükseltebilirsiniz. \n \n Sudo komutu sizden \
her oturum için bir kereye mahsus olarak kullanı cı şifrenizi ister . Bu yüzden kullanı cı şifreniz güçlü ama akı lda kalı cı olmalı dı r ve bunu paylaşmamalı sı nı z . Daha fazla bilgi için manual dosyaları na bakabilirsiniz . \n \n \
Lütfen kullanı cı adı giriniz : " ,width=70,height=22)
#NAME_REGEX bkz. man 5 adduser.conf
2016-11-05 17:03:13 +01:00
if re . compile ( r ' ^[a-z][-a-z0-9]*$ ' ) . match ( username ) :
2016-11-04 18:11:08 +01:00
checkUserPassword ( username )
else :
status = d . msgbox ( title = " Hata ! " , text = " \n Hatalı kullanı cı adı girdiniz. \n \n \
Kullanı cı adları alfanümerik karakterle başlamalı dı r ve alfanümerik ( a - z ) , nümerik ( 0 - 9 ) ve tire ( - ) \
harici bir karakter içermemelidir . " ,width=70,height=13)
if status == " ok " :
checkUsername ( )
def createUser ( name , username , password ) :
2016-11-05 17:03:13 +01:00
status , name = d . inputbox ( title = " Adı m 1: Kullanı cı İşlemleri " , text = " Kullanı cı ' nı n adı nı giriniz. Eğer kullanı cı nı n adı nı girmek istemiyorsanı z, basitçe boş bı rakı n. " , width = 70 )
os . system ( " kopar ' " + name + " ' " + username )
2016-11-04 18:11:08 +01:00
os . system ( ' echo -e " ' + password + ' \n ' + password + ' " | passwd ' + username )
os . system ( ' cp -r /root/.config /home/ {} ' . format ( username ) )
2016-11-05 17:03:13 +01:00
os . system ( ' cp /root/.xinitrc /home/ {} ' . format ( username ) )
2016-11-04 18:11:08 +01:00
def checkUserPassword ( username ) :
#insecure=True parolanı n yı ldı z şeklinde gözükmesini sağlar,
#root şifresi sorarken belki bunu silebiliriz normal sudo şifresi
#girer gibi gözükmez.
status , password = d . passwordbox ( title = " Adı m 1: Kullanı cı İşlemleri " , text = " Lütfen {} kullanı cı sı için şifrenizi giriniz. \n \n " . format ( username ) , insecure = True , width = 70 , height = 10 )
if len ( password ) > 0 :
createUser ( username , username , password )
log . write ( " [+] Kullanı cı eklendi: {} \n \n " . format ( username ) )
if d . yesno ( title = " Adı m 1: Kullanı cı İşlemleri " , text = " {} kullanı cı sı başarı yla eklendi. \n \n Yeni kullanı cı eklemek istiyor musunuz ? " . format ( username ) , width = 70 , height = 10 ) == " ok " :
checkUsername ( )
else :
2016-11-05 17:03:13 +01:00
chRootPass ( )
2016-11-04 18:11:08 +01:00
else :
2016-11-05 17:03:13 +01:00
status = d . msgbox ( title = " Hata ! " , text = " Şifreniz boş olamaz " )
2016-11-04 18:11:08 +01:00
checkUserPassword ( username )
2016-11-05 17:03:13 +01:00
def chRootPass ( ) :
status , password = d . passwordbox ( title = " Adı m 1: Kullanı cı İşlemleri " , text = " Lütfen root kullanı cı sı için şifrenizi giriniz. Şifre ekranda görünmeyecektir. \n \n " , insecure = False , width = 70 , height = 10 )
if len ( password ) > 0 :
os . system ( ' echo -e " ' + password + ' \n ' + password + ' " | passwd root ' )
chooseDisk ( )
else :
status = d . msgbox ( title = " Hata ! " , text = " Şifreniz boş olamaz " )
2016-11-04 18:11:08 +01:00
def chooseDisk ( ) :
diskChoice = [ ]
diskNames = runShellCommand ( " lsblk -nS -o NAME " ) . split ( ' \n ' )
diskModels = runShellCommand ( " lsblk -nS -o MODEL " ) . split ( ' \n ' )
for i in range ( len ( diskNames ) ) :
diskChoice . append ( ( diskNames [ i ] , diskModels [ i ] ) )
log . write ( " Sistemdeki diskler: \n " )
for disq in diskChoice :
log . write ( " {} \t {} \n " . format ( disq [ 0 ] , disq [ 1 ] ) )
status , selectedDisk = d . menu ( title = " Adı m 2: Disk İşlemleri " , text = " Lütfen bölümleme yapmak istediğiniz diski seçiniz: " , choices = diskChoice , width = 70 )
log . write ( " \n [+] Seçilmiş Disk: {} \n \n " . format ( selectedDisk ) )
2016-11-09 23:23:33 +01:00
if isEFI ( ) :
2016-11-09 23:38:13 +01:00
d . msgbox ( title = " Uyarı ! " , text = " (U)EFI kullanan bir sistem kullanı yorsunuz. \n \n \
2016-11-09 23:23:33 +01:00
Kurulum aracı mı z ( U ) EFI desteklemekle birlikte henüz deneysel bir özelliktir ve kurulum \
sonrası yaşanacak veri kayı pları ndan kullanı cı sorumludur . \
Eğer sisteminizde hali hazı rda EFI kullanan başka bir işletim sistemi varsa muhtemelen \
diski GPT olarak bölümlemenize ve EFI bölümünü elle oluşturmanı za gerek kalmayacaktı r . \
Eğer sanal makinaya ya da boş bir diske kuruyorsanı z ve ne yapacağı nı zı bilmiyorsanı z \
2016-11-10 00:15:51 +01:00
https : / / milis . gungre . ch / efikurulum . html adresindeki makaleye göz atı nı z . " ,width=70,height=22)
2016-11-04 18:11:08 +01:00
os . system ( " cfdisk /dev/ " + selectedDisk )
choosePart ( )
2016-11-09 23:23:33 +01:00
2016-11-04 18:11:08 +01:00
def choosePart ( ) :
partChoice = [ ]
validParts = [ ' sd ' , ' hd ' , ' mmcblk0p ' ]
#Şimdilik Parted kütüphanesine gerek kalmadı , lsblk istediğimiz bütün değerleri alı yor.
diskParts = runShellCommand ( " lsblk -ln -o NAME | awk ' { print $1} ' " ) . split ( ' \n ' )
partSizes = runShellCommand ( " lsblk -ln -o SIZE | awk ' { print $1} ' " ) . split ( ' \n ' )
partFs = runShellCommand ( " lsblk -ln -o FSTYPE | awk ' { print $1} ' " ) . split ( ' \n ' )
partMajmin = runShellCommand ( " lsblk -ln -o MAJ:MIN | awk ' { print $1} ' " ) . split ( ' \n ' )
partLabel = runShellCommand ( " lsblk -ln -o LABEL " ) . split ( ' \n ' ) #Bunda awk yok çünkü arada boşluk olabilir.
for i in range ( len ( diskParts ) - 1 ) :
if partMajmin [ i ] . split ( " : " ) [ 1 ] != " 0 " : # partition olmayanları ele (sda/sdb seçince grub bozuluyor.)
for validPart in validParts :
if validPart in diskParts [ i ] :
partChoice . append ( ( diskParts [ i ] , partLabel [ i ] + " \t " + partSizes [ i ] + " \t " + partFs [ i ] ) )
log . write ( " Sistemdeki disk bölümleri: \n " )
for disqPart in partChoice :
log . write ( " {} {} \n " . format ( disqPart [ 0 ] , disqPart [ 1 ] ) )
status , selectedPart = d . menu ( title = " Adı m 2: Disk İşlemleri " , text = " Sistemin kurulacağı diski seçiniz: " , choices = partChoice , width = 70 )
if status == " ok " :
log . write ( " [+] Seçilen disk bölümü: {} \n " . format ( selectedPart ) )
formatDialog ( selectedPart )
def formatDialog ( part ) :
status = d . yesno ( title = " Uyarı ! " ,
text = " /dev/ {} bölümü ext4 türünde formatlanacak. Emin misiniz ? " . format ( part ) , width = 70 )
if status == " ok " :
d . infobox ( text = " Formatlanı yor... Lütfen bekleyiniz... " )
formatPart ( part )
else :
choosePart ( )
def formatPart ( part ) :
2016-11-05 17:03:13 +01:00
target = " /dev/ {} " . format ( part )
os . system ( " umount {} " . format ( target ) )
os . system ( " mkfs.ext4 {} " . format ( target ) )
2016-11-04 18:11:08 +01:00
log . write ( " Disk bölümü formatlandı : {} \n " . format ( part ) )
d . infobox ( text = " /dev/ {} Disk Formatlandı " . format ( part ) )
status = d . yesno ( title = " Adı m 2: Disk İşlemleri " , text = " Takas alanı (Swap) bellekteki (RAM) sabit disk üzerinde işletim sistemi tarafı ndan ayrı lmı ş bir bölümdür. \
İşlenecek veriler RAM ' e sı ğmadı ğı zaman bu bölüm RAM gibi kullanı lı r ve böylece işlemlerin devam etmesi sağlanı r. \
Sabit disklerin veri okuma / yazma hı zları RAM ' lerden çok daha düşük olduğu için takas alanı nı n kullanı lması işlemleri yavaşlatabilir. \n \n \
Düşük belleğe sahip bilgisayarlar için önerilir . Eğer diskinizde bu amaç için hali hazı rda 1 GB kadar yer ayı rdı ysanı z Evet ' i aksi takdirde Hayı r ' ı seçiniz . " .format(part),width=70,height=15)
if status == " ok " :
chooseSwap ( part )
2016-11-05 17:03:13 +01:00
mountTarget ( target )
2016-11-04 18:11:08 +01:00
2016-11-05 17:03:13 +01:00
def mountTarget ( target ) :
os . system ( " mount " + target + " /mnt " )
2016-11-04 18:11:08 +01:00
log . write ( ' [+] Hedef mount edildi. ' )
2016-11-05 17:03:13 +01:00
applySettings ( )
2016-11-05 17:37:12 +01:00
d . infobox ( title = " Adı m 4: Dosya kopyalama " , text = " Hedef disk sorunsuzca bağlandı . Şimdi dosyalar kopyalanacak !! " , width = 70 )
time . sleep ( 3 )
2016-11-05 17:03:13 +01:00
copySystemFiles ( target )
def applySettings ( ) :
2016-11-05 17:37:12 +01:00
status , hostname = d . inputbox ( title = " Adı m 3: Konfigürasyonlar " , text = " Hostname ' i bilgisayar adı olarak düşünebilirsiniz. Bu ismi ağ cihazları nda ya da konsolda çalı şı rken görebilirsiniz. Lütfen hostname giriniz: " , width = 70 )
2016-11-05 17:03:13 +01:00
os . system ( " echo ' {} ' > /etc/hostname " . format ( hostname ) )
2016-11-04 18:11:08 +01:00
2016-11-05 17:03:13 +01:00
def copySystemFiles ( target ) :
2016-11-04 18:11:08 +01:00
os . system ( " clear " )
os . system ( " acp -gaxnu / /mnt " )
log . write ( ' [+] Dosyalar kopyalandı . \n ' )
2016-11-05 17:03:13 +01:00
initramfsCreate ( target )
2016-11-04 18:11:08 +01:00
2016-11-05 17:03:13 +01:00
def initramfsCreate ( target ) :
2016-11-04 18:11:08 +01:00
os . system ( ' chroot /mnt dracut --no-hostonly --add-drivers " ahci " -f /boot/initramfs ' )
log . write ( ' [+] Initramfs oluşturuldu. ' )
2016-11-09 23:52:09 +01:00
2016-11-04 18:11:08 +01:00
if d . yesno ( title = " Adı m 4: Önyükleyici kurulumu " , text = " GNU/GRUB, Linux ve Windows gibi diğer işletim sistemlerini yüklemek için kullanı lan bir önyükleyicidir. Bu Milis ' i açabilmek için gerekli bir adı mdı r \
fakat ne yaptı ğı nı zı biliyorsanı z bir nedenden ötürü grub kurmak istemeyebilirsiniz . \n \n Grub önyükleyiciyi kurmak istiyor musunuz ? " ,width=70) == " ok " :
2016-11-05 17:03:13 +01:00
installGrub ( target )
2016-11-04 18:11:08 +01:00
else :
2016-11-05 17:03:13 +01:00
finishInstall ( )
2016-11-04 18:11:08 +01:00
2016-11-09 23:23:33 +01:00
def mountEFIPart ( ) :
partTypes = runShellCommand ( " fdisk -lo device,type | awk ' !/^($|I|D|U|S|A|T)/ { print $2} ' " ) . split ( ' \n ' )
partNames = runShellCommand ( " fdisk -lo device,type | awk ' !/^($|I|D|U|S|A|T)/ { print $1} ' " ) . split ( ' \n ' )
try :
efipart = partNames [ partTypes . index ( ' EFI ' ) ]
os . system ( " mount {} /mnt/boot/efi " . format ( efipart ) )
except ValueError :
2016-11-09 23:38:13 +01:00
d . infobox ( title = " Hata ! " , text = " Sisteminizde EFI Sistem bölümünü bulunamadı . Bu bölümün olup olmadı ğı nı kontrol ediniz. \
2016-11-09 23:23:33 +01:00
Eğer bölümün olduğuna eminseniz https : / / github . com / milisarge / malfs - milis / issues adresinden bug bildiriminde bulunabilirsiniz . " )
sys . exit ( )
2016-11-05 17:03:13 +01:00
def installGrub ( target ) :
2016-11-04 18:11:08 +01:00
os . system ( " mount --bind /dev /mnt/dev " )
os . system ( " mount --bind /sys /mnt/sys " )
os . system ( " mount --bind /proc /mnt/proc " )
2016-11-09 23:23:33 +01:00
if isEFI ( ) :
try :
os . mkdir ( " /mnt/boot/efi " )
except :
pass
mountEFIPart ( )
2016-11-10 00:15:51 +01:00
os . system ( " chroot /mnt grub-install --efi-directory=/boot/efi --target=x86_64-efi --bootloader-id=Milis {} " . format ( target [ : - 1 ] ) )
2016-11-09 23:23:33 +01:00
log . write ( ' [+] Grub kuruldu: {} \n ' . format ( target [ : - 1 ] ) )
os . system ( " chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg " )
2016-11-04 18:11:08 +01:00
else :
2016-11-09 23:23:33 +01:00
target = target [ : - 1 ]
if target == " /dev/mmcblk0 " : #SD kart'a kurulum fix (deneysel)
os . system ( " grub-install --boot-directory=/mnt/boot /dev/mmcblk0 " )
else :
os . system ( " grub-install --boot-directory=/mnt/boot " + target )
os . system ( " chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg " )
log . write ( ' [+] Grub kuruldu: {} \n ' . format ( target ) )
2016-11-05 17:03:13 +01:00
finishInstall ( )
2016-11-04 18:11:08 +01:00
2016-11-05 17:03:13 +01:00
def finishInstall ( ) :
2016-11-04 18:11:08 +01:00
d . infobox ( text = " Milis GNU/Linux sisteminize kuruldu. Eğer herşeyin yolunda gittiğini düşünüyorsanı z /tmp/kurulum.log dosyası nı n yedeğini alı p sistemi yeniden başlatabilirsin :) " , width = 70 )
def chooseSwap ( part ) :
swapChoice = [ ]
validParts = [ ' sd ' , ' hd ' , ' mmcblk0p ' ]
#Şimdilik Parted kütüphanesine gerek kalmadı , lsblk istediğimiz bütün değerleri alı yor.
diskParts = runShellCommand ( " lsblk -ln -o NAME | awk ' { print $1} ' " ) . split ( ' \n ' )
partSizes = runShellCommand ( " lsblk -ln -o SIZE | awk ' { print $1} ' " ) . split ( ' \n ' )
partFs = runShellCommand ( " lsblk -ln -o FSTYPE | awk ' { print $1} ' " ) . split ( ' \n ' )
partMajmin = runShellCommand ( " lsblk -ln -o MAJ:MIN | awk ' { print $1} ' " ) . split ( ' \n ' )
partLabel = runShellCommand ( " lsblk -ln -o LABEL " ) . split ( ' \n ' ) #Bunda awk yok çünkü arada boşluk olabilir.
for i in range ( len ( diskParts ) - 1 ) :
if partMajmin [ i ] . split ( " : " ) [ 1 ] != " 0 " : # partition olmayanları ele (sda/sdb swap için uygun değil)
if diskParts [ i ] != part :
for validPart in validParts :
if validPart in diskParts [ i ] : #loop partlar gibi swap kurulamayacak alanları ele
swapChoice . append ( ( diskParts [ i ] , partLabel [ i ] + " \t " + partSizes [ i ] + " \t " + partFs [ i ] ) )
log . write ( " Takas alanı için uygun disk bölümleri: \n " )
for disqPart in swapChoice :
log . write ( " {} {} \n " . format ( disqPart [ 0 ] , disqPart [ 1 ] ) )
log . write ( ' \n ' )
status , selectedPart = d . menu ( title = " Adı m 2: Disk İşlemleri " , text = " Takas alanı nı n yer alacağı disk bölümünü seçiniz: " , choices = swapChoice , width = 70 )
if status == " ok " :
log . write ( " [+] Takas alanı seçildi: {} \n " . format ( selectedPart ) )
2016-11-04 18:57:46 +01:00
setSwap ( selectedPart )
2016-11-04 18:11:08 +01:00
2016-11-04 18:57:46 +01:00
def setSwap ( part ) :
2016-11-04 18:11:08 +01:00
os . system ( " mkswap " + " /dev/ " + part )
os . system ( ' echo " `lsblk -ln -o UUID /dev/ ' + part + ' ` none swap sw 0 0 " | tee -a /etc/fstab ' )
if __name__ == " __main__ " :
greetingDialog ( )