source: zero-lliurex-transparent-proxy/trunk/fuentes/install-files/usr/sbin/transparent-proxy-manager.py @ 5526

Last change on this file since 5526 was 5526, checked in by Juanma, 3 years ago

WIP

  • Property svn:executable set to *
File size: 6.0 KB
Line 
1#!/usr/bin/env python3
2import gi
3gi.require_version('Gtk', '3.0')
4from gi.repository import Gtk
5import shutil
6import os
7import subprocess
8
9import gettext
10gettext.textdomain('zero-lliurex-transparent-proxy')
11_ = gettext.gettext
12
13class mainWindow(Gtk.Window):
14    def __init__(self):
15        self.service="squid-ssl"
16        Gtk.Window.__init__(self,title="Transparent Proxy Manager")
17        self.box = Gtk.Grid()
18        self.box.set_column_spacing(20)
19        self.box.set_row_spacing(20)
20        self.add(self.box)
21        self.box.add(Gtk.Label(_("Enable Transparent Proxy")))
22        self.sw_Enable=Gtk.Switch()
23        self.sw_Enable.connect("state-set",self._on_sw_state)
24        self.box.attach(self.sw_Enable,1,0,2,1)
25        self.sw_Enable.set_state(self._is_service_running(self.service))
26        if self.sw_Enable.get_state():
27            service_label="Service up and running"
28        else:
29            service_label="Service deactivated"
30        self.lbl_State=Gtk.Label(_(service_label))
31        self.box.attach(self.lbl_State,0,1, 1,1)
32               
33    def _on_sw_state(self,widget,data):
34        sw_state=widget.get_state()
35        if not sw_state:
36            self.lbl_State.set_text("Enabling transparent proxy")
37            self._enable_proxy()
38            self.lbl_State.set_text("Service up and running")
39        else:
40            self.lbl_State.set_text("Disabling transparent proxy")
41            self._disable_proxy();
42            self.lbl_State.set_text("Service deactivated")
43
44    def _enable_proxy(self):
45        if not self._is_service_running(self.service):
46        #Copy the original squid.conf and make the needed changes
47            try:
48                shutil.copy ("/etc/squid/squid.conf","/etc/squid-ssl/squid.conf")
49                f=open("/etc/squid-ssl/squid.conf","r")
50                squidConf=f.readlines()
51                f.close()
52                squidConfSsl=[]
53                net_ip=''
54                for line in squidConf:
55                    if line.startswith("http_port"):
56                        if '127.0.' not in line:
57                            net_ip=line.split(' ')[1]
58                            net_ip=net_ip.split('.')[0:3]+'.0'
59                            lineHttps="##Transparent https -->\nhttps_port 10.2.1.254:3129 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/myCA.pem key=/etc/squid/ssl_cert/myCA.pem\n#ssl_bump client-first all\nssl_bump splice all\n## <--"
60                            line=line.rstrip("\n")+" intercept\n"
61                            line=line+lineHttps
62                    squidConfSsl.append(line)
63                f=open("/etc/squid-ssl/squid.conf","w")
64                f.writelines(squidConfSsl)
65                f.close()
66            except Exception as e:
67                print(str(e))
68       #Disable squid
69       self._disable_squid()
70       #Add iptables redirection
71       with open(os.devnull, 'wb') as hide_output:
72           iptablesCmd='iptables -t nat -A PREROUTING -s '+net_ip+'/16 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3129'
73           subprocess.Popen(iptablesCmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
74           iptablesCmd='iptables -t nat -A PREROUTING -s '+net_ip+'/16 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128'
75           subprocess.Popen(iptablesCmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
76       #Enable squid-ssl
77           cmd="update-rc.d squid-ssl defaults 30"
78           subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
79           cmd="invoke-rc.d squid-ssl restart"
80           subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
81               
82    def _disable_proxy(self):
83        with open(os.devnull, 'wb') as hide_output:
84            if self._is_service_running(self.service):
85                #stop the service
86                cmd='service '+self.service+' stop'
87                try:
88                    subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
89                except Exception as e:
90                    print(str(e))
91            #Clean the firewall
92            cmd='iptables -t nat -F'
93            try:
94                subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
95            except Exception as e:
96                print(str(e))
97            #Remove the service
98            cmd='update-rc.d squid-ssl remove > /dev/null'
99            try:
100                subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
101            except Exception as e:
102                print(str(e))
103        #Remove the conf files
104        if os.path.isfile('/etc/init.d/squid-ssl'):
105            os.remove('/etc/init.d/squid-ssl')
106        if os.path.isfile("/etc/squid-ssl/squid.conf"):
107            os.remove('/etc/squid-ssl/squid.conf')
108        self._enable_squid()
109
110    def _disable_squid(self):
111        with open(os.devnull, 'wb') as hide_output:
112            cmd='service squid stop'
113            subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
114            cmd='update-rc.d squid remove'
115            subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
116
117    def _enable_squid(self):
118        with open(os.devnull, 'wb') as hide_output:
119            cmd="update-rc.d squid defaults 30"
120            subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
121            cmd="invoke-rc.d squid restart"
122            subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
123
124    def _is_service_running(self,name):
125        retval=False
126        try:
127            with open(os.devnull, 'wb') as hide_output:
128                status = subprocess.Popen(['service', name, 'status'], stdout=hide_output, stderr=hide_output).wait()
129            if status==0:
130                retval=True
131        except Exception as e:
132            print(str(e))
133        return retval
134
135win = mainWindow()
136win.connect("delete-event", Gtk.main_quit)
137win.show_all()
138Gtk.main()
Note: See TracBrowser for help on using the repository browser.