source: lliurex-guard/trunk/fuentes/lliurex-guard-n4d.install/usr/share/n4d/python-plugins/Lliurex-guard.py @ 1150

Last change on this file since 1150 was 1150, checked in by mabarracus, 5 years ago

Updated changelog

File size: 7.0 KB
Line 
1import os
2import json
3import shutil
4from subprocess import check_output
5
6class LliurexGuard:
7        def __init__(self):
8                pass
9        #def __init
10       
11       
12        def applyPolicy(self, config):
13                try:
14                        print json.dumps(config)
15                        print config["policy"]
16                        print config["whitelist"]
17                        print config["blacklist"]
18                        print config["classdomain"]
19                       
20                        self.generateSquidList("/etc/squid/lliurex/allow-dst-domains.conf", config["whitelist"], config["classdomain"]);
21                        self.generateSquidList("/etc/squid/lliurex/deny-dst-domains.conf", config["blacklist"]);
22                       
23                       
24                        return self.generateSquidConf(config["policy"], config["classdomain"], config["whitelist"], config["blacklist"]);
25               
26               
27                except:
28                        return {"status":"false"}
29               
30               
31               
32       
33        def getBlackList(self):
34               
35                try:
36                        # Reading blacklist specification
37                        blacklistfile="/etc/lliurex-guard-data/config/blacklist.json"
38                        if os.path.isfile(blacklistfile):
39                                json_data=open(blacklistfile)
40                                print json_data
41                                conf = json.load(json_data)
42                                json_data.close()
43                               
44                               
45                        else:
46                                return {"status":"false"}
47                       
48                        # Reading blacklist active items
49                        blacklistConfig="/etc/lliurex-guard-easy/currentConfig.json"
50                        if os.path.isfile(blacklistConfig):
51                                json_data=open(blacklistConfig)
52                                activeItems = json.load(json_data)
53                                json_data.close()
54                        else:
55                                return {"status":"false"}
56                       
57                        for item in conf["domainLists"]:
58                                if item["file"] in activeItems["blacklist"]:
59                                        item["active"]="True"
60                                else:
61                                        item["active"]="False"
62                                               
63                       
64                        return {"status":"true", "response":conf}
65                except Error:
66                        print "[LliurexGuard]:getBlacList Exception "+str(Error)
67                        return {"status":"true", "response":conf}
68               
69               
70        def getWhiteList(self):         
71                try:
72                        classdomain="False"
73                        customWhite="False"
74                       
75                        # Reading blacklist active items
76                        Config="/etc/lliurex-guard-easy/currentConfig.json"
77                        if os.path.isfile(Config):
78                                json_data=open(Config)
79                                activeItems = json.load(json_data)
80                                json_data.close()
81                                if "z_customwhite.list" in activeItems["whitelist"]:
82                                        customWhite="True"
83                                if activeItems["class_domain"]!="":
84                                        classdomain="True"
85                               
86                        internal_domain=objects['VariablesManager'].get_variable('INTERNAL_DOMAIN')
87                        whitelist=[{"file":None, "domain":internal_domain, 
88                        "description_short":"Classroom Domain", 
89                        "description": "Allow access to classroom services such as JClic, local Moodle...",
90                        "active":classdomain},
91                        {"file":"z_customwhite.list", 
92                        "description_short":"Custom List", 
93                        "description": "Customize your own white list with other domains",
94                        "active":customWhite}]
95                       
96                        response={"domainLists":whitelist};
97                        return {"status":"true", "response": response}
98
99                except:
100                        return {"status":"false"}
101                       
102                       
103                       
104        def getCustomList(self, file):
105                filepath="/etc/lliurex-guard-data/config/lists/"+file
106                if os.path.isfile(filepath):
107                        fd=open(filepath)
108                        list=fd.read()
109                        fd.close()
110                        return {"status":"true", "response":list}
111                       
112                else: 
113                        return  {"status":"false"}
114                pass
115               
116               
117        def setCustomList(self, content, file):
118                try:
119                        filepath="/etc/lliurex-guard-data/config/lists/"+file
120                        fd=open(filepath, "w")
121                        list=fd.write(content)
122                        fd.close()
123                        return {"status":"true"}
124                except:
125                        return {"status":"false"}
126               
127               
128                pass
129
130        def generateSquidConf(self, template="default", classdomain="",  whitelist=[], blacklist=[]):
131                '''
132                Generates /etc/squid.conf with a specified template: default, deny or allow
133                '''
134                try:
135                        orig=open("/etc/squid/squid.conf", "r");
136                        dest=open("/tmp/squid.conf", "w");
137       
138                        ignore_line=False;
139       
140                        for line in orig:
141                                print line
142                               
143                                # Activate writing after hack
144                                if (line=="http_access deny !Safe_ports\n"):
145                                        ignore_line=False;
146                                       
147                                if ignore_line==False:
148                                        dest.write(line);
149                               
150                               
151                                # Deactivate writing before hack
152                                if (line=="http_access deny deny_dst\n"):
153                                        ignore_line=True;
154                               
155                                        if template=="deny":
156                                                dest.write("\n\n# LliureXGuard: Only allow domains specified\n");
157                                                dest.write("http_access deny !allow_domain\n");
158                                                dest.write("# End LliureXGuard\n\n");
159                                               
160                                        elif template=="allow":
161                                                dest.write("\n\n# LliureXGuard:  Allow domains except the specified in deny_dst_domains\n");
162                                                dest.write("http_access deny deny_domain\n");
163                                                dest.write("\n# Regulat Expressions\n");
164                                                dest.write("http_access deny deny_domain_expr\n");
165                                                dest.write("# End LliureXGuard\n\n");
166                                               
167                                        else:
168                                                dest.write("\n\n# LliureXGuard:  Default behaviour\n");
169                                                dest.write("http_access deny deny_domain\n");
170                                                dest.write("http_access deny deny_domain_expr\n");
171                                                dest.write("http_access allow allow_domain\n");
172                                                dest.write("# End LliureXGuard\n\n");
173                                               
174                       
175                       
176                        dest.close()
177                        orig.close()
178                       
179                        shutil.copyfile("/tmp/squid.conf", "/etc/squid/squid.conf")
180                       
181                        # Setting current config
182                        fileConfig=open("/etc/lliurex-guard-easy/currentConfig.json","w")
183                        fileConfig.write('{\n"current_config":"'+str(template)+'",\n');
184                        fileConfig.write('"class_domain":"'+str(classdomain)+'",\n');
185                        fileConfig.write('"whitelist":'+str(whitelist).replace("'", '"')+',\n');
186                        fileConfig.write('"blacklist":'+str(blacklist).replace("'", '"')+'\n}');
187                        fileConfig.close();
188
189                       
190                       
191                        os.system("service squid restart")
192                       
193                       
194                        return {"status":"true"}
195                       
196                except:
197                       
198                        return {"status":"false"}
199                                       
200                                       
201        def generateSquidList(self, destfile, listfiles, extradomain=""):
202                ''' Generates list file
203                 Commonly /etc/squid/lliurex/allow-dst-domains.conf  as whitelist
204                 or /etc/squid/lliurex/deny-dst-domains.conf as blacklist
205                 if listfiles is an empty list, generates an empty file (useful to reset config)
206                 '''
207               
208                path    ='/etc/lliurex-guard-data/config/lists/'
209       
210                dest=open(destfile, "w")
211       
212                for file in listfiles:
213                        fullpath=path+str(file)
214                        if(os.path.isfile(fullpath)):
215                                f=open(fullpath, "r");
216                                for line in f:
217                                        if line!="\n":
218                                                dest.write(line);
219                               
220                                f.close()
221                               
222                # Adding extra domain
223                if extradomain!="":
224                        dest.write("\n"+extradomain);
225                dest.close();
226       
227       
228        def getStatus(self):
229                '''
230                Returns status of squid (running, or stop), and which template is running
231                '''
232                # Getting current template
233               
234                try:
235                        currentConf="/etc/lliurex-guard-easy/currentConfig.json"
236                       
237                        json_data=open(currentConf)
238                        conf = json.load(json_data)
239                        json_data.close()
240                        current_conf=conf["current_config"];
241               
242                except:
243                        current_conf=["unconfigured"];
244
245                                       
246                # Getting status
247               
248                try:
249                        output=check_output(["pidof", "squid"])
250                        return {"status":"running", "config":current_conf}
251                except:
252                        return  {"status":"stop", "config":current_conf}
253                       
254                pass
255               
256        '''def getGuardTemplate(self, template="default"):
257                '' '
258                Return Configuration specified in "template", if it's not
259                specified, returns current configuration file.
260                '' '
261                fullpath="/etc/lliurex-guard-easy/"+str(template)+".json"
262               
263                if not os.path.isfile(fullpath):
264                        return {"policy":"none"}
265                else:
266                        json_data=open(fullpath)
267                        data=json.load(json_data)
268                        json_data.close();
269                        return data;
270               
271        def setGuardTemplate(self,  conffile, config):
272                # Saves json config to file conffile
273                fullpath="/etc/lliurex-guard-easy/"+str(template)+".json"
274                # TO  DO
275        '''
276               
Note: See TracBrowser for help on using the repository browser.