kurulum.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. #!/usr/bin/python3
  2. # Milis Linux Konsol / Grafik Kurulum Betiği
  3. # Commit tarihi: 25.09.2016-03.2017
  4. # Dialog rehberi için: http://pythondialog.sourceforge.net/doc/
  5. # Yazarlar: milisarge,geekdinazor
  6. import sys
  7. import subprocess
  8. import re
  9. import crypt
  10. import os
  11. import time
  12. import sys
  13. import site
  14. import json
  15. kontrol=True
  16. if kontrol:
  17. #talimatname-paket güncellemeleri
  18. os.system("clear")
  19. os.system("mps -GG")
  20. os.system("mps -G")
  21. #lsb-release tamiri
  22. os.system("mps -g lsb-release")
  23. #gereklerin kontrolü-kurulumu
  24. paketd=site.getsitepackages()
  25. yukluler=os.listdir(paketd[0])
  26. kur="pip3 install "
  27. mpskur="mps kur "
  28. kontrol=[""]
  29. mpskontrol=["python3-pip","python-yaml","python3-yaml","python3-pythondialog"]
  30. for mpsk in mpskontrol:
  31. if os.path.exists("/var/lib/pkg/DB/"+mpsk) is False:
  32. os.system("mps kur "+mpsk)
  33. else:
  34. print(mpsk,"zaten kurulu")
  35. for yuklu in yukluler:
  36. for kont in kontrol:
  37. if kont in yuklu:
  38. print (kont,"kurulu")
  39. kontrol.remove(kont)
  40. for kont in kontrol:
  41. os.system(kur+kont)
  42. from dialog import Dialog
  43. import yaml
  44. d = Dialog(dialog="dialog")
  45. f = open("/tmp/kurulum.log","w")
  46. _kurulum_dosya="/root/ayarlar/kurulum.yml"
  47. kurulum_dosya=""
  48. if not os.path.exists(_kurulum_dosya):
  49. d.infobox(text=_kurulum_dosya+" bulunamadı!")
  50. sys.exit()
  51. else:
  52. os.system("cp "+_kurulum_dosya+" /opt/kurulum.yml")
  53. kurulum_dosya="/opt/kurulum.yml"
  54. def komutCalistir(c):
  55. out = subprocess.check_output(c,stderr=subprocess.STDOUT,shell=True,universal_newlines=True)
  56. return out.replace("\b","") #byte-string çevrim
  57. def kurulum_oku(kurulumdos):
  58. with open(kurulumdos, 'r') as f:
  59. param = yaml.load(f)
  60. return param
  61. def kurulum_yaz(param,kurulumdos):
  62. with open(kurulumdos, 'w') as outfile:
  63. yaml.dump(param, outfile, default_flow_style=False,allow_unicode=True)
  64. def paramEkran(param,indent=0):
  65. yazi=""
  66. '''for key, value in param.iteritems():
  67. yazi+='\t' * indent + str(key)+"\n"
  68. if isinstance(value, dict):
  69. paramEkran(value, indent+1)
  70. else:
  71. yazi+='\t' * (indent+1) + str(value)
  72. return yazi
  73. '''
  74. return json.dumps(param,sort_keys=True, indent=4)
  75. kurparam=kurulum_oku(kurulum_dosya)
  76. def karsilamaEkrani():
  77. status = d.yesno(title="Milis Linux Atilla 1.0 Kurulum Ekranı",
  78. text="Milis Linux (Milli İşletim Sistemi) sıfır kaynak koddan üretilen,kendine has paket yöneticisine sahip,\
  79. bağımsız tabanlı yerli linux işletim sistemi projesidir.\
  80. Genel felsefe olarak ülkemizdeki bilgisayar kullanıcıları için linuxu kolaylaştırıp\
  81. Milis İşletim Sisteminin sorunsuz bir işletim sistemi olmasını sağlamayı ve yazılımsal\
  82. olarak dışa bağımlı olmaktan kurtarmayı esas alır. Ayrıca her türlü katkıda bulunmak\
  83. isteyenler için bulunmaz bir Türkçe açık kaynak projesidir.\
  84. \n\n\nKuruluma devam etmek istiyor musunuz ?",width=80,height=12)
  85. if status == "ok":
  86. kullaniciKontrol()
  87. else:
  88. sys.exit()
  89. def kullaniciKontrol():
  90. #status ok ya da cancel gibi durumları çekiyor.
  91. status,kullisim = d.inputbox(text="Lütfen kullanıcı adı giriniz")
  92. #NAME_REGEX bkz. man 5 adduser.conf
  93. if bool(re.compile(r'^[a-z][-a-z0-9]*$').match(kullisim)):
  94. sifreKontrol(kullisim)
  95. else:
  96. status=d.msgbox(text="Hatalı kullanıcı adı girdiniz.\n\n\
  97. Kullanıcı adları alfanümerik karakterle başlamalıdır\
  98. ve alfanümerik (A-Z), nümerik (0-9) ve tire (-) \
  99. harici bir karakter içermemelidir.",width=60)
  100. if status == "ok":
  101. kullaniciKontrol()
  102. def kullaniciTanimla(isim,kullisim,kullsifre):
  103. #encPass = crypt.crypt(kullsifre,"22")
  104. #os.system("useradd -p "+encPass+ " -s "+ "/bin/bash "+ "-d "+ "/home/" + kullisim+ " -m "+ " -c \""+ name+"\" " + kullisim)
  105. kurparam["kullanici"]["isim"]=kullisim
  106. kurparam["kullanici"]["sifre"]=kullsifre
  107. ###os.system("kopar milis-"+isim+" "+kullisim)
  108. ###os.system('echo -e "'+kullsifre+'\n'+kullsifre+'" | passwd '+kullisim)
  109. def kullaniciOlustur(isim,kullisim,kullsifre):
  110. #encPass = crypt.crypt(kullsifre,"22")
  111. #os.system("useradd -p "+encPass+ " -s "+ "/bin/bash "+ "-d "+ "/home/" + kullisim+ " -m "+ " -c \""+ name+"\" " + kullisim)
  112. os.system("kopar milislinux-"+isim+" "+kullisim)
  113. os.system('echo -e "'+kullsifre+'\n'+kullsifre+'" | passwd '+kullisim)
  114. #masaustu ve diğer ayarların aktarılması
  115. ayar_komut="cp -r /root/.config /home/"+kullisim+"/"
  116. os.system(ayar_komut)
  117. ayar_komut2="cp -r /root/.xinitrc /home/"+kullisim+"/"
  118. os.system(ayar_komut2)
  119. ayar_komut3="chown "+kullisim+":"+kullisim+" -R /home/"+kullisim
  120. os.system(ayar_komut3)
  121. saat_komut="saat_ayarla_tr"
  122. os.system(saat_komut)
  123. d.infobox(text=kullisim+" kullanıcısı başarıyla oluşturuldu.")
  124. time.sleep(1)
  125. def sifreKontrol(kullisim):
  126. #insecure=True parolanın yıldız şeklinde gözükmesini sağlar,
  127. #root şifresi sorarken belki bunu silebiliriz normal sudo şifresi
  128. #girer gibi gözükmez.
  129. status,kullsifre = d.passwordbox(text="Lütfen {} kullanıcısı için şifrenizi giriniz".format(kullisim),insecure=True)
  130. if len(kullsifre) > 0:
  131. kullaniciTanimla(kullisim,kullisim,kullsifre)
  132. d.infobox(text=kullisim+" kullanıcısı başarıyla tanımlandı.")
  133. time.sleep(1)
  134. diskSecim()
  135. else:
  136. status=d.msgbox(text="Şifreniz boş olamaz")
  137. sifreKontrol(kullisim)
  138. def diskSecim():
  139. diskSecimler = []
  140. diskIsımler = komutCalistir("lsblk -nS -o NAME").split('\n')
  141. diskModeller = komutCalistir("lsblk -nS -o MODEL").split('\n')
  142. for i in range(len(diskIsımler)):
  143. diskSecimler.append((diskIsımler[i],diskModeller[i]))
  144. status,seciliDisk = d.menu(text="Lütfen bölümleme yapmak istediğiniz diski seçiniz:",choices=diskSecimler)
  145. os.system("cfdisk /dev/" + seciliDisk)
  146. bolumSec()
  147. def bolumSec():
  148. bolumSecimler = []
  149. uygunBolumler = ['sd','hd','mmcblk0p']
  150. #Şimdilik Parted kütüphanesine gerek kalmadı, lsblk istediğimiz bütün değerleri alıyor.
  151. diskBolumler = komutCalistir("lsblk -ln -o NAME | awk '{print $1}'").split('\n')
  152. bolumBoyutlar = komutCalistir("lsblk -ln -o SIZE | awk '{print $1}'").split('\n')
  153. bolumDs = komutCalistir("lsblk -ln -o FSTYPE | awk '{print $1}'").split('\n')
  154. bolumMajmin = komutCalistir("lsblk -ln -o MAJ:MIN | awk '{print $1}'").split('\n')
  155. bolumEtiket = komutCalistir("lsblk -ln -o LABEL").split('\n') #Bunda awk yok çünkü arada boşluk olabilir.
  156. for i in range(len(diskBolumler)-1):
  157. if bolumMajmin[i].split(":")[1] != "0": # partition olmayanları ele (sda/sdb seçince grub bozuluyor.)
  158. for uygunBolum in uygunBolumler:
  159. if uygunBolum in diskBolumler[i]:
  160. bolumSecimler.append((diskBolumler[i],bolumEtiket[i]+ "\t" +bolumBoyutlar[i]+"\t"+bolumDs[i]))
  161. status,seciliBolum = d.menu(text="Sistemin kurulacağı diski seçiniz",choices=bolumSecimler)
  162. if status == "ok":
  163. print("{} seçildi !".format(seciliBolum))
  164. kurparam["disk"]["bolum"]="/dev/"+seciliBolum
  165. formatDialog(seciliBolum)
  166. def formatDialog(part):
  167. status = d.yesno(title="Uyarı !",
  168. text="/dev/{} bölümü ext4 türünde formatlanacak. Emin misiniz ?".format(part))
  169. if status == "ok":
  170. kurparam["disk"]["format"]="evet"
  171. else:
  172. kurparam["disk"]["format"]="hayir"
  173. takasSec(part)
  174. def bolumFormatla(hedef):
  175. komut="umount -l "+hedef
  176. print (komut)
  177. if os.path.exists(hedef):
  178. os.system(komut)
  179. komut2="mkfs.ext4 -F " + hedef
  180. try:
  181. os.system(komut2)
  182. except OSError as e:
  183. d.infobox(text=str(e))
  184. time.sleep(1)
  185. sys.exit()
  186. d.infobox(text=hedef+" disk bölümü formatlandı.")
  187. time.sleep(1)
  188. else:
  189. d.infobox(text="disk bölümü bulunamadı!")
  190. time.sleep(1)
  191. sys.exit()
  192. def bolumBagla(hedef,baglam):
  193. komut="mount "+hedef+" "+baglam
  194. try:
  195. os.system(komut)
  196. except OSError as e:
  197. d.infobox(text=str(e))
  198. time.sleep(1)
  199. sys.exit()
  200. d.infobox(text=hedef+" "+baglam+" altına bağlandı.")
  201. time.sleep(1)
  202. def bolumCoz(hedef):
  203. komut="umount -l "+hedef
  204. try:
  205. os.system(komut)
  206. except OSError as e:
  207. d.infobox(text=str(e))
  208. time.sleep(1)
  209. sys.exit()
  210. d.infobox(text=hedef+" çözüldü.")
  211. time.sleep(1)
  212. def sistemKopyala(baglam):
  213. os.system("clear")
  214. komut=""
  215. # kurulum.desktop silinmesi
  216. komut1="rm /root/Masaüstü/kurulum.desktop"
  217. komut2="rm /root/Desktop/kurulum.desktop"
  218. os.system(komut1)
  219. os.system(komut2)
  220. #bazı dizinleri atlamak için ve hız rsync
  221. dizinler=["bin","boot","home","lib","sources","usr","depo","etc","include","lib64","opt","root","sbin","var"]
  222. yenidizinler=["srv","proc","tmp","mnt","sys","run","dev","media"]
  223. i=0
  224. mikdiz=len(dizinler)
  225. for dizin in dizinler:
  226. i+=1
  227. print (i,"/",mikdiz,dizin,"kopyalanıyor.....")
  228. #komut="rsync --delete -a --info=progress2 /"+dizin+" "+baglam+" --exclude /proc"
  229. komut="rsync --delete -axHAWX --info=progress2 --numeric-ids /"+dizin+" "+baglam+" --exclude /proc"
  230. print (dizin,"kopyalandı.")
  231. os.system(komut)
  232. for ydizin in yenidizinler:
  233. print (ydizin,"oluşturuluyor.....")
  234. komut="mkdir -p "+baglam+"/"+ydizin
  235. os.system(komut)
  236. print (ydizin,"oluşturuldu.")
  237. #yükleme akışı için acp
  238. #os.system("acp -g -axnu / "+baglam)
  239. #normal cp
  240. #os.system("cp -axvnu / "+baglam)
  241. d.infobox(text="sistem kopyalandı.")
  242. time.sleep(1)
  243. def initrdOlustur(hedef):
  244. os.system("mount --bind /dev "+hedef+"/dev")
  245. os.system("mount --bind /sys "+hedef+"/sys")
  246. os.system("mount --bind /proc "+hedef+"/proc")
  247. os.system('chroot '+hedef+' dracut --no-hostonly --add-drivers "ahci" -f /boot/initramfs')
  248. d.infobox(text="initrd kuruldu.")
  249. time.sleep(1)
  250. def grubKurTespit():
  251. if d.yesno(text="Grub kurmak istiyor musunuz ?") == "ok":
  252. kurparam["grub"]["kur"]="evet"
  253. else:
  254. kurparam["grub"]["kur"]="hayir"
  255. kurulumBilgi()
  256. def kurulumBilgi():
  257. kurulum_yaz(kurparam,kurulum_dosya)
  258. d.infobox(text="Kurulum ayarlarınız başarıyla kayıt edildi.")
  259. time.sleep(1)
  260. kurulumUygula(kurulum_dosya)
  261. def grubKur(hedef,baglam):
  262. hedef = hedef[:-1]
  263. if hedef == "/dev/mmcblk0": #SD kart'a kurulum fix
  264. os.system("grub-install --boot-directory="+baglam+"/boot /dev/mmcblk0")
  265. else:
  266. os.system("grub-install --boot-directory="+baglam+"/boot " + hedef)
  267. os.system("chroot "+baglam+" grub-mkconfig -o /boot/grub/grub.cfg")
  268. d.infobox(text="grub kuruldu.")
  269. time.sleep(1)
  270. def kurulumUygula(dosya):
  271. #ayarların alınması
  272. kurulum=kurulum_oku(dosya)
  273. yazi=""
  274. yazi+=paramEkran(kurulum)+"\n\n"
  275. yazi+="Kurulum Ayarlarını onaylıyor musunuz?"
  276. if d.yesno(text=yazi,width=50,height=70) == "ok":
  277. #kurulum işlemi
  278. kbolum=kurulum["disk"]["bolum"]
  279. kformat=kurulum["disk"]["format"]
  280. kbaglam=kurulum["disk"]["baglam"]
  281. ktakas=kurulum["disk"]["takasbolum"]
  282. kisim=kurulum["kullanici"]["isim"]
  283. ksifre=kurulum["kullanici"]["sifre"]
  284. kgrubkur=kurulum["grub"]["kur"]
  285. #ayarların uygulanması
  286. #formatlama
  287. if kformat == "evet":
  288. bolumFormatla(kbolum)
  289. if ktakas !="":
  290. takasAyarla(ktakas)
  291. #kurulacak bölümün bağlanması
  292. bolumBagla(kbolum,kbaglam)
  293. #kullanıcı oluşturma
  294. kullaniciOlustur(kisim,kisim,ksifre)
  295. #sistemin kopyalanması
  296. sistemKopyala(kbaglam)
  297. #initrd oluşturulması
  298. initrdOlustur(kbaglam)
  299. #grub kurulması
  300. if kgrubkur == "evet":
  301. grubKur(kbolum,kbaglam)
  302. bolumCoz(kbolum)
  303. d.infobox(text="Milis İşletim Sistemi başarıyla kuruldu.")
  304. else:
  305. if d.yesno(text="Kurulumdan Çıkış?") == "ok":
  306. sys.exit()
  307. else:
  308. karsilamaEkrani()
  309. def takasSec(kbolum):
  310. if d.yesno(text="Takas alanı kullanmak istiyor musunuz ?") == "ok":
  311. takasSecimler = []
  312. uygunBolumler = ['sd','hd','mmcblk0p']
  313. #Şimdilik Parted kütüphanesine gerek kalmadı, lsblk istediğimiz bütün değerleri alıyor.
  314. diskBolumler = komutCalistir("lsblk -ln -o NAME | awk '{print $1}'").split('\n')
  315. bolumBoyutlar = komutCalistir("lsblk -ln -o SIZE | awk '{print $1}'").split('\n')
  316. bolumDs = komutCalistir("lsblk -ln -o FSTYPE | awk '{print $1}'").split('\n')
  317. bolumMajmin = komutCalistir("lsblk -ln -o MAJ:MIN | awk '{print $1}'").split('\n')
  318. bolumEtiket = komutCalistir("lsblk -ln -o LABEL").split('\n') #Bunda awk yok çünkü arada boşluk olabilir.
  319. for i in range(len(diskBolumler)-1):
  320. if bolumMajmin[i].split(":")[1] != "0": # partition olmayanları ele (sda/sdb swap için uygun değil)
  321. if diskBolumler[i] != kbolum:
  322. for uygunBolum in uygunBolumler:
  323. if uygunBolum in diskBolumler[i]: #loop partlar gibi swap kurulamayacak alanları ele
  324. if bolumDs[i] == "swap":
  325. takasSecimler.append((diskBolumler[i],bolumEtiket[i]+ "\t" +bolumBoyutlar[i]+"\t"+bolumDs[i]))
  326. if takasSecimler:
  327. status,seciliBolum = d.menu(text="Takas alanının yer alacağı disk bölümünü seçiniz",choices=takasSecimler)
  328. if status == "ok":
  329. print("{} seçildi !".format(seciliBolum))
  330. kurparam["disk"]["takasbolum"]="/dev/"+seciliBolum
  331. else:
  332. kurparam["disk"]["takasbolum"]=""
  333. else:
  334. kurparam["disk"]["takasbolum"]=""
  335. grubKurTespit()
  336. def takasAyarla(bolum):
  337. os.system("mkswap "+"/dev/"+bolum)
  338. os.system('echo "`lsblk -ln -o UUID /dev/' + bolum + '` none swap sw 0 0" | tee -a /etc/fstab')
  339. def main():
  340. if len(sys.argv) == 1:
  341. karsilamaEkrani()
  342. else:
  343. dosya=sys.argv[1]
  344. if os.path.exists(dosya):
  345. kurulumUygula(dosya)
  346. else:
  347. d.infobox(text=dosya+" bulunamadı!")
  348. time.sleep(1)
  349. if __name__ == "__main__":
  350. main()