disk.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. import parted
  2. from PyQt5.QtGui import QIcon, QPixmap
  3. from PyQt5.QtWidgets import QWidget, QLabel, QComboBox, QPushButton, QTreeWidget, QTreeWidgetItem, \
  4. QMessageBox, QDialog, QCheckBox, QGridLayout, QInputDialog, QHeaderView
  5. from PyQt5.QtCore import Qt
  6. class Disk(QWidget):
  7. def __init__(self, ebeveyn=None):
  8. super(Disk, self).__init__(ebeveyn)
  9. self.e = ebeveyn
  10. diskler_kutu = QGridLayout()
  11. self.setLayout(diskler_kutu)
  12. self.sistemDiski = ["", ""]
  13. self.takasDiski = ["", ""]
  14. self.seciliDisk = None
  15. self.diskler = parted.getAllDevices()
  16. self.disklerAcilirKutu = QComboBox()
  17. self.yenileButon = QPushButton()
  18. self.yenileButon.setIcon(QIcon("./resimler/yenile.svg"))
  19. self.yenileButon.pressed.connect(self.diskYenile)
  20. self.bolumListeKutu = QTreeWidget()
  21. self.bolumListeKutu.setColumnCount(4)
  22. self.bolumListeKutu.header().setStretchLastSection(False);
  23. self.bolumListeKutu.header().setSectionResizeMode(0, QHeaderView.Stretch);
  24. self.bolumListeKutu.header().setSectionResizeMode(1, QHeaderView.Stretch);
  25. self.bolumListeKutu.header().setSectionResizeMode(2, QHeaderView.Stretch);
  26. self.bolumListeKutu.header().setSectionResizeMode(3, QHeaderView.Stretch);
  27. self.disklerAcilirKutu.currentIndexChanged.connect(self.diskDegisti)
  28. diskler_kutu.addWidget(self.disklerAcilirKutu,0,0,1,6)
  29. diskler_kutu.addWidget(self.yenileButon,0,6,1,2)
  30. diskler_kutu.addWidget(self.bolumListeKutu,1,0,1,8)
  31. resim_label = QLabel()
  32. resim_label.setFixedSize(16,16)
  33. resim_label.setPixmap(QPixmap("./resimler/blank.svg"))
  34. diskler_kutu.addWidget(resim_label,2,0,1,1)
  35. self.blank_label = QLabel()
  36. diskler_kutu.addWidget(self.blank_label,2,1,1,1)
  37. resim_label = QLabel()
  38. resim_label.setFixedSize(16, 16)
  39. resim_label.setPixmap(QPixmap("./resimler/extended.svg"))
  40. diskler_kutu.addWidget(resim_label,2,2,1,1)
  41. self.extended_label = QLabel()
  42. diskler_kutu.addWidget(self.extended_label,2,3,1,1)
  43. resim_label = QLabel()
  44. resim_label.setFixedSize(16, 16)
  45. resim_label.setPixmap(QPixmap("./resimler/logical.svg"))
  46. diskler_kutu.addWidget(resim_label,2,4,1,1)
  47. self.logical_label = QLabel()
  48. diskler_kutu.addWidget(self.logical_label,2,5,1,1)
  49. resim_label = QLabel()
  50. resim_label.setFixedSize(16, 16)
  51. resim_label.setPixmap(QPixmap("./resimler/primary.svg"))
  52. diskler_kutu.addWidget(resim_label,2,6,1,1)
  53. self.primary_label = QLabel()
  54. diskler_kutu.addWidget(self.primary_label,2,7,1,1)
  55. self.bolumListeKutu.itemClicked.connect(self.bolumSecildiFonk)
  56. self.bolumListeKutu.itemDoubleClicked.connect(self.bolumFormatSecFonk)
  57. self.yeniBolumBtn = QPushButton()
  58. self.yeniBolumBtn.setIcon(QIcon("./resimler/yeni_bolum.svg"))
  59. self.yeniBolumBtn.pressed.connect(self.bolumEkleFonk)
  60. self.bolumSilBtn = QPushButton()
  61. self.bolumSilBtn.setIcon(QIcon("./resimler/bolum_sil.svg"))
  62. self.bolumSilBtn.pressed.connect(self.bolumSilFonk)
  63. diskler_kutu.addWidget(self.yeniBolumBtn,3,4,1,2)
  64. diskler_kutu.addWidget(self.bolumSilBtn,3,6,1,2)
  65. self.bolumSilBtn.setEnabled(False)
  66. self.diskYenile()
  67. def diskYenile(self):
  68. self.disklerAcilirKutu.clear()
  69. self.diskler = parted.getAllDevices()
  70. for disk in self.diskler:
  71. try:
  72. if parted.Disk(disk).type == "msdos" or parted.Disk(disk).type == "gpt" :
  73. self.disklerAcilirKutu.addItem(
  74. "{} {} GB ({})".format(disk.model, format(disk.getSize(unit="GB"), '.2f'), disk.path),
  75. userData=disk.path)
  76. except parted.DiskLabelException:
  77. disk = parted.freshDisk(disk, "msdos")
  78. # CDROM Aygıtları için
  79. try:
  80. disk.commit()
  81. except parted.IOException:
  82. pass
  83. else:
  84. disk = disk.device
  85. self.disklerAcilirKutu.addItem(
  86. "{} {} GB ({})".format(disk.model, format(disk.getSize(unit="GB"), '.2f'), disk.path),
  87. userData=disk.path)
  88. def diskDegisti(self):
  89. if self.disklerAcilirKutu.currentData():
  90. self.aygit = parted.getDevice(self.disklerAcilirKutu.currentData())
  91. self.e.disk = parted.Disk(self.aygit)
  92. self.bolumListeYenile()
  93. def bolumListeYenile(self):
  94. self.extended = None
  95. self.bolumListeKutu.clear()
  96. for bolum in self.e.disk.partitions:
  97. _bolum = self.bolumBilgi(bolum, "GB")
  98. if self.sistemDiski and bolum.path == self.sistemDiski[0]:
  99. if self.sistemDiski[1]:
  100. item = self.treeWidgetItemOlustur(_bolum["yol"], self.e.d[self.e.s_d]["Sistem Diski"], _bolum["boyut"],
  101. "ext4", _bolum["bayraklar"], _bolum["no"])
  102. else:
  103. item = self.treeWidgetItemOlustur(_bolum["yol"], self.e.d[self.e.s_d]["Sistem Diski"], _bolum["boyut"],
  104. _bolum["dosyaSis"], _bolum["bayraklar"], _bolum["no"])
  105. elif self.takasDiski and bolum.path == self.takasDiski[0]:
  106. item = self.treeWidgetItemOlustur(_bolum["yol"], self.e.d[self.e.s_d]["Takas Alanı"], _bolum["boyut"],
  107. self.e.d[self.e.s_d]["takas"], _bolum["bayraklar"], _bolum["no"])
  108. else:
  109. item = self.treeWidgetItemOlustur(_bolum["yol"], "", _bolum["boyut"], _bolum["dosyaSis"],
  110. _bolum["bayraklar"], _bolum["no"])
  111. if _bolum["tur"] == parted.PARTITION_NORMAL:
  112. item.setIcon(0, QIcon("./resimler/primary.svg"))
  113. elif _bolum["tur"] == parted.PARTITION_EXTENDED:
  114. item.setIcon(0, QIcon("./resimler/extended.svg"))
  115. self.extended = item
  116. elif _bolum["tur"] == parted.PARTITION_LOGICAL:
  117. item.setIcon(0, QIcon("./resimler/logical.svg"))
  118. self.extended.addChild(item)
  119. self.extended.setExpanded(True)
  120. self.bolumListeKutu.addTopLevelItem(item)
  121. for bosBolum in self.e.disk.getFreeSpacePartitions():
  122. _toplam = 0
  123. _bolum = self.bolumBilgi(bosBolum, "GB")
  124. if float(_bolum["boyut"]) > 1:
  125. if _bolum["tur"] == 5:
  126. uzatilmisKalan = self.treeWidgetItemOlustur("", self.e.d[self.e.s_d]["Uzatılmış Bölüm Kalan"], _bolum["boyut"],
  127. "", "", "ayrilmamis")
  128. uzatilmisKalan.setIcon(0, QIcon("./resimler/blank.svg"))
  129. self.extended.addChild(uzatilmisKalan)
  130. self.extended.setExpanded(True)
  131. if _bolum["tur"] == parted.PARTITION_FREESPACE:
  132. _toplam = _toplam + float(_bolum["boyut"])
  133. ayrilmamis = self.treeWidgetItemOlustur("", self.e.d[self.e.s_d]["Ayrılmamış Bölüm"], _toplam, "", "", "ayrilmamis")
  134. ayrilmamis.setIcon(0, QIcon("./resimler/blank.svg"))
  135. self.bolumListeKutu.addTopLevelItem(ayrilmamis)
  136. def treeWidgetItemOlustur(self, bolum, kullanim, boyut, format, islev, bolumno):
  137. item = QTreeWidgetItem()
  138. item.setText(0, str(bolum))
  139. item.setText(1, str(kullanim))
  140. item.setText(2, str(boyut) + " GB ")
  141. item.setText(3, str(format))
  142. item.setData(0,Qt.UserRole, bolumno)
  143. return item
  144. def bolumSecildiFonk(self, tiklanan):
  145. if tiklanan.data(0,Qt.UserRole) != "ayrilmamis":
  146. self.bolumSilBtn.setEnabled(True)
  147. else:
  148. self.bolumSilBtn.setEnabled(False)
  149. def bolumFormatSecFonk(self, tiklanan):
  150. if tiklanan.data(0,Qt.UserRole) != "ayrilmamis":
  151. self.seciliDisk = tiklanan
  152. diskOzellikPencere = diskOzellikleriSinif(self)
  153. diskOzellikPencere.exec_()
  154. if self.sistemDiski[0] != "":
  155. self.e.milis_ayarlar["disk_bolum"] = self.sistemDiski[0]
  156. self.e.milis_ayarlar["disk_format"] = self.sistemDiski[1]
  157. if self.takasDiski[0] != "":
  158. self.e.milis_ayarlar["disk_takasbolum"] = self.takasDiski[0]
  159. else:
  160. self.e.milis_ayarlar["disk_takasbolum"] = ""
  161. if self.sistemDiski[0] == "":
  162. pass
  163. elif self.sistemDiski[0] != "" and self.takasDiski[0] == "":
  164. QMessageBox.information(self, self.e.d[self.e.s_d]["Bilgi"], self.e.d[self.e.s_d]["Takas Alanı Belirtmediniz Takas alanı ram miktarınızın düşük olduğu durumlarda ram yerine disk kullanarak işlemlerin devam etmesini sağlar."])
  165. self.e.ileri_dugme.setDisabled(False)
  166. self.bolumListeYenile()
  167. elif self.sistemDiski[0] != "" and self.takasDiski[0] != "":
  168. if self.sistemDiski[0] == self.takasDiski[0]:
  169. QMessageBox.warning(self, self.e.d[self.e.s_d]["Hata"], self.takasDiski[0] + self.e.d[self.e.s_d][" diskini hem sistem hem takas için seçtiniz. Aynı diski hem sistem hem takas olarak kullanmazsınız."])
  170. self.e.ileri_dugme.setDisabled(True)
  171. else:
  172. self.e.ileri_dugme.setDisabled(False)
  173. self.bolumListeYenile()
  174. def bolumEkleFonk(self):
  175. if self._en_buyuk_bos_alan():
  176. alan = self._en_buyuk_bos_alan()
  177. birincilSayi = len(self.e.disk.getPrimaryPartitions())
  178. uzatilmisSayi = ext_count = 1 if self.e.disk.getExtendedPartition() else 0
  179. parts_avail = self.e.disk.maxPrimaryPartitionCount - (birincilSayi + uzatilmisSayi)
  180. if not parts_avail and not ext_count:
  181. QMessageBox.warning(self, self.e.d[self.e.s_d]["Uyarı"],self.e.d[self.e.s_d]["Eğer dörtten fazla disk bölümü oluşturmak istiyorsanız birincil bölümlerden birini silip uzatılmış bölüm oluşturun.Bu durumda oluşturduğunuz uzatılmış bölümleri işletim sistemi kurmak için kullanamayacağınızı aklınızda bulundurun."])
  182. else:
  183. if parts_avail:
  184. if not uzatilmisSayi and parts_avail > 1:
  185. self.bolumOlustur(alan, parted.PARTITION_NORMAL)
  186. self.bolumListeYenile()
  187. elif parts_avail == 1:
  188. self.bolumOlustur(alan, parted.PARTITION_EXTENDED)
  189. self.bolumListeYenile()
  190. if uzatilmisSayi:
  191. ext_part = self.e.disk.getExtendedPartition()
  192. try:
  193. alan = ext_part.geometry.intersect(alan)
  194. except ArithmeticError:
  195. QMessageBox.critical(self, self.e.d[self.e.s_d]["Hata"], self.e.d[self.e.s_d]["Yeni disk bölümü oluşturmak için yeterli alan yok ! Uzatılmış bölümün boyutunu arttırmayı deneyiniz."])
  196. else:
  197. self.bolumOlustur(alan, parted.PARTITION_LOGICAL)
  198. self.bolumListeYenile()
  199. def bolumSilFonk(self):
  200. if self.bolumListeKutu.currentItem().data(0,Qt.UserRole) != "ayrilmamis":
  201. bolumNo = int(self.bolumListeKutu.currentItem().data(0,Qt.UserRole))
  202. for bolum in self.e.disk.partitions:
  203. if bolum.number == bolumNo:
  204. try:
  205. self.e.disk.deletePartition(bolum)
  206. self.bolumListeYenile()
  207. except parted.PartitionException:
  208. QMessageBox.warning(self, self.e.d[self.e.s_d]["Uyarı"], self.e.d[self.e.s_d]["Lütfen uzatılmış bölümleri silmeden önce mantıksal bölümleri siliniz."])
  209. self.bolumSilBtn.setDisabled(True)
  210. def bolumBilgi(self, bolum, birim):
  211. _bolum = {}
  212. _bolum["yol"] = bolum.path
  213. if birim == "GB":
  214. _bolum["boyut"] = format(bolum.getSize(unit=birim), '.2f')
  215. else:
  216. _bolum["boyut"] = bolum.getSize(unit=birim)
  217. _bolum["dosyaSis"] = "Bilinmeyen"
  218. if bolum.fileSystem:
  219. if bolum.fileSystem.type.startswith('linux-swap'):
  220. _bolum["dosyaSis"] = "takas"
  221. else:
  222. _bolum["dosyaSis"] = bolum.fileSystem.type
  223. try:
  224. _bolum["bayraklar"] = bolum.getFlagsAsString()
  225. except:
  226. pass
  227. _bolum["no"] = bolum.number
  228. _bolum["tur"] = bolum.type
  229. return _bolum
  230. def _en_buyuk_bos_alan(self):
  231. maks_boyut = -1
  232. alan = None
  233. alignment = self.aygit.optimumAlignment
  234. for _alan in self.e.disk.getFreeSpaceRegions():
  235. if _alan.length > maks_boyut and _alan.length > alignment.grainSize:
  236. alan = _alan
  237. maks_boyut = _alan.length
  238. return alan
  239. def bolumOlustur(self, alan, bolumTur):
  240. if bolumTur == parted.PARTITION_NORMAL or bolumTur == parted.PARTITION_EXTENDED:
  241. for bosBolum in self.e.disk.getFreeSpacePartitions():
  242. _bolum = self.bolumBilgi(bosBolum, "GB")
  243. if _bolum["tur"] == parted.PARTITION_FREESPACE:
  244. maksBoyut = float(_bolum["boyut"])
  245. elif bolumTur == bolumTur == parted.PARTITION_LOGICAL:
  246. for bosBolum in self.e.disk.getFreeSpacePartitions():
  247. _bolum = self.bolumBilgi(bosBolum, "GB")
  248. if _bolum["tur"] == 5:
  249. maksBoyut = float(_bolum["boyut"])
  250. alignment = self.aygit.optimalAlignedConstraint
  251. constraint = self.aygit.getConstraint()
  252. data = {
  253. 'start': constraint.startAlign.alignUp(alan, alan.start),
  254. 'end': constraint.endAlign.alignDown(alan, alan.end),
  255. }
  256. boyut, ok = QInputDialog().getDouble(self, self.e.d[self.e.s_d]['Bölüm oluştur'], self.e.d[self.e.s_d]['GB cinsinden boyut'], min=0.001,
  257. value=1, max=maksBoyut, decimals=3)
  258. if ok:
  259. data["end"] = int(data["start"]) + int(parted.sizeToSectors(float(boyut), "GiB", self.aygit.sectorSize))
  260. try:
  261. geometry = parted.Geometry(device=self.aygit, start=int(data["start"]), end=int(data["end"]))
  262. partition = parted.Partition(
  263. disk=self.e.disk,
  264. type=bolumTur,
  265. geometry=geometry,
  266. )
  267. self.e.disk.addPartition(partition=partition, constraint=constraint)
  268. except (parted.PartitionException, parted.GeometryException, parted.CreateException) as e:
  269. raise RuntimeError(e.message)
  270. def showEvent(self, event):
  271. self.e.setWindowTitle(self.e.d[self.e.s_d]["Disk Yapılandırma"])
  272. self.yenileButon.setText(self.e.d[self.e.s_d][" Yenile"])
  273. self.bolumListeKutu.headerItem().setText(0, self.e.d[self.e.s_d]["Bölüm"])
  274. self.bolumListeKutu.headerItem().setText(1, self.e.d[self.e.s_d]["Kullanım Şekli"])
  275. self.bolumListeKutu.headerItem().setText(2, self.e.d[self.e.s_d]["Boyut"])
  276. self.bolumListeKutu.headerItem().setText(3, self.e.d[self.e.s_d]["Dosya Sistemi"])
  277. self.yeniBolumBtn.setText(self.e.d[self.e.s_d][" Yeni Bölüm Ekle"])
  278. self.bolumSilBtn.setText(self.e.d[self.e.s_d][" Bölümü Sil"])
  279. self.blank_label.setText(self.e.d[self.e.s_d]["Birincil Bölüm"])
  280. self.extended_label.setText(self.e.d[self.e.s_d]["Uzatılmış Bölüm"])
  281. self.logical_label.setText(self.e.d[self.e.s_d]["Mantıksal Bölüm"])
  282. self.primary_label.setText(self.e.d[self.e.s_d]["Ayrılmamış Bölüm"])
  283. self.e.ileri_dugme.setDisabled(True)
  284. class diskOzellikleriSinif(QDialog):
  285. def __init__(self, ebeveyn=None):
  286. super(diskOzellikleriSinif, self).__init__(ebeveyn)
  287. self.e = ebeveyn
  288. disk_ = self.e.seciliDisk
  289. self.baslik_ = disk_.text(0)
  290. self.boyut_ = float(disk_.text(2).replace(" GB",""))
  291. format_ = disk_.text(3)
  292. self.setWindowTitle(self.baslik_)
  293. diskOzellikKutu = QGridLayout()
  294. self.setLayout(diskOzellikKutu)
  295. self.secenekAcilirListe = QComboBox()
  296. self.secenekAcilirListe.addItem(self.e.e.d[self.e.e.s_d]["Sistem Diski"])
  297. self.secenekAcilirListe.addItem(self.e.e.d[self.e.e.s_d]["Takas Alanı"])
  298. diskOzellikKutu.addWidget(self.secenekAcilirListe, 0, 0, 1, 1)
  299. self.diskBicimlendirKutu = QCheckBox(self.e.e.d[self.e.e.s_d]["Diski Biçimlendir"])
  300. if format_ != "ext4":
  301. self.diskBicimlendirKutu.setChecked(True)
  302. self.diskBicimlendirKutu.setDisabled(True)
  303. diskOzellikKutu.addWidget(self.diskBicimlendirKutu, 1, 0, 1, 1)
  304. tamamDugme = QPushButton(self.e.e.d[self.e.e.s_d]["Tamam"])
  305. tamamDugme.pressed.connect(self.tamamBasildiFonk)
  306. diskOzellikKutu.addWidget(tamamDugme, 2, 0, 1, 1)
  307. def tamamBasildiFonk(self):
  308. if self.secenekAcilirListe.currentText() == self.e.e.d[self.e.e.s_d]["Sistem Diski"]:
  309. komut = "LC_ALL=C df -h / | awk '{ print $3 }' | tail -n 1 | sed 's/G//'g"
  310. boyut = self.e.e.komutCalistirFonksiyon(komut)
  311. if self.boyut_ >= round(float(boyut)):
  312. self.e.sistemDiski = [self.baslik_]
  313. if self.diskBicimlendirKutu.isChecked():
  314. self.e.sistemDiski.append(True)
  315. else:
  316. self.e.sistemDiski.append(False)
  317. else:
  318. QMessageBox.critical(self, self.e.e.d[self.e.e.s_d]["Hata"], self.e.e.d[self.e.e.s_d]["Bu bölüm sistem diski oluşturmak için çok küçük ! Sistem diski seçilecek bölüm en azından {} GB boyutunda olmalıdır."].format(round(float(boyut))))
  319. elif self.secenekAcilirListe.currentText() == self.e.e.d[self.e.e.s_d]["Takas Alanı"]:
  320. self.e.takasDiski = [self.baslik_]
  321. if self.diskBicimlendirKutu.isChecked():
  322. self.e.takasDiski.append(True)
  323. else:
  324. self.e.takasDiski.append(False)
  325. QDialog.accept(self)