Changeset 5557


Ignore:
Timestamp:
Jul 19, 2017, 11:56:11 AM (20 months ago)
Author:
Juanma
Message:

Initial Release

Location:
zero-lliurex-transparent-proxy/trunk/fuentes
Files:
9 added
3 edited

Legend:

Unmodified
Added
Removed
  • zero-lliurex-transparent-proxy/trunk/fuentes/debian/rules

    r5517 r5557  
    1111
    1212%:
    13         dh $@
     13        dh $@ --with llxsrc
    1414       
    1515       
  • zero-lliurex-transparent-proxy/trunk/fuentes/install-files/usr/sbin/transparent-proxy-manager.py

    r5532 r5557  
    22import gi
    33gi.require_version('Gtk', '3.0')
    4 from gi.repository import Gtk
     4from gi.repository import Gtk, GObject, Gdk
    55import shutil
    66import os
    77import subprocess
     8import time
     9import threading
     10import sys
    811
    912import gettext
     
    1114_ = gettext.gettext
    1215
     16class squidManager():
     17    def __init__(self,callback):
     18        threading.Thread.__init__(self)
     19        self.systemSquid="squid"
     20        self.sslSquid="squid-ssl"
     21        self.systemSquidConf="/etc/squid/squid.conf"
     22        self.sslSquidConf="/etc/squid-ssl/squid.conf"
     23        self.sslCert="/etc/squid-ssl/ssl_cert/lliurexCA.pem"
     24        self.systemSquidService="squid"
     25        self.sslSquidService="squid-ssl"
     26        self.server_ip=''
     27        self.sslPort=3129
     28        self.dbg=0
     29        self.callback=callback
     30    #def __init__
     31
     32    def _debug(self,msg):
     33        if self.dbg==1:
     34            print("DBG: "+str(msg))
     35    #def _debug
     36
     37    def _exe_cmd(self,cmd):
     38        status=-1
     39        self._debug("Executing "+cmd)
     40        cmdOptions=''
     41        try:
     42            with open(os.devnull, 'wb') as hide_output:
     43                if ("|") in cmd:
     44                    status = subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output,shell=True).wait()
     45                else:
     46                    status = subprocess.Popen(cmd.split(' '), stdout=hide_output, stderr=hide_output).wait()
     47        except:
     48            status=1
     49        self._debug("$?: "+str(status))
     50        return status
     51    #def _exe_cmd
     52
     53    def enable_transparent_proxy(self):
     54        self._debug("Enabling proxy")
     55        if not self._is_squidssl_installed():
     56            self._install_squidssl()
     57        if not self.is_service_running(self.sslSquidService):
     58            self._generate_SSL_cert()
     59            #Copy the original squid.conf and make the needed changes
     60            self._generate_SquidSSl_config()
     61            #Add iptables redirection
     62            self._add_iptables_redirection()
     63                #Disable squid
     64            self._disable_service(self.systemSquidService)
     65            #Enable squid-ssl
     66            self._debug("Enabling "+self.sslSquidService+" service")
     67            self._enable_service(self.sslSquidService)
     68        else:
     69            self._debug("Service is already running")
     70        GObject.idle_add(self.callback,1)
     71    #def enable_transparent_proxy
     72               
     73    def _generate_SquidSSl_config(self):
     74       self._debug("Configuring "+self.sslSquidService)
     75       try:
     76           shutil.copy (self.systemSquidConf,self.sslSquidConf)
     77           f=open(self.sslSquidConf,"r")
     78           squidConfOrig=f.readlines()
     79           f.close()
     80           squidConfMod=[]
     81           net_ip=''
     82           for line in squidConfOrig:
     83               if line.startswith("http_port"):
     84                   if '127.0.' not in line:
     85                       server_ip=line.split(' ')[1]
     86                       self.server_ip=server_ip.split(':')[0]
     87                       lineHttps="##Transparent https -->\nhttps_port "+self.server_ip+":"+str(self.sslPort)+" intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert="+self.sslCert+" key="+self.sslCert+"\n#ssl_bump client-first all\nssl_bump splice all\n## <--"
     88                       line=line.rstrip("\n")+" intercept\n"
     89                       line=line+lineHttps
     90               squidConfMod.append(line)
     91           f=open(self.sslSquidConf,"w")
     92           f.writelines(squidConfMod)
     93           f.close()
     94       except Exception as e:
     95           print(str(e))
     96    #def _generate_SquidSSl_config
     97
     98    def _generate_SSL_cert(self):
     99        if not os.path.isfile(self.sslCert):
     100            if not os.path.isdir(os.path.dirname(self.sslCert)):
     101                os.makedirs(os.path.dirname(self.sslCert))
     102            self._exe_cmd('openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -extensions v3_ca -keyout '+self.sslCert+' -out '+self.sslCert+' -batch')
     103    #def _generate_SSL_cert
     104
     105    def _add_iptables_redirection(self):
     106       self._debug("Adding iptables rules")
     107       net_ip=self.server_ip.split('.')[0:3]
     108       net_ip='.'.join(net_ip)+".0"
     109       self._exe_cmd('iptables -t nat -A PREROUTING -s '+net_ip+'/16 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports '+str(self.sslPort))
     110       self._exe_cmd('iptables -t nat -A PREROUTING -s '+net_ip+'/16 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128')
     111    #def _add_iptables_redirection
     112
     113    def disable_transparent_proxy(self):
     114        if self.is_service_running(self.sslSquidService):
     115            #stop the service
     116            self._disable_service(self.sslSquidService)
     117        #Clean the firewall
     118        try:
     119            self._exe_cmd('iptables -t nat -F')
     120        except Exception as e:
     121            print(str(e))
     122        #Remove the conf files
     123        self._debug("Removing config files")
     124        if os.path.isfile(self.sslSquidConf):
     125            os.remove(self.sslSquidConf)
     126        #Restore system's squid
     127        self._enable_service(self.systemSquidService)
     128        GObject.idle_add(self.callback)
     129    #def disable_transparent_proxy
     130
     131    def _disable_service(self,service):
     132        self._debug("Disabling "+service)
     133        try:
     134            self._exe_cmd('service '+service+' stop')
     135            self._exe_cmd('update-rc.d '+service+' remove')
     136        except Exception as e:
     137            print(str(e))
     138    #def _disable_service
     139
     140    def _enable_service(self,service):
     141        self._debug("Enabling "+service)
     142        try:
     143            self._exe_cmd("update-rc.d "+service+" defaults 30")
     144            self._exe_cmd("invoke-rc.d "+service+" restart")
     145        except Exception as e:
     146            print(str(e))
     147    #def _enable_service
     148
     149    def is_service_running(self,name):
     150        retval=False
     151        try:
     152            status=self._exe_cmd('service '+name+' status')
     153            if status==0:
     154                retval=True
     155        except Exception as e:
     156            print(str(e))
     157        self._debug("Squid-ssl running: "+str(retval))
     158        return retval
     159    #def is_service_running
     160
     161    def _is_squidssl_installed(self):
     162        retval=True
     163        status=-1
     164        try:
     165            status=self._exe_cmd('dpkg --get-selections squid-ssl | grep deinstall')
     166            if status==0:
     167                retval=False
     168        except Exception as e:
     169            print(str(e))
     170        self._debug("Squid-ssl installed: "+str(retval))
     171        self._debug(status)
     172        return retval
     173    #def _is_squidssl_installed
     174
     175    def _install_squidssl(self):
     176        self._debug("Installing needed packages")
     177        self._exe_cmd('zero-repos-update')
     178        self._exe_cmd('zero-installer install squid-ssl')
     179    #def _install_squidssl
     180
    13181class mainWindow(Gtk.Window):
    14182    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")))
     183        self.dbg=0
     184        Gtk.Window.__init__(self,title=_("Transparent Proxy"))
     185        self.connect("delete-event", Gtk.main_quit)
     186        vbox=Gtk.VBox()
     187        img_area=Gtk.Box(spacing=6)
     188#        img=Gtk.Image.new_from_file('/usr/share/icons/Vibrancy-Colors/status/36/network-receive.png')
     189        img=Gtk.Image(stock=Gtk.STOCK_DISCONNECT)
     190        img_area.add(img)
     191        img_area.add(Gtk.Label(_("Transparent proxy management")))
     192        img_area.set_border_width(5)
     193        img_area.show_all()
     194        frame=Gtk.Frame()
     195        frame.set_border_width(5)
     196#        frame.set_label(_("Transparent proxy management"))
     197        box = Gtk.Grid()
     198        box.set_border_width(5)
     199        box.set_column_spacing(20)
     200        box.set_row_spacing(30)
     201        self.add(vbox)
     202        vbox.add(img_area)
     203        vbox.add(frame)
     204        frame.add(box)
     205        box.attach(Gtk.Label(_("Enable Transparent Proxy")),0,1,1,1)
    23206        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)
     207        box.attach(self.sw_Enable,1,1,1,1)
    26208        self.lbl_State=Gtk.Label('')
    27         self.box.attach(self.lbl_State,0,1, 1,1)
     209        box.attach(self.lbl_State,0,2, 3,2)
    28210        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))
     211        box.attach(self.spinner, 0, 3, 2, 2)
     212        self.squidManager=squidManager(self._callback)
     213        self.sw_Enable.set_active(self.squidManager.is_service_running(self.squidManager.sslSquidService))
    32214        if self.sw_Enable.get_state():
    33215            service_label="Service up and running"
     
    35217            service_label="Service deactivated"
    36218        self.lbl_State.set_text(_(service_label))
     219        self.sw_Enable.connect("state-set",self._on_sw_state)
     220        self.show_all()
     221    #def __init__
    37222               
    38223    def _debug(self,msg):
    39224        if self.dbg==1:
    40225            print("DBG: "+str(msg))
     226    #def _debug
    41227
    42228    def _on_sw_state(self,widget,data):
     229        self._debug("State changed")
     230        widget.set_sensitive(False)
    43231        self.spinner.start()
    44232        sw_state=widget.get_state()
    45233        if not sw_state:
     234            self._debug("Enabling transparent proxy")
    46235            self.lbl_State.set_text(_("Enabling transparent proxy"))
    47             self._enable_proxy()
     236            th=threading.Thread(target=self.squidManager.enable_transparent_proxy)
     237            th.start()
     238        else:
     239            self.lbl_State.set_text(_("Disabling transparent proxy"))
     240            th=threading.Thread(target=self.squidManager.disable_transparent_proxy)
     241            th.start()
     242        self._debug("Done")
     243    #def _on_sw_state
     244
     245    def _callback(self,action=None):
     246        self.spinner.stop()
     247        if action:
    48248            self.lbl_State.set_text(_("Service up and running"))
    49249        else:
    50             self.lbl_State.set_text(_("Disabling transparent proxy"))
    51             self._disable_proxy();
    52250            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 
     251        self.sw_Enable.set_sensitive(True)
     252    #def _callback
     253
     254def read_key():
     255    try:
     256        f=open("/etc/n4d/key")
     257        f.close()
     258        #hack
     259        return True
     260    except:
     261        return False
     262
     263status=read_key()
     264
     265if not status:
     266    print("[!] You need root privileges to run this program [!]")
     267    label = Gtk.Label(_("You need root privileges to run transparfent-proxy-manager"))
     268    dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
     269    dialog.vbox.pack_start(label,True,True,10)
     270    label.show()
     271    dialog.set_border_width(6)
     272    response = dialog.run()
     273    dialog.destroy()
     274    sys.exit(0)
     275
     276GObject.threads_init()
     277Gdk.threads_init()
    183278win = mainWindow()
    184 win.connect("delete-event", Gtk.main_quit)
    185 win.show_all()
    186279Gtk.main()
  • zero-lliurex-transparent-proxy/trunk/fuentes/zero-lliurex-transparent-proxy.zlaunchers/zero-lliurex-transparent-proxy.app

    r5517 r5557  
    88Comment[es]=Configura el proxy transparente con soporte para SSL
    99Comment[ca]=Configura el proxy transparent amb suport per a SSL
    10 Comment[ca_ES@valencia.UTF-8]=Configura el mòdul del DNI-e al Firefox
    11 Comment[ca_ES@valencia]=Configura el mòdul del DNI-e al Firefox
    12 Icon=tproxy
     10Comment[ca_ES@valencia.UTF-8]=Configura el proxy transparent amb suport per a SSL
     11Comment[ca_ES@valencia]=Configura el proxy transparent amb suport per a SSL
     12Icon=zero-lliurex-transparent-proxy
    1313Category=Network
    1414ScriptPath=zero-lliurex-transparent-proxy.zmd
     
    1616Locks=zero-lliurex-transparent-proxy
    1717Using=pe
    18 Groups=*
     18Groups=adm
Note: See TracChangeset for help on using the changeset viewer.