milis/bin/kurulum.py

397 lines
13 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python3
# Milis Linux Konsol / Grafik Kurulum Betiği
# Commit tarihi: 25.09.2016-03.2017
# Dialog rehberi için: http://pythondialog.sourceforge.net/doc/
# Yazarlar: milisarge,geekdinazor
import sys
import subprocess
import re
import crypt
import os
import time
import sys
import site
import json
kontrol=True
if kontrol:
#talimatname-paket güncellemeleri
os.system("clear")
os.system("mps -GG")
os.system("mps -G")
#lsb-release tamiri
os.system("mps -g lsb-release")
#gereklerin kontrolü-kurulumu
paketd=site.getsitepackages()
yukluler=os.listdir(paketd[0])
kur="pip3 install "
mpskur="mps kur "
kontrol=[""]
mpskontrol=["python3-pip","python-yaml","python3-yaml","python3-pythondialog"]
for mpsk in mpskontrol:
if os.path.exists("/var/lib/pkg/DB/"+mpsk) is False:
os.system("mps kur "+mpsk)
else:
print(mpsk,"zaten kurulu")
for yuklu in yukluler:
for kont in kontrol:
if kont in yuklu:
print (kont,"kurulu")
kontrol.remove(kont)
for kont in kontrol:
os.system(kur+kont)
from dialog import Dialog
import yaml
d = Dialog(dialog="dialog")
f = open("/tmp/kurulum.log","w")
_kurulum_dosya="/root/ayarlar/kurulum.yml"
kurulum_dosya=""
if not os.path.exists(_kurulum_dosya):
d.infobox(text=_kurulum_dosya+" bulunamadı!")
sys.exit()
else:
os.system("cp "+_kurulum_dosya+" /opt/kurulum.yml")
kurulum_dosya="/opt/kurulum.yml"
def komutCalistir(c):
out = subprocess.check_output(c,stderr=subprocess.STDOUT,shell=True,universal_newlines=True)
return out.replace("\b","") #byte-string çevrim
def kurulum_oku(kurulumdos):
with open(kurulumdos, 'r') as f:
param = yaml.load(f)
return param
def kurulum_yaz(param,kurulumdos):
with open(kurulumdos, 'w') as outfile:
yaml.dump(param, outfile, default_flow_style=False,allow_unicode=True)
def paramEkran(param,indent=0):
yazi=""
'''for key, value in param.iteritems():
yazi+='\t' * indent + str(key)+"\n"
if isinstance(value, dict):
paramEkran(value, indent+1)
else:
yazi+='\t' * (indent+1) + str(value)
return yazi
'''
return json.dumps(param,sort_keys=True, indent=4)
kurparam=kurulum_oku(kurulum_dosya)
def karsilamaEkrani():
status = d.yesno(title="Milis Linux Atilla 1.0 Kurulum Ekranı",
text="Milis Linux (Milli İşletim Sistemi) sıfır kaynak koddan üretilen,kendine has paket yöneticisine sahip,\
bağımsız tabanlı yerli linux işletim sistemi projesidir.\
Genel felsefe olarak ülkemizdeki bilgisayar kullanıcıları için linuxu kolaylaştırıp\
Milis işletim sisteminin sorunsuz bir işletim sistemi olmasını sağlamayı ve yazılımsal\
olarak dışa bağımlı olmaktan kurtarmayı esas alır. Ayrıca her türlü katkıda bulunmak\
isteyenler için bulunmaz bir türkçe açık kaynak projesidir.\
\n\n\nKuruluma devam etmek istiyor musunuz ?",width=80,height=12)
if status == "ok":
kullaniciKontrol()
else:
sys.exit()
def kullaniciKontrol():
#status ok ya da cancel gibi durumları çekiyor.
status,kullisim = d.inputbox(text="Lütfen kullanıcı adı giriniz")
#NAME_REGEX bkz. man 5 adduser.conf
if bool(re.compile(r'^[a-z][-a-z0-9]*$').match(kullisim)):
sifreKontrol(kullisim)
else:
status=d.msgbox(text="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=60)
if status == "ok":
kullaniciKontrol()
def kullaniciTanimla(isim,kullisim,kullsifre):
#encPass = crypt.crypt(kullsifre,"22")
#os.system("useradd -p "+encPass+ " -s "+ "/bin/bash "+ "-d "+ "/home/" + kullisim+ " -m "+ " -c \""+ name+"\" " + kullisim)
kurparam["kullanici"]["isim"]=kullisim
kurparam["kullanici"]["sifre"]=kullsifre
###os.system("kopar milis-"+isim+" "+kullisim)
###os.system('echo -e "'+kullsifre+'\n'+kullsifre+'" | passwd '+kullisim)
def kullaniciOlustur(isim,kullisim,kullsifre):
#encPass = crypt.crypt(kullsifre,"22")
#os.system("useradd -p "+encPass+ " -s "+ "/bin/bash "+ "-d "+ "/home/" + kullisim+ " -m "+ " -c \""+ name+"\" " + kullisim)
os.system("kopar milislinux-"+isim+" "+kullisim)
os.system('echo -e "'+kullsifre+'\n'+kullsifre+'" | passwd '+kullisim)
#masaustu ve diğer ayarların aktarılması
ayar_komut="cp -r /root/.config /home/"+kullisim+"/"
os.system(ayar_komut)
ayar_komut2="cp -r /root/.xinitrc /home/"+kullisim+"/"
os.system(ayar_komut2)
saat_komut="saat_ayarla_tr"
os.system(saat_komut)
d.infobox(text=kullisim+" kullanıcısı başarıyla oluşturuldu.")
time.sleep(1)
def sifreKontrol(kullisim):
#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,kullsifre = d.passwordbox(text="Lütfen {} kullanıcısı için şifrenizi giriniz".format(kullisim),insecure=True)
if len(kullsifre) > 0:
kullaniciTanimla(kullisim,kullisim,kullsifre)
d.infobox(text=kullisim+" kullanıcısı başarıyla tanımlandı.")
time.sleep(1)
diskSecim()
else:
status=d.msgbox(text="Şifreniz boş olamaz")
sifreKontrol(kullisim)
def diskSecim():
diskSecimler = []
diskIsımler = komutCalistir("lsblk -nS -o NAME").split('\n')
diskModeller = komutCalistir("lsblk -nS -o MODEL").split('\n')
for i in range(len(diskIsımler)):
diskSecimler.append((diskIsımler[i],diskModeller[i]))
status,seciliDisk = d.menu(text="Lütfen bölümleme yapmak istediğiniz diski seçiniz:",choices=diskSecimler)
os.system("cfdisk /dev/" + seciliDisk)
bolumSec()
def bolumSec():
bolumSecimler = []
uygunBolumler = ['sd','hd','mmcblk0p']
#Şimdilik Parted kütüphanesine gerek kalmadı, lsblk istediğimiz bütün değerleri alıyor.
diskBolumler = komutCalistir("lsblk -ln -o NAME | awk '{print $1}'").split('\n')
bolumBoyutlar = komutCalistir("lsblk -ln -o SIZE | awk '{print $1}'").split('\n')
bolumDs = komutCalistir("lsblk -ln -o FSTYPE | awk '{print $1}'").split('\n')
bolumMajmin = komutCalistir("lsblk -ln -o MAJ:MIN | awk '{print $1}'").split('\n')
bolumEtiket = komutCalistir("lsblk -ln -o LABEL").split('\n') #Bunda awk yok çünkü arada boşluk olabilir.
for i in range(len(diskBolumler)-1):
if bolumMajmin[i].split(":")[1] != "0": # partition olmayanları ele (sda/sdb seçince grub bozuluyor.)
for uygunBolum in uygunBolumler:
if uygunBolum in diskBolumler[i]:
bolumSecimler.append((diskBolumler[i],bolumEtiket[i]+ "\t" +bolumBoyutlar[i]+"\t"+bolumDs[i]))
status,seciliBolum = d.menu(text="Sistemin kurulacağı diski seçiniz",choices=bolumSecimler)
if status == "ok":
print("{} seçildi !".format(seciliBolum))
kurparam["disk"]["bolum"]="/dev/"+seciliBolum
formatDialog(seciliBolum)
def formatDialog(part):
status = d.yesno(title="Uyarı !",
text="/dev/{} bölümü ext4 türünde formatlanacak. Emin misiniz ?".format(part))
if status == "ok":
kurparam["disk"]["format"]="evet"
else:
kurparam["disk"]["format"]="hayir"
takasSec(part)
def bolumFormatla(hedef):
komut="umount -l "+hedef
print (komut)
if os.path.exists(hedef):
os.system(komut)
komut2="mkfs.ext4 -F " + hedef
try:
os.system(komut2)
except OSError as e:
d.infobox(text=str(e))
time.sleep(1)
sys.exit()
d.infobox(text=hedef+" disk bölümü formatlandı.")
time.sleep(1)
else:
d.infobox(text="disk bölümü bulunamadı!")
time.sleep(1)
sys.exit()
def bolumBagla(hedef,baglam):
komut="mount "+hedef+" "+baglam
try:
os.system(komut)
except OSError as e:
d.infobox(text=str(e))
time.sleep(1)
sys.exit()
d.infobox(text=hedef+" "+baglam+" altına bağlandı.")
time.sleep(1)
def bolumCoz(hedef):
komut="umount -l "+hedef
try:
os.system(komut)
except OSError as e:
d.infobox(text=str(e))
time.sleep(1)
sys.exit()
d.infobox(text=hedef+" çözüldü.")
time.sleep(1)
def sistemKopyala(baglam):
os.system("clear")
komut=""
#bazı dizinleri atlamak için ve hız rsync
dizinler=["bin","boot","home","lib","sources","usr","depo","etc","include","lib64","opt","root","sbin","var"]
yenidizinler=["srv","proc","tmp","mnt","sys","run","dev","media"]
i=0
mikdiz=len(dizinler)
for dizin in dizinler:
i+=1
print (i,"/",mikdiz,dizin,"kopyalanıyor.....")
komut="rsync --delete -a --info=progress2 /"+dizin+" "+baglam+" --exclude /proc"
print (dizin,"kopyalandı.")
os.system(komut)
for ydizin in yenidizinler:
print (ydizin,"oluşturuluyor.....")
komut="mkdir -p "+baglam+"/"+ydizin
os.system(komut)
print (ydizin,"oluşturuldu.")
# kurulum.desktop silinmesi
komut="rm /root/Masaüstü/kurulum.desktop"
komut2="rm /root/Desktop/kurulum.desktop"
os.system(komut)
os.system(komut2)
#yükleme akışı için acp
#os.system("acp -g -axnu / "+baglam)
#normal cp
#os.system("cp -axvnu / "+baglam)
d.infobox(text="sistem kopyalandı.")
time.sleep(1)
def initrdOlustur(hedef):
os.system("mount --bind /dev "+hedef+"/dev")
os.system("mount --bind /sys "+hedef+"/sys")
os.system("mount --bind /proc "+hedef+"/proc")
os.system('chroot '+hedef+' dracut --no-hostonly --add-drivers "ahci" -f /boot/initramfs')
d.infobox(text="initrd kuruldu.")
time.sleep(1)
def grubKurTespit():
if d.yesno(text="Grub kurmak istiyor musunuz ?") == "ok":
kurparam["grub"]["kur"]="evet"
else:
kurparam["grub"]["kur"]="hayir"
kurulumBilgi()
def kurulumBilgi():
kurulum_yaz(kurparam,kurulum_dosya)
d.infobox(text="Kurulum ayarlarınız başarıyla kayıt edildi.")
time.sleep(1)
kurulumUygula(kurulum_dosya)
def grubKur(hedef,baglam):
hedef = hedef[:-1]
if hedef == "/dev/mmcblk0": #SD kart'a kurulum fix
os.system("grub-install --boot-directory="+baglam+"/boot /dev/mmcblk0")
else:
os.system("grub-install --boot-directory="+baglam+"/boot " + hedef)
os.system("chroot "+baglam+" grub-mkconfig -o /boot/grub/grub.cfg")
d.infobox(text="grub kuruldu.")
time.sleep(1)
def kurulumUygula(dosya):
#ayarların alınması
kurulum=kurulum_oku(dosya)
yazi=""
yazi+=paramEkran(kurulum)+"\n\n"
yazi+="Kurulum Ayarlarını onaylıyor musunuz?"
if d.yesno(text=yazi,width=50,height=70) == "ok":
#kurulum işlemi
kbolum=kurulum["disk"]["bolum"]
kformat=kurulum["disk"]["format"]
kbaglam=kurulum["disk"]["baglam"]
ktakas=kurulum["disk"]["takasbolum"]
kisim=kurulum["kullanici"]["isim"]
ksifre=kurulum["kullanici"]["sifre"]
kgrubkur=kurulum["grub"]["kur"]
#ayarların uygulanması
#formatlama
if kformat == "evet":
bolumFormatla(kbolum)
if ktakas !="":
takasAyarla(ktakas)
#kurulacak bölümün bağlanması
bolumBagla(kbolum,kbaglam)
#kullanıcı oluşturma
kullaniciOlustur(kisim,kisim,ksifre)
#sistemin kopyalanması
sistemKopyala(kbaglam)
#initrd oluşturulması
initrdOlustur(kbaglam)
#grub kurulması
if kgrubkur == "evet":
grubKur(kbolum,kbaglam)
bolumCoz(kbolum)
d.infobox(text="Milis İşletim Sistemi başarıyla kuruldu.")
else:
if d.yesno(text="Kurulumdan Çıkış?") == "ok":
sys.exit()
else:
karsilamaEkrani()
def takasSec(kbolum):
if d.yesno(text="Takas alanı kullanmak istiyor musunuz ?") == "ok":
takasSecimler = []
uygunBolumler = ['sd','hd','mmcblk0p']
#Şimdilik Parted kütüphanesine gerek kalmadı, lsblk istediğimiz bütün değerleri alıyor.
diskBolumler = komutCalistir("lsblk -ln -o NAME | awk '{print $1}'").split('\n')
bolumBoyutlar = komutCalistir("lsblk -ln -o SIZE | awk '{print $1}'").split('\n')
bolumDs = komutCalistir("lsblk -ln -o FSTYPE | awk '{print $1}'").split('\n')
bolumMajmin = komutCalistir("lsblk -ln -o MAJ:MIN | awk '{print $1}'").split('\n')
bolumEtiket = komutCalistir("lsblk -ln -o LABEL").split('\n') #Bunda awk yok çünkü arada boşluk olabilir.
for i in range(len(diskBolumler)-1):
if bolumMajmin[i].split(":")[1] != "0": # partition olmayanları ele (sda/sdb swap için uygun değil)
if diskBolumler[i] != kbolum:
for uygunBolum in uygunBolumler:
if uygunBolum in diskBolumler[i]: #loop partlar gibi swap kurulamayacak alanları ele
if bolumDs[i] == "swap":
takasSecimler.append((diskBolumler[i],bolumEtiket[i]+ "\t" +bolumBoyutlar[i]+"\t"+bolumDs[i]))
if takasSecimler:
status,seciliBolum = d.menu(text="Takas alanının yer alacağı disk bölümünü seçiniz",choices=takasSecimler)
if status == "ok":
print("{} seçildi !".format(seciliBolum))
kurparam["disk"]["takasbolum"]="/dev/"+seciliBolum
else:
kurparam["disk"]["takasbolum"]=""
else:
kurparam["disk"]["takasbolum"]=""
grubKurTespit()
def takasAyarla(bolum):
os.system("mkswap "+"/dev/"+bolum)
os.system('echo "`lsblk -ln -o UUID /dev/' + bolum + '` none swap sw 0 0" | tee -a /etc/fstab')
def main():
if len(sys.argv) == 1:
karsilamaEkrani()
else:
dosya=sys.argv[1]
if os.path.exists(dosya):
kurulumUygula(dosya)
else:
d.infobox(text=dosya+" bulunamadı!")
time.sleep(1)
if __name__ == "__main__":
main()