milis/bin/kurulum.py

399 lines
13 KiB
Python
Raw Normal View History

2017-03-13 23:18:27 +01:00
#!/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 "
2017-03-14 23:21:49 +01:00
kontrol=[""]
mpskontrol=["python3-pip","python-yaml","python3-yaml","python3-pythondialog"]
2017-03-13 23:18:27 +01:00
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")
2017-03-14 23:21:49 +01:00
_kurulum_dosya="/root/ayarlar/kurulum.yml"
kurulum_dosya=""
2017-03-13 23:18:27 +01:00
2017-03-14 23:21:49 +01:00
if not os.path.exists(_kurulum_dosya):
d.infobox(text=_kurulum_dosya+" bulunamadı!")
2017-03-13 23:18:27 +01:00
sys.exit()
2017-03-14 23:21:49 +01:00
else:
os.system("cp "+_kurulum_dosya+" /opt/kurulum.yml")
kurulum_dosya="/opt/kurulum.yml"
2017-03-13 23:18:27 +01:00
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\
2017-06-24 15:55:54 +02:00
Milis İşletim Sisteminin sorunsuz bir işletim sistemi olmasını sağlamayı ve yazılımsal\
2017-03-13 23:18:27 +01:00
olarak dışa bağımlı olmaktan kurtarmayı esas alır. Ayrıca her türlü katkıda bulunmak\
2017-06-24 15:55:54 +02:00
isteyenler için bulunmaz bir Türkçe ık kaynak projesidir.\
2017-03-13 23:18:27 +01:00
\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)
2017-03-15 00:26:00 +01:00
os.system("kopar milislinux-"+isim+" "+kullisim)
2017-03-13 23:18:27 +01:00
os.system('echo -e "'+kullsifre+'\n'+kullsifre+'" | passwd '+kullisim)
2017-03-15 00:26:00 +01:00
#masaustu ve diğer ayarların aktarılması
2017-03-14 11:31:06 +01:00
ayar_komut="cp -r /root/.config /home/"+kullisim+"/"
os.system(ayar_komut)
2017-04-22 19:41:27 +02:00
ayar_komut2="cp -r /root/.xinitrc /home/"+kullisim+"/"
os.system(ayar_komut2)
2017-03-15 00:26:00 +01:00
saat_komut="saat_ayarla_tr"
os.system(saat_komut)
d.infobox(text=kullisim+" kullanıcısı başarıyla oluşturuldu.")
2017-03-13 23:18:27 +01:00
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)
2017-04-09 02:37:08 +02:00
diskSecim()
2017-03-13 23:18:27 +01:00
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)
2017-04-09 02:37:08 +02:00
os.system("cfdisk /dev/" + seciliDisk)
2017-03-13 23:18:27 +01:00
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]))
2017-03-13 23:18:27 +01:00
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
2017-03-14 10:27:58 +01:00
formatDialog(seciliBolum)
2017-03-13 23:18:27 +01:00
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":
2017-03-14 10:27:58 +01:00
kurparam["disk"]["format"]="evet"
2017-03-13 23:18:27 +01:00
else:
2017-03-14 10:27:58 +01:00
kurparam["disk"]["format"]="hayir"
takasSec(part)
2017-03-13 23:18:27 +01:00
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=""
2017-06-15 07:28:30 +02:00
# kurulum.desktop silinmesi
komut1="rm /root/Masaüstü/kurulum.desktop"
komut2="rm /root/Desktop/kurulum.desktop"
os.system(komut1)
os.system(komut2)
2017-03-13 23:18:27 +01:00
#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.....")
2017-07-19 00:59:41 +02:00
#komut="rsync --delete -a --info=progress2 /"+dizin+" "+baglam+" --exclude /proc"
komut="rsync --delete -axHAWX --info=progress2 --numeric-ids /"+dizin+" "+baglam+" --exclude /proc"
2017-03-13 23:18:27 +01:00
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.")
2017-06-15 07:28:30 +02:00
2017-03-13 23:18:27 +01:00
#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)
2017-03-17 23:33:46 +01:00
if ktakas !="":
takasAyarla(ktakas)
2017-03-13 23:18:27 +01:00
#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)
2017-03-17 23:33:46 +01:00
#grub kurulması
2017-03-13 23:18:27 +01:00
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
2017-03-14 13:16:45 +01:00
if bolumDs[i] == "swap":
takasSecimler.append((diskBolumler[i],bolumEtiket[i]+ "\t" +bolumBoyutlar[i]+"\t"+bolumDs[i]))
2017-05-26 01:04:00 +02:00
if takasSecimler:
2017-05-26 01:05:39 +02:00
status,seciliBolum = d.menu(text="Takas alanının yer alacağı disk bölümünü seçiniz",choices=takasSecimler)
2017-05-26 01:04:00 +02:00
if status == "ok":
print("{} seçildi !".format(seciliBolum))
kurparam["disk"]["takasbolum"]="/dev/"+seciliBolum
else:
kurparam["disk"]["takasbolum"]=""
2017-03-13 23:18:27 +01:00
else:
kurparam["disk"]["takasbolum"]=""
grubKurTespit()
2017-03-17 23:33:46 +01:00
def takasAyarla(bolum):
2017-03-13 23:18:27 +01:00
os.system("mkswap "+"/dev/"+bolum)
os.system('echo "`lsblk -ln -o UUID /dev/' + bolum + '` none swap sw 0 0" | tee -a /etc/fstab')
2017-03-14 10:27:58 +01:00
def main():
2017-03-13 23:18:27 +01:00
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)
2017-03-14 10:27:58 +01:00
if __name__ == "__main__":
main()