Pardus için Proxy ve Etki Alanı Ayarlama Yazılımı İhtiyacımıza Binaen

Merhabalar;
Türkiye Hudut ve Sahiller Sağlık Genel Müdürlüğünde Bilgisayar Mühendisi unvanıyla çalışmaktayım. Kurum olarak Pardus işletim sistemine geçeceğiz ancak bilindiği gibi Pardus’ta etki alanı ve proxy ile ilgili ayarları uçbirimden komutlar yazarak yapabiliyoruz.

kurumda Pardus ile ilgili test ve geliştirmeler tarafıma verilmiştir. Bir noktada Pardus gönüllülerinin yardımına ihtiyacım var.

Etki alanı ve proxy ayarlarını komut yazmak yerine tek bir tıklamayla yapabilmek için tarafımdan program yazmam istenmiştir. Ben de java programlama dili ve netbeans geliştirme ortamı kullanmaktayım.

Geliştireceğim yazılım ile ilgili fikirlerim şunlardır:

1 ilk önce gerekli kütüphaneleri kontrol edecek ve yüklü olmayanları tespit edip gösterecek.
2. gösterdiği kütüphaneleri tek tıklama ve ardından onay mesajından sonra otomatik kuracak (synaptic paket yöneticisi benzeri)
3. paketler kurulduktan sonra proxy ve etki alanı ile ilgili ayarlama bölümü aktif olacak
4. son kullanıcı için basit ve sade ayarlamalar bir tıklama ve onay mesajından sonra otomatikman yapılacak yani son kullanıcı komut yazmakla vb durumlarla uğraşmayacak.

ben birtakım denemeler yaptım. yaptığım denemeler ile ilgili kodları paylaşıyorum:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
*

  • @author root
    */

