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

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

WIP

  • Property svn:executable set to *
File size: 7.9 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.dbg=1
16        self.service="squid-ssl"
17        Gtk.Window.__init__(self,title="Transparent Proxy Manager")
18        self.box = Gtk.Grid()
19        self.box.set_column_spacing(20)
20        self.box.set_row_spacing(20)
21        self.add(self.box)
22        self.box.add(Gtk.Label(_("Enable Transparent Proxy")))
23        self.sw_Enable=Gtk.Switch()
24        self.sw_Enable.connect("state-set",self._on_sw_state)
25        self.box.attach(self.sw_Enable,1,0,2,1)
26        self.lbl_State=Gtk.Label('')
27        self.box.attach(self.lbl_State,0,1, 1,1)
28        self.spinner = Gtk.Spinner()
29        self.box.attach(self.spinner, 2, 2, 2, 3)
30
31        self.sw_Enable.set_state(self._is_service_running(self.service))
32        if self.sw_Enable.get_state():
33            service_label="Service up and running"
34        else:
35            service_label="Service deactivated"
36        self.lbl_State.set_text(_(service_label))
37               
38    def _debug(self,msg):
39        if self.dbg==1:
40            print("DBG: "+str(msg))
41
42    def _on_sw_state(self,widget,data):
43        self.spinner.start()
44        sw_state=widget.get_state()
45        if not sw_state:
46            self.lbl_State.set_text(_("Enabling transparent proxy"))
47            self._enable_proxy()
48            self.lbl_State.set_text(_("Service up and running"))
49        else:
50            self.lbl_State.set_text(_("Disabling transparent proxy"))
51            self._disable_proxy();
52            self.lbl_State.set_text(_("Service deactivated"))
53        self.spinner.stop()
54        self._debug("Done")
55
56    def _enable_proxy(self):
57        self._debug("Enabling proxy")
58        if not self._is_squidssl_installed():
59            self._install_squidssl()
60        if not self._is_service_running(self.service):
61        #Copy the original squid.conf and make the needed changes
62            self._debug("Configuring squid-ssl")
63            try:
64                shutil.copy ("/etc/squid/squid.conf","/etc/squid-ssl/squid.conf")
65                f=open("/etc/squid-ssl/squid.conf","r")
66                squidConf=f.readlines()
67                f.close()
68                squidConfSsl=[]
69                net_ip=''
70                for line in squidConf:
71                    if line.startswith("http_port"):
72                        if '127.0.' not in line:
73                            net_ip=line.split(' ')[1]
74                            net_ip=net_ip.split('.')[0:3]
75                            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## <--"
76                            line=line.rstrip("\n")+" intercept\n"
77                            line=line+lineHttps
78                    squidConfSsl.append(line)
79                f=open("/etc/squid-ssl/squid.conf","w")
80                f.writelines(squidConfSsl)
81                f.close()
82            except Exception as e:
83                print(str(e))
84            #Add iptables redirection
85            self._debug("Adding iptables rules")
86            net_ip='.'.join(net_ip)+".0"
87            with open(os.devnull, 'wb') as hide_output:
88                iptablesCmd='iptables -t nat -A PREROUTING -s '+net_ip+'/16 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3129'
89                subprocess.Popen(iptablesCmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
90                iptablesCmd='iptables -t nat -A PREROUTING -s '+net_ip+'/16 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128'
91                subprocess.Popen(iptablesCmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
92            #Enable squid-ssl
93                self._debug("Enabling squid-ssl service")
94                cmd="update-rc.d squid-ssl defaults 30"
95                subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
96                cmd="invoke-rc.d squid-ssl restart"
97                subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
98        else:
99            self._debug("Service is already running")
100        #Disable squid
101        self._disable_squid()
102               
103    def _disable_proxy(self):
104        with open(os.devnull, 'wb') as hide_output:
105            if self._is_service_running(self.service):
106                #stop the service
107                cmd='service '+self.service+' stop'
108                try:
109                    subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
110                except Exception as e:
111                    print(str(e))
112            #Clean the firewall
113            cmd='iptables -t nat -F'
114            try:
115                subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
116            except Exception as e:
117                print(str(e))
118            #Remove the service
119            cmd='update-rc.d squid-ssl remove > /dev/null'
120            try:
121                subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
122            except Exception as e:
123                print(str(e))
124        #Remove the conf files
125        self._debug("Removing config files")
126        if os.path.isfile("/etc/squid-ssl/squid.conf"):
127            os.remove('/etc/squid-ssl/squid.conf')
128        self._enable_squid()
129
130    def _disable_squid(self):
131        self._debug("Disabling squid")
132        with open(os.devnull, 'wb') as hide_output:
133            cmd='service squid stop'
134            subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
135            cmd='update-rc.d squid remove'
136            subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
137
138    def _enable_squid(self):
139        self._debug("Enabling squid")
140        with open(os.devnull, 'wb') as hide_output:
141            cmd="update-rc.d squid defaults 30"
142            subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
143            cmd="invoke-rc.d squid restart"
144            subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
145
146    def _is_service_running(self,name):
147        retval=False
148        try:
149            with open(os.devnull, 'wb') as hide_output:
150                cmd='service '+name+' status'
151                status = subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
152            if status==0:
153                retval=True
154        except Exception as e:
155            print(str(e))
156        self._debug("Squid-ssl running: "+str(retval))
157        return retval
158
159    def _is_squidssl_installed(self):
160        retval=False
161        try:
162            with open(os.devnull, 'wb') as hide_output:
163                cmd='dpkg -s squid-ssl | grep status | grep installed'
164                status = subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
165            if status==0:
166                retval=True
167        except Exception as e:
168            print(str(e))
169
170        self._debug("Squid-ssl installed: "+str(retval))
171        return retval
172
173    def _install_squidssl(self):
174        self._debug("Installing needed packages")
175        self.lbl_State.set_text(_("Installing packages"))
176        with open(os.devnull, 'wb') as hide_output:
177            cmd='zero-repos-update'
178            status = subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
179            cmd='zero-installer install squid-ssl'
180            status = subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
181        self.lbl_State.set_text(_("Enabling transparent proxy"))
182
183win = mainWindow()
184win.connect("delete-event", Gtk.main_quit)
185win.show_all()
186Gtk.main()
Note: See TracBrowser for help on using the repository browser.