Uygulama: Terminal Komutu Çalıştırma (IP Sorgulama)

Bu özellik, bir sistem yöneticisi için en kritik konulardan biridir. Pardus üzerinde çalışan grafik arayüzlü yönetim araçlarının (örneğin Lider Ahenk veya Pardus Mağaza) arka planda yaptığı şey tam olarak budur: Terminal komutlarını arayüzden tetiklemek.

Flutter'da bu işlem için dart:io kütüphanesini ve Process sınıfını kullanacağız.

İşte "IP Adresini Göster" özelliğini projemize ekleme adımları:


Mevcut lib/main.dart dosyamızı güncelleyeceğiz. Bu işlemde öğrencilere/izleyicilere Asenkron Programlama (işlem bitene kadar bekleme) mantığını da göstermiş olacağız.

1. Kodun Mantığı

  1. dart:io kütüphanesini çağıracağız.

  2. hostname -I komutunu çalıştırarak IP adresini isteyeceğiz.

  3. Komutun cevabı gelene kadar uygulamayı await (bekle) komutuyla senkronize edeceğiz.

  4. Gelen cevabı ekrana yazdıracağız.

2. Güncel main.dart Kodları

Dosyanızdaki kodları silip aşağıdaki güncel hali yapıştırabilirsiniz. Değişiklikleri yorum satırlarıyla belirttim.

Dart:
import 'package:flutter/material.dart';
import 'dart:io'; // 1. YENİLİK: Sistem kütüphanesi eklendi

void main() {
  runApp(const PardusUygulamasi());
}

class PardusUygulamasi extends StatelessWidget {
  const PardusUygulamasi({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Pardus Sistem Aracı',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blueAccent), // Sistemci rengi mavi olsun :)
        useMaterial3: true,
      ),
      home: const AnaSayfa(),
    );
  }
}

class AnaSayfa extends StatefulWidget {
  const AnaSayfa({super.key});

  @override
  State<AnaSayfa> createState() => _AnaSayfaState();
}

class _AnaSayfaState extends State<AnaSayfa> {
  // Değişkenlerimiz
  bool _logoGorunurMu = false;
  String _ipAdresi = "IP Adresi Sorgulanmadı"; // Ekranda görünecek yazı

  void _logoDurumuDegistir() {
    setState(() {
      _logoGorunurMu = !_logoGorunurMu;
    });
  }

  // 2. YENİLİK: Komut Çalıştırma Fonksiyonu
  // 'async' kelimesi, bu işlemin zaman alacağını belirtir.
  Future<void> _ipSorgula() async {
    try {
      // Process.run(Komut, [Parametreler])
      // Terminale 'hostname -I' yazmış gibi işlem yapar.
      final sonuc = await Process.run('hostname', ['-I']);
      
      setState(() {
        // sonuc.stdout bize terminal çıktısını verir.
        // .trim() baştaki ve sondaki gereksiz boşlukları siler.
        _ipAdresi = "IP Adresiniz:\n${sonuc.stdout.toString().trim()}";
      });
      
    } catch (e) {
      setState(() {
        _ipAdresi = "Hata oluştu: $e";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text("Pardus Yönetim Paneli"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // LOGO BÖLÜMÜ
            if (_logoGorunurMu)
              Container(
                margin: const EdgeInsets.only(bottom: 20),
                width: 150,
                child: Image.asset('assets/pardus_logo.png'),
              )
            else
              const Icon(Icons.computer, size: 100, color: Colors.grey),

            const SizedBox(height: 30),

            // 3. YENİLİK: IP BİLGİSİ GÖSTEREN KUTU
            Container(
              padding: const EdgeInsets.all(15),
              decoration: BoxDecoration(
                color: Colors.black12,
                borderRadius: BorderRadius.circular(10),
                border: Border.all(color: Colors.grey)
              ),
              child: Text(
                _ipAdresi,
                style: const TextStyle(fontSize: 18, fontFamily: 'monospace'),
                textAlign: TextAlign.center,
              ),
            ),

            const SizedBox(height: 30),

            // BUTONLAR
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ElevatedButton.icon(
                  onPressed: _logoDurumuDegistir, 
                  icon: const Icon(Icons.image),
                  label: Text(_logoGorunurMu ? "Logoyu Gizle" : "Logoyu Göster"),
                ),
                const SizedBox(width: 15),
                // IP SORGULA BUTONU
                ElevatedButton.icon(
                  onPressed: _ipSorgula, 
                  icon: const Icon(Icons.network_wifi),
                  label: const Text("IP Sorgula"),
                  style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.blueAccent,
                    foregroundColor: Colors.white,
                  ),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

3. Çalıştırma ve Test

Terminalden uygulamayı başlatın:

Bash:
flutter run -d linux

Ne Göreceksiniz?

  1. Uygulama açıldığında gri bir bilgisayar ikonu ve "IP Adresi Sorgulanmadı" yazısı göreceksiniz.

  2. "IP Sorgula" butonuna bastığınızda, uygulama anlık olarak Pardus sistemine soracak ve (örneğin) IP Adresiniz: 192.168.1.35 şeklinde cevabı ekrana basacaktır.

Kaynak Kod : https://github.com/nuritiras/ip_sorgulama

⚠️ Kritik Bilgi: "Yetki" Meselesi

Sistem yöneticisi olduğunuz için şu detayı öğrencileriniz sorabilir: "Hocam, sudo apt update gibi root yetkisi isteyen komutları nasıl çalıştırırız?"

Bu yöntem (Process.run) uygulamayı başlatan kullanıcının yetkileriyle çalışır. Eğer sudo gerektiren bir komut eklerseniz, uygulama arka planda şifre soramayacağı için hata verir. Bunun için pkexec (PolicyKit) kullanımı gerekir ki bu biraz daha ileri seviye bir konudur. Şimdilik ip, hostname, ls, whoami gibi kullanıcı yetkisiyle çalışan komutlar üzerinden gitmek eğitim için en doğrusudur.

Yorumlar

Bu blogdaki popüler yayınlar

Pardus ETAP 23 İçin Flutter ile Dijital "Öğrenci Seçici" Uygulaması

Uygulama: Pardus Logosunu Göster

Pardus ETAP 23 İçin Flutter ile Sanal Laboratuvar