public class ProcessBuilderExample2 {

public static void main(String[] args) {

    ExecutorService pool = Executors.newSingleThreadExecutor();

    ProcessBuilder processBuilder = new ProcessBuilder();

    // Run this on Windows, cmd, /c = terminate after this run
    processBuilder.command("bash", "-c", "apt-get install moreutils");

    try {

        Process process = processBuilder.start();

        System.out.println("process ping...");
        
        ProcessReadTask task = new ProcessReadTask(process.getInputStream());
        
        BufferedReader reader =
                new BufferedReader(new InputStreamReader(process.getInputStream()));

        String line;
       //boolean beklemede;
        while ((line = reader.readLine()) != null) {
         //line = reader.readLine();
         //beklemede=process.isAlive();
         System.out.println("sonuç1 = " +process.toHandle().toString());
            
         System.out.println(line);
         
         //beklemede=process.isAlive();
         
         System.out.println("sonuç2 = " +process.toHandle().toString());
            
        }
        OutputStream os=process.getOutputStream();
        PrintStream ps=new PrintStream(os);
        System.out.println(" Devam Etmek istiyor musunuz? [E: evet /H: hayır]");
        String cevap;
        Scanner cevapOku=new Scanner(System.in);
        cevap=cevapOku.nextLine();
        if(!((cevap.equals("e"))||(cevap.equals("E"))))
        {
            System.out.println("vazgeçildi");
            System.exit(0);
        
        }
        
        ps.println(cevap);
        ps.flush();

        int exitCode = process.waitFor();
        System.out.println("\nExited with error code : " + exitCode);
        Future<List<String>> future = (Future<List<String>>) pool.submit(task);

        // no block, can do other tasks here
        System.out.println("process task1...");
        System.out.println("process task2...");

        List<String> result = future.get();
        for (String s : result) {
            System.out.println(s);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        pool.shutdown();
    }
}

private static class ProcessReadTask implements Callable<List<String>> {

    private InputStream inputStream;

    public ProcessReadTask(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    @Override
    public List<String> call() {
        return new BufferedReader(new InputStreamReader(inputStream))
			.lines()
			.collect(Collectors.toList());
    }
}

}

Burada bir paketi yükletmeye çalıştığım görülmektedir.

Buraya kadarki yaptığım denemelerin ekran görüntüsü şöyledir:

yapmaya çalıştığım şey aynı uçbirimde olduğu gibi ilgili paketin kurulumu için yazdığım programın kullanıcıdan onay istemesidir. bununla ilgili örnek bir görsel paylaşıyorum:

görüldüğü üzere uçbirim onay isterken benim kodlar sonsuz döngüde bekliyor.

ne yapmam gerekir?

1 Beğeni

apt-get install moreutils komutunda -y parametresi kullanırsanız kullanıcı otomatik kabul etmiş olur.
apt-get install -y moreutils

cevabınız için teşekkür ederim ama ben otomatik kabul etsin istemiyorum. yani yazdığınız üzere otomatik onay istemiyorum. son bir kez daha onay istesin istiyorum. bu noktada tıkandım. aynı uçbirimde olduğu gibi son bir kez daha devam etmek istiyor musunuz? tarzı bir onay isteyemez mi?

Benim sorunum uçbirimde bir uygulama yüklenecekken dvam etmek istiyor musunuz tarzı bir onay mesajı görüntülniyor ve kullanıcı ona verirse paket yüklemesi gerçekleşiyor. ben bunun aynısını kendi yazılımım için yapabilir miyim? benim yazılımım onay mesajı göstermek yerine sonsuz döngüde bekliyor. benim çözmeye çalıştığım sorun budur. kullanıcıdan hiçbir onay istemeden doğrudan yükleme yapmayı sakıncalı buluyorum. bu yüzden " apt-get install -y" ibaresi ile onay almadan kurdurmak istemiyorum. uçbirimdeki gibi son bir kez daha onay istesin istiyorum.

yapmaya çalıştığım şeyin ekran görüntüsü ektedir

Uygulamanız sonsuz döngüde beklemiyor. Arka planda sizden cevap bekliyor. Programınızı terminalden çalıştırarak beklediği cevabı görebilirsiniz. İstediğiniz şekilde ilerlemek çok uğraştırıcı bir süreç olacaktır. Oluşturduğunuz process’de boru (pipe) kullanımını araştırınız.

**Uygulamanız sonsuz döngüde beklemiyor. Arka planda sizden cevap bekliyor. ** demişsiniz evet bunu biliyorum ama sonsuz döngünün içerisinden çıkamadığını tespit etmiştim. bu yüzden sonsuz döngüde bekliyor şeklinde yazdım. döngünün içine ve dışına çıktı komutları yazarak döngünün içinden çıkamadığını gördüğüm için böyle yazdım.

Uygulama benden cevap bekliyor ama neden “devam etmek istiyor musunuz?” uyarısını göremedim? uygulamanın bu uyarıyı da çıktı olarak göstermesi gerekmez miydi?

Processlerin pipe yapılarını inceleyiniz.

merhaba

Uygulamayı uçbirim üzerinden de derleyici üzerinden de çalıştırdığımda dediğiniz gibi benden cevap beklememektedir ve verdiğim cevaba hiçbir şekilde tepki vermemektedir. Her iki konuman da çalıştırdığımda uygulama benden cevap beklemek yerine öylece bekliyor. kendim cevap versem de hiçbir şekilde işlemiyor. uygulama öylece bekliyor. bunun nedeni ne olabilir?

bu sorunu aştığımda yazılımı başarıyla tamamlayacağım gibime geliyor

uygulamanın derleyici üzerinden çalıştırılması:

verdiğim cevaplara tepki verilmemiş:

şekilde de görüldüğü gibi 2 dk boyunca bekledim ve programı sonlandırıp tekrar çalıştırdığımda hiçbir şeyin değişmedi görülmektedir.

uçbirimden jar dosyasının çalışma görüntüsü:

1 Beğeni

Soruyu doğru anladıysam bu kadar büyük bir uğraşa gerek yok.
aşağıdaki komutlar sistemde proxy ayarlarını yapar
export http_proxy=“http://proxy-adresi
export https_proxy=“http://proxy-adresi
export no_proxy=“http://proxy-adresi

Bununla ilgili birkaç satırlık bir bash scripti işinizi çözecektir.

export komutu ile yapılan ayarlamalar o anki oturum ile sınırlıdır. bu sebeple export komutu içeren bir scriptin her oturum başladığında çalıştırılması gerekir. ayrıca linuxta gtk ayrı uçbirim için ayrı hatta bazı uygulamalar için ayrı ayrı proxy ayarlamaları yapmak gerekir. etki alanına dahil olma aşaması için de baya baya komut yazmak gerektiren bir süreç. bana kalsa bu yazılım için uğraşmam ama kurumda her bilgisayara pardus kurulacağı için her bilgisayara komut yazarak ve dosyalarla oynayarak düzenlemeler yapmak oldukça zahmetli bir süreç.

1 Beğeni

pipeinputstream ve pipeoutputstream yapılarını inceledim hatta pipe bağlantıları kullanarak prosesten okuma yapabiliyorum ama hala en sondaki devam etmek istiyor musunuz? ibaresi gelmiyor ve hala tercih yapamıyorum. sorunuma hala cevap arıyorum. bu proje bittiğinde kurumumdaki son kullanıcıların pardusa geçişi hızlanacak. kurumumuzda bilgi işlem birimi her bilgisayar için uçbirimde ayrı ayrı uğraşma zahmetinden kurtulacak. her şey domaine almakla bitmiyor. bizim kurum internete proxy ile çıkıyor. hadi firefoxta proxy ayarlarını yaptık diyelim peki sisteme güncelleme geldiğinde ne yapacağız ya da pardus mağazasından uygulama yüklemek istediğimizde proxy ayarları nasıl olacak? tüm bunlar için satır satır komut yazmak yerine hepsini tek tıklamayla yapabilecek bir uygulama gerekiyor. ya da hiç bunlarla uğraşmayalım pardusun yeni sürümünde bunları basitçe yapabileceğmiz bir gui geliştirsinler o gui yardımıyla kolay bir şekilde ayarları yapalım. bizler de pardus göçünü bu gui çıkana kadar erteleyelim bir öneri sunmak gerekirse yeni sürümlerde böyle bir gui olsun ve bu gui çıkana dek pardus göçünü erteleyelim. bir an önce pardusa geçişimiz isteniyorsa ve pardus teşvik ediliyorsa yardımınızı bekliyoruz

2 Beğeni

Açılışta çalışacak bir script ile veya kalıcı environment’a ekleyebilirsiniz böylece kullanıcı sürekli belirttiğiniz proxy’i kullanmış olur.No proxy ile bypass etmiş olursunuz.
Veya:
Sisteme reverse proxy kurup proxy chaining veya yönlendirmelerle de daha esnek hareketler yapabilirsiniz.
Yaşadığınız sorun Pardus ile ilgili değil Java ile ilgili.Tavsiyem soruyu stackoverflow gibi soru-cevap platformlarında sormanız/cevaplara bakmanız.Sonuca daha çabuk ulaşırsınız.

düşündüğüm projenin ilk adımını kendi deneme yanılmalarım ile tamamladım. inputsream ve outputstream yapıları zaten kendileri pipe mantığı ile işliyor. çözüm aslında çok basitmiş. yardımcı olmak isteyenlere teşekkür ederim ama bu ortama gönlüm biraz kırıldı. pipe yapılarını inceleyin demek yerine daha fazla yardımcı olunabilirdi. rahatsızlık verdiğim herkesten özür dilerim. ihtiyacı olana yardımcı olması açısından çözümü paylaşıyorum. çözüm PrintWriter yapısını kullanmakmış. Devam etmek istiyor musunuz kısmını da birazcık “korsan yolla” halletmiş oldum. o kadar da olsun gayri.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Scanner;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
0 paket yükseltilecek, 0 yeni paket kurulacak, 0 paket kaldırılacak ve 0 paket yükseltilmeyecek.
0 paket yükseltilecek, 0 yeni paket kurulacak, 0 paket kaldırılacak ve 0 paket yükseltilmeyecek.
 * and open the template in the editor.
 */
/**
 *
 * @author root
 */
public class Yeter {

    public static void main(String[] args) throws IOException, InterruptedException {
        String[] command = {
            "/bin/sh",
            "-c",
            "apt-get install moreutils"
        };
        Process cocuk = Runtime.getRuntime().exec(command);

        //Process pr = new ProcessBuilder("sh").start();
        PrintWriter pw = new PrintWriter(cocuk.getOutputStream());
        //pw.println("apt remove ttf-mscorefonts-installer");
        //pw.println("n");

        //pw.flush();
        InputStreamReader in = new InputStreamReader(cocuk.getInputStream());
        Scanner cevap = new Scanner(System.in);
        char c;
        String satir = null;
        BufferedReader reader = new BufferedReader(in);
        while ((satir = reader.readLine()) != null) {
            System.out.println(satir);
            if (satir.endsWith("ek disk alanı kullanılacak.")||satir.endsWith("disk alanı boşalacak.")) {
                System.out.println("Devam etmek istiyor musunuz? [E: evet/H: hayır]");
                c = cevap.next().charAt(0);
                pw.println(c);
                pw.flush();
            }else if(satir.equalsIgnoreCase("0 paket yükseltilecek, 0 yeni paket kurulacak, 0 paket kaldırılacak ve 0 paket yükseltilmeyecek.")){
                System.out.println("sistemde herhangi bir değişiklik yapılmadı");
            }
        }
        int exitCode = cocuk.waitFor();
        System.out.println("\nYazılım " + exitCode+" çıkış kodu ile sonlanmıştır");
        if(exitCode==100){
            System.out.println("deb paket kurucu (dpkg) kilitlidir.\r\nönceki kurulum veya kaldırma işlemleri yarıda kesilmiş olabilir\r\nveya başka bir yükleme - kaldırma işlemi açık olabilir");
        }else if(exitCode==1){
            System.out.println("İşlem iptal edildi");
        }else if(exitCode==0){
            System.out.println("işlem başarılı");
        }
        

    }
}
1 Beğeni
© 2020 TÜBİTAK