あれこれ備忘録@はてなブログ

勉強したことやニュースや出来事を備忘録として書いていきます

このブログには広告が含まれます

Gladeを使ってPuppy LinuxのOpenVPN接続GUIクライアントを作ってみた

Puppy LinuxでOpenVPN - あれこれ備忘録 〜はてなブログ支店〜

 

PuppyでOpenVPNが使えることが先日わかりました。

 

PuppyにはGladeというGUIエディタがあります。

 

TahrPup6.0.2の場合、devx_tahr_6.0.2.sfsがあるとPythonが使えます。

 

パッケージマネージャーで、python-gtk2_2.24.0をインストールするとPythonGtkを使ったGUIアプリケーションを作ることができます。

 

少しやってみました。

 

スタートメニューのユーティリティからGladeを起動します。

 

f:id:t_massann:20151130152208p:plain

 

こんな感じで作りました。

 

左側の"Toplevels"から"Window"を選んで、"Containers"から縦に3つに分割するレイアウトと上以外のところを横2つに分割するレイアウトを使用しました。

 

右の"Signals"から"GtkWidget"の"delete-event"で"on_window1_delete_event"をセットします。

 

これはウィンドウを閉じた時に発生するイベントと呼び出される関数名の設定です。

 

f:id:t_massann:20151130152657p:plain

 

同様に.opvnファイルを開くボタンなどでも"Signals"で"GtkButtonの"clicked"イベントに呼び出される関数名をセットしていきます。

 

f:id:t_massann:20151130152909p:plain

 

ボタンの見た目は"General"の"Stock button"で、あらかじめ用意されている絵と文字のセットから選ぶことができました。

 

f:id:t_massann:20151130153041p:plain

 

できたらGtkBuilder形式で保存してください。

 

#! /usr/bin/python
# _*_ coding:utf-8 _*_

import sys
import os
import signal
import subprocess
import threading
import pygtk
pygtk.require("2.0")
import gtk
#import gtk.glade

def connect_openvpn(self):
    cmd = "openvpn --config " + self.ovpnfilename
    print cmd.split()
    self.p = subprocess.Popen(args=cmd.split())

class OpenVPNConnect:

    def __init__(self):
        self.builder = gtk.Builder()
        self.builder.add_from_file("ovpn_connect.glade")
        self.builder.connect_signals(self)
        
        self.window = self.builder.get_object("window1")
        self.window.show()
        
    def on_window1_delete_event(self, windows, event):
        sys.exit(0)

    def on_btn_filechoose_clicked(self, widget):
        dialog = gtk.FileChooserDialog("Open..",
                                                    None,
                                                    gtk.FILE_CHOOSER_ACTION_OPEN,
                                                    (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                                     gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        dialog.set_default_response(gtk.RESPONSE_OK)
        
        response = dialog.run()
        if response == gtk.RESPONSE_OK:
            self.ovpnfilename = dialog.get_filename()
            self.builder.get_object("entry1").set_text(self.ovpnfilename)
        dialog.destroy()

    def on_btn_connect_clicked(self, widget):
        self.ovpnfilename = self.builder.get_object("entry1").get_text()
        self.builder.get_object("btn_connect").set_sensitive(False)
        self.builder.get_object("btn_disconnect").set_sensitive(True)
        t = threading.Thread(target=connect_openvpn, args=(self,))
        t.daemon = True
        t.start()
        t.join()

    def on_btn_disconnect_clicked(self, widget):
        #self.p.kill()
        os.kill(self.p.pid, signal.SIGTERM)
        self.builder.get_object("btn_connect").set_sensitive(True)
        self.builder.get_object("btn_disconnect").set_sensitive(False)

    def main(self):
        gtk.main()

if __name__ == "__main__":
    app = OpenVPNConnect()
    app.main()

 

いろいろなネットの情報を見てこんな感じにしてみました。

 

スレッドや別のコマンドを実行する方法も使われています。

 

ボタンやテキストボックスのプロパティについてはset、get関数があるようです。

 

set_text()とかset_sensitive()などです。

 

そのあたりは各自ネットで調べていただければ、と思います。

 

例えば、ここです。

 

Python + gtk + gladeでGUIアプリケーションの作成 その1 - Symfoware

 

ほぼ初めてのPythonでのプログラムですが、一応動くものが出来ました。

 

.ovpnファイルかどうかを調べるとかスレッドあたりの使い方などおかしな所はあると思います。

 

また、スレッドから呼び出される関数をクラス内に書くとエラーで、グローバルにしなくてはいけないとか、グローバル変数にイベントから呼び出された関数で値をセットしているのにエラーが出たり、Pythonが理解できていないのでわからないところがありました。

 

それでも、すぐにこのくらいのプログラムが出来てしまうのは魅力的だと思います。

 

{}がなく、段落(インデント)だけであることで書き易く、読みやすいソースができるので初心者でも簡単なのかも知れません。

 

VPNがつながったかどうかメッセージを見なければわからないので、Puppyでは.pyファイルを右クリックして"Run in Terminal"で実行してください。

 

PuppyではGUIプログラムから端末が呼び出されるソフトが多いので違和感はないのではないかと思います。

 

GUIの中にメッセージが出るほうがより洗練されているのでしょうね。

 

私の環境ではこれで十分なのでこれで完成とします。

 

UbuntuでもNetwork-ManagerのOpenVPNメニューが.ovpnでは登録できず、証明書ファイルを分けなければならないのでこういうGUIクライアントがあると便利だと思います。

 

Ubuntu 13.10でOpenVPNに接続する方法 - あれこれ備忘録 〜はてなブログ支店〜

 

Ubuntuユーザはどうしているのでしょうね?

 

ちなみにこのプログラムをUbuntuで試してみたところ、エラーが出てつながりませんでした。残念。