summaryrefslogtreecommitdiff
path: root/romtal-sistem-dondurma/bin/romtalsd
diff options
context:
space:
mode:
authorSahan Yılmaz <[email protected]>2025-02-27 23:22:48 +0300
committerSahan Yılmaz <[email protected]>2025-02-27 23:22:48 +0300
commit945b66f91889e1d154fc7c29255932f7e43bcc9f (patch)
tree57ff430bf0842e681b7124638a594eda96c9a7cc /romtal-sistem-dondurma/bin/romtalsd
parent0e509587f07d6bbf771aae681adf24a1de42af99 (diff)
update
Diffstat (limited to 'romtal-sistem-dondurma/bin/romtalsd')
-rwxr-xr-xromtal-sistem-dondurma/bin/romtalsd351
1 files changed, 278 insertions, 73 deletions
diff --git a/romtal-sistem-dondurma/bin/romtalsd b/romtal-sistem-dondurma/bin/romtalsd
index 0555449..0c91d04 100755
--- a/romtal-sistem-dondurma/bin/romtalsd
+++ b/romtal-sistem-dondurma/bin/romtalsd
@@ -1,35 +1,60 @@
#!/usr/bin/env python3
import os
import subprocess
-import sys
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
+# Kurulum bayrağının konumu: Kullanıcının ana dizininde, yazma izni sorunu yaşamamak için.
+SETUP_FLAG_FILE = os.path.expanduser("~/.setup_tamam")
+
+# -------------------- Yardımcı Fonksiyonlar --------------------
def run_as_root(cmd_list):
"""
- Verilen komut listesini pkexec ile root olarak çalıştırır.
+ Belirtilen komut listesini pkexec kullanarak root ayrıcalıklarıyla çalıştırır.
+ Eğer kullanıcı root şifresini girmeyi iptal ederse, uygun uyarı mesajı verir.
"""
try:
subprocess.run(["pkexec"] + cmd_list, check=True)
except subprocess.CalledProcessError as e:
+ if e.returncode == 1:
+ raise RuntimeError("Root yetkilendirmesi iptal edildi! Lütfen root şifresini giriniz. Sistem, root yetkisi ile çalıştırılmalıdır.")
raise RuntimeError(f"Komut hatası: {e.cmd}, Çıkış kodu: {e.returncode}")
+def set_setup_complete_flag():
+ """
+ Kurulumun tamamlandığını belirten bayrak dosyasını oluşturur.
+ Böylece sonraki çalıştırmalarda kurulum sihirbazı tekrarlanmaz.
+ """
+ try:
+ with open(SETUP_FLAG_FILE, "w") as file:
+ file.write("setup_complete")
+ except Exception as ex:
+ print(f"Kurulum bayrağı ayarlanırken hata: {ex}")
+
+def read_users():
+ """
+ Sistemdeki mevcut kullanıcıları /etc/passwd dosyasından okur.
+ """
+ users = []
+ try:
+ with open("/etc/passwd", "r") as file:
+ for line in file:
+ parts = line.split(":")
+ if parts:
+ users.append(parts[0])
+ except Exception as ex:
+ print(f"Kullanıcılar okunurken hata: {ex}")
+ return users
+
def get_mount_device(mount_point):
"""
- /proc/mounts dosyasını okuyarak, verilen mount noktasının bağlı olduğu cihazı döner.
-
- Args:
- mount_point (str): İncelenecek mount noktası, örneğin "/media/root-ro".
-
- Returns:
- str veya None: Mount edilmiş aygıtın adı (örneğin, "/dev/sda1")
- veya belirtilen mount noktası bulunamazsa None.
+ Belirtilen mount noktasının bağlı olduğu aygıtı /proc/mounts dosyasından bulur.
"""
try:
- with open("/proc/mounts", "r") as f:
- for line in f:
+ with open("/proc/mounts", "r") as file:
+ for line in file:
parts = line.split()
if parts[1] == mount_point:
return parts[0]
@@ -37,48 +62,214 @@ def get_mount_device(mount_point):
pass
return None
-def overlay_status():
+def overlayroot_status():
"""
- /etc/overlayroot.conf dosyasını ve /media/root-rw mount noktasını kontrol eder:
- - Eğer /media/root-rw mount edilmişse, overlay aktif kabul edilir.
- - Aksi halde, /etc/overlayroot.conf dosyasını açar; içeriğinde "tmpfs" ifadesi varsa overlay aktif,
- yoksa overlay pasif olarak belirlenir.
+ Sistem Dondurma durumunu, /media/root-rw montajı ve /etc/overlayroot.conf dosyasına göre belirler.
"""
- # İlk olarak /media/root-rw mount edilip edilmediğini kontrol et
if get_mount_device("/media/root-rw"):
return True
-
- # /etc/overlayroot.conf kontrolü
conf_path = "/etc/overlayroot.conf"
if os.path.exists(conf_path):
try:
- with open(conf_path, "r") as f:
- content = f.read()
+ with open(conf_path, "r") as file:
+ content = file.read()
return "tmpfs" in content
except Exception:
return False
else:
- # Dosya yoksa paket kontrolü yapılabilir
try:
- result = subprocess.run(["dpkg", "-l", "romtal-sistem-dondurma"], capture_output=True, text=True)
+ result = subprocess.run(["dpkg", "-l", "romtal-sistem-dondurma"],
+ capture_output=True, text=True)
return "overlayroot" in result.stdout
except Exception:
return False
-class OverlayrootGUI(Gtk.Window):
+# -------------------- Kurulum Sihirbazı (Setup Wizard) --------------------
+class SetupWizard(Gtk.Window):
+ """
+ Üç aşamalı kurulum sihirbazı:
+ 1. Açıklama Sayfası: Neden non‑root kullanıcı kullanılmalı? İki seçenek sunar.
+ 2. Kullanıcı Oluşturma Sayfası: Önerilen "ogrenci" adında, sınırlı yetkili kullanıcı oluşturulur.
+ 3. Onay Sayfası: İşlemin tamamlandığı bildirildiği sayfa.
+
+ NOT: Notebook sekmeleri gizlenmiştir; kullanıcı yalnızca sayfa içindeki gezinme butonlarıyla ilerler.
+ """
def __init__(self):
- super().__init__(title="R.O.M.T.A.L Sistem Dondurma")
- self.set_default_size(400, 250)
+ super().__init__(title="Kurulum Sihirbazı")
+ self.set_default_size(600, 500)
self.set_border_width(20)
+ self.notebook = Gtk.Notebook()
+ self.notebook.set_show_tabs(False)
+ self.add(self.notebook)
+
+ self.create_explanation_page()
+ self.create_user_creation_page()
+ self.create_confirmation_page()
+
+ def create_explanation_page(self):
+ page = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15)
+ page.set_border_width(15)
- # Stil ayarları
- css = b"""
- button {
- font: 15px Arial;
- padding: 10px;
- margin: 5px;
- }
+ explanation_label = Gtk.Label()
+ explanation_label.set_markup(
+ "<b>R.O.M.T.A.L | https://rasimoneltml.meb.k12.tr/</b>\n\n"
+ "<b>Neden Yeni Bir Kullanıcı Oluşturmalısınız?</b>\n\n"
+ "Bu sistem, güvenlik açısından root yetkisinin kullanılmaması gereken bir yapıya sahiptir. "
+ "Root yetkisine sahip bir kullanıcı, sistem üzerinde tam kontrol sağlar ve güvenlik risklerini artırır.\n\n"
+ "Eğer sisteminizde zaten root yetkisine sahip olmayan bir kullanıcı mevcutsa, bu adımı atlayabilirsiniz. "
+ "Aksi halde, lütfen 'Devam Et' butonuna basarak örneğin 'ogrenci' adlı sınırlı yetkili bir kullanıcı oluşturun."
+ )
+ explanation_label.set_line_wrap(True)
+ page.pack_start(explanation_label, True, True, 0)
+
+ nav_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ skip_button = Gtk.Button(label="Atla")
+ continue_button = Gtk.Button(label="Devam Et")
+ skip_button.connect("clicked", self.on_skip_clicked)
+ continue_button.connect("clicked", self.on_continue_to_creation)
+ nav_box.pack_start(skip_button, True, True, 0)
+ nav_box.pack_start(continue_button, True, True, 0)
+ page.pack_start(nav_box, False, False, 0)
+
+ self.notebook.append_page(page, Gtk.Label(label="Açıklama"))
+
+ def create_user_creation_page(self):
+ page = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15)
+ page.set_border_width(15)
+
+ instruction_label = Gtk.Label(
+ label="Yeni bir kullanıcı oluşturmak için lütfen bilgileri giriniz. "
+ "Önerilen kullanıcı adı: 'ogrenci'"
+ )
+ instruction_label.set_line_wrap(True)
+ page.pack_start(instruction_label, False, False, 0)
+
+ form_grid = Gtk.Grid(column_spacing=10, row_spacing=10)
+ username_label = Gtk.Label(label="Kullanıcı Adı:")
+ self.username_entry = Gtk.Entry()
+ self.username_entry.set_text("ogrenci")
+ self.username_entry.set_placeholder_text("örn: ogrenci")
+
+ password_label = Gtk.Label(label="Şifre:")
+ self.password_entry = Gtk.Entry()
+ self.password_entry.set_placeholder_text("Güçlü bir şifre giriniz")
+ self.password_entry.set_visibility(False)
+
+ form_grid.attach(username_label, 0, 0, 1, 1)
+ form_grid.attach(self.username_entry, 1, 0, 1, 1)
+ form_grid.attach(password_label, 0, 1, 1, 1)
+ form_grid.attach(self.password_entry, 1, 1, 1, 1)
+ page.pack_start(form_grid, False, False, 0)
+
+ nav_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ back_button = Gtk.Button(label="Geri")
+ create_button = Gtk.Button(label="Kullanıcı Oluştur")
+ back_button.connect("clicked", lambda w: self.notebook.set_current_page(0))
+ create_button.connect("clicked", self.on_create_user)
+ nav_box.pack_start(back_button, True, True, 0)
+ nav_box.pack_start(create_button, True, True, 0)
+ page.pack_start(nav_box, False, False, 0)
+
+ self.notebook.append_page(page, Gtk.Label(label="Kullanıcı Oluşturma"))
+
+ def create_confirmation_page(self):
+ page = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15)
+ page.set_border_width(15)
+
+ confirmation_label = Gtk.Label(
+ label="Kullanıcı başarıyla oluşturuldu.\nKurulum tamamlandı.\n"
+ "Ana arayüze geçmek için 'Devam Et' butonuna basınız."
+ )
+ confirmation_label.set_line_wrap(True)
+ page.pack_start(confirmation_label, True, True, 0)
+
+ nav_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ back_button = Gtk.Button(label="Geri")
+ continue_button = Gtk.Button(label="Devam Et")
+ back_button.connect("clicked", lambda w: self.notebook.set_current_page(1))
+ continue_button.connect("clicked", self.on_final_continue)
+ nav_box.pack_start(back_button, True, True, 0)
+ nav_box.pack_start(continue_button, True, True, 0)
+ page.pack_start(nav_box, False, False, 0)
+
+ self.notebook.append_page(page, Gtk.Label(label="Onay"))
+
+ def on_skip_clicked(self, widget):
+ """
+ Eğer sisteminizde root yetkisine sahip olmayan bir kullanıcı mevcutsa,
+ bu adımı atlayarak ana arayüze geçin.
+ """
+ set_setup_complete_flag()
+ self.hide()
+ main_app = SistemDondurmaGUI()
+ main_app.connect("destroy", Gtk.main_quit)
+ main_app.show_all()
+
+ def on_continue_to_creation(self, widget):
+ """
+ 'Devam Et' butonuna basıldığında, kullanıcı oluşturma sayfasına geçiş yapılır.
+ """
+ self.notebook.set_current_page(1)
+
+ def on_create_user(self, widget):
+ """
+ Kullanıcı adı ve şifre bilgilerini alır, ardından önerilen non‑root kullanıcıyı oluşturur.
+ Eğer girilen kullanıcı adı zaten sistemde mevcutsa hata mesajı gösterip farklı bir isim istenir.
+ Kullanıcı oluşturma ve şifre ayarlama işlemleri tek bir pkexec çağrısında birleştirilmiştir.
+ """
+ username = self.username_entry.get_text().strip()
+ password = self.password_entry.get_text().strip()
+
+ if not username or not password:
+ self.show_dialog("Kullanıcı adı ve şifre boş bırakılamaz!", True)
+ return
+
+ if username in read_users():
+ self.show_dialog(f"{username} adlı kullanıcı zaten mevcut! Lütfen farklı bir kullanıcı adı giriniz.", True)
+ return
+
+ try:
+ cmd = ["sh", "-c", f"useradd -m --shell /bin/bash {username} && echo '{username}:{password}' | chpasswd"]
+ run_as_root(cmd)
+ self.show_dialog(f"{username} adlı kullanıcı başarıyla oluşturuldu.", False)
+ self.notebook.set_current_page(2)
+ except Exception as e:
+ self.show_dialog(f"Kullanıcı oluşturulurken hata: {e}", True)
+
+ def on_final_continue(self, widget):
+ """
+ Kurulum tamamlandığında bayrak dosyası oluşturulur ve ana arayüz açılır.
+ """
+ set_setup_complete_flag()
+ self.hide()
+ main_app = SistemDondurmaGUI()
+ main_app.connect("destroy", Gtk.main_quit)
+ main_app.show_all()
+
+ def show_dialog(self, message, is_error=False):
+ dialog = Gtk.MessageDialog(
+ transient_for=self,
+ flags=0,
+ message_type=Gtk.MessageType.ERROR if is_error else Gtk.MessageType.INFO,
+ buttons=Gtk.ButtonsType.OK,
+ text=message
+ )
+ dialog.run()
+ dialog.destroy()
+# -------------------- Ana Uygulama Arayüzü (Sistem Dondurma GUI) --------------------
+class SistemDondurmaGUI(Gtk.Window):
+ def __init__(self):
+ super().__init__(title="R.O.M.T.A.L Sistem Dondurma")
+ self.set_default_size(500, 300)
+ self.set_border_width(20)
+ self.setup_css()
+ self.overlayroot_aktif = overlayroot_status()
+ self.create_ui()
+
+ def setup_css(self):
+ css = b"""
+ label { font-size: 14px; }
"""
style_provider = Gtk.CssProvider()
style_provider.load_from_data(css)
@@ -87,41 +278,37 @@ class OverlayrootGUI(Gtk.Window):
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)
-
- self.overlay_enabled = overlay_status()
- self.create_ui()
-
+
def create_ui(self):
grid = Gtk.Grid(column_spacing=10, row_spacing=10)
+ grid.set_column_homogeneous(True)
- self.enable_btn = Gtk.Button(label="Sistem Dondurma Aktif Et")
- self.disable_btn = Gtk.Button(label="Sistem Dondurma Devre Dışı Bırak")
+ self.status_label = Gtk.Label()
+ self.enable_btn = Gtk.Button(label="Sistem Dondurma Aktif Et")
self.enable_btn.connect("clicked", self.enable_overlayroot)
+ self.disable_btn = Gtk.Button(label="Sistem Dondurma Devre Dışı")
self.disable_btn.connect("clicked", self.disable_overlayroot)
- self.status_label = Gtk.Label()
- self.update_status()
-
- # Footer label ekliyoruz
- self.footer_label = Gtk.Label(label="Made By R.O.M.T.A.L | https://rasimoneltml.meb.k12.tr/")
+ footer_label = Gtk.Label(label="R.O.M.T.A.L | https://rasimoneltml.meb.k12.tr/")
grid.attach(self.status_label, 0, 0, 2, 1)
grid.attach(self.enable_btn, 0, 1, 1, 1)
grid.attach(self.disable_btn, 1, 1, 1, 1)
- grid.attach(self.footer_label, 0, 2, 2, 1)
+ grid.attach(footer_label, 0, 2, 2, 1)
self.add(grid)
-
+ self.update_status()
+
def update_status(self):
- status_text = "Şuanki Durum: " + ("Aktif" if self.overlay_enabled else "Devre Dışı")
- self.status_label.set_markup(f"<b>{status_text}</b>")
- self.enable_btn.set_sensitive(not self.overlay_enabled)
- self.disable_btn.set_sensitive(self.overlay_enabled)
-
+ status_text = "Aktif" if self.overlayroot_aktif else "Devre Dışı"
+ self.status_label.set_markup(f"<b>Sistem Dondurma Durumu: {status_text}</b>")
+ self.enable_btn.set_sensitive(not self.overlayroot_aktif)
+ self.disable_btn.set_sensitive(self.overlayroot_aktif)
+
def show_dialog(self, message, is_error=False):
dialog = Gtk.MessageDialog(
- parent=self,
+ transient_for=self,
flags=0,
message_type=Gtk.MessageType.ERROR if is_error else Gtk.MessageType.INFO,
buttons=Gtk.ButtonsType.OK,
@@ -129,7 +316,7 @@ class OverlayrootGUI(Gtk.Window):
)
dialog.run()
dialog.destroy()
-
+
def enable_overlayroot(self, widget):
try:
cmd = [
@@ -139,34 +326,52 @@ class OverlayrootGUI(Gtk.Window):
"echo 'overlayroot=\"tmpfs\"' >> /etc/overlayroot.conf")
]
run_as_root(cmd)
- self.overlay_enabled = True
+ self.overlayroot_aktif = True
self.update_status()
- self.show_dialog("Overlayroot aktif edildi!\nDeğişikliklerin geçerli olması için yeniden başlatın.")
+ self.show_dialog("Sistem Dondurma başarıyla aktif edildi.\nDeğişikliklerin geçerli olması için sistemi yeniden başlatın.")
except Exception as e:
- self.show_dialog(f"Hata oluştu: {str(e)}", is_error=True)
-
+ self.show_dialog(f"Sistem Dondurma etkinleştirilirken hata: {e}", True)
+
def disable_overlayroot(self, widget):
+ """
+ Sistem Dondurma işlemini devre dışı bırakır.
+ Eğer /media/root-ro mount edilmişse ilgili dizin üzerinden işlem yapılır;
+ aksi halde, /etc/overlayroot.conf dosyası doğrudan güncellenir.
+ """
try:
device = get_mount_device("/media/root-ro")
- if not device:
- raise RuntimeError("'/media/root-ro' mount edilen cihaz bulunamadı.")
- cmd = [
- "sh", "-c",
- (f"mount -o remount,rw {device} && "
- "rm -f /media/root-ro/etc/overlayroot.conf && "
- "echo 'overlayroot_cfgdisk=\"disable\"' > /media/root-ro/etc/overlayroot.conf && "
- "echo 'overlayroot=\"\"' >> /media/root-ro/etc/overlayroot.conf")
- ]
+ if device:
+ cmd = [
+ "sh", "-c",
+ (f"mount -o remount,rw {device} && "
+ "rm -f /media/root-ro/etc/overlayroot.conf && "
+ "echo 'overlayroot_cfgdisk=\"disable\"' > /media/root-ro/etc/overlayroot.conf && "
+ "echo 'overlayroot=\"\"' >> /media/root-ro/etc/overlayroot.conf")
+ ]
+ else:
+ cmd = [
+ "sh", "-c",
+ ("rm -f /etc/overlayroot.conf && "
+ "echo 'overlayroot_cfgdisk=\"disable\"' > /etc/overlayroot.conf && "
+ "echo 'overlayroot=\"\"' >> /etc/overlayroot.conf")
+ ]
run_as_root(cmd)
- self.overlay_enabled = False
+ self.overlayroot_aktif = False
self.update_status()
- self.show_dialog("Overlayroot devre dışı bırakıldı!\nDeğişikliklerin geçerli olması için yeniden başlatın.")
+ self.show_dialog("Sistem Dondurma başarıyla devre dışı bırakıldı.\nDeğişikliklerin geçerli olması için sistemi yeniden başlatın.")
except Exception as e:
- self.show_dialog(f"Hata oluştu: {str(e)}", is_error=True)
+ self.show_dialog(f"Sistem Dondurma devre dışı bırakılırken hata: {e}", True)
+# -------------------- Uygulama Giriş Noktası --------------------
if __name__ == "__main__":
- win = OverlayrootGUI()
- win.connect("destroy", Gtk.main_quit)
- win.show_all()
+ if not os.path.exists(SETUP_FLAG_FILE):
+ wizard = SetupWizard()
+ wizard.connect("destroy", Gtk.main_quit)
+ wizard.show_all()
+ else:
+ app = SistemDondurmaGUI()
+ app.connect("destroy", Gtk.main_quit)
+ app.show_all()
Gtk.main()
+