Changeset 4737


Ignore:
Timestamp:
May 12, 2017, 11:51:54 AM (2 years ago)
Author:
daduve
Message:

Adding update option to GUI

Location:
lliurex-remote-installer/trunk/fuentes
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-gui.install/usr/share/lliurex-remote-installer/Core.py

    r3960 r4737  
    33import DebBox
    44import ExecBox
     5import UpdateBox
    56import N4dManager
    67import os
     
    4546                self.exec_box=ExecBox.ExecBox()
    4647               
     48                self.dprint("Creating UpdateBox...")
     49                self.update_box=UpdateBox.UpdateBox()
     50               
    4751                # ####
    4852               
  • lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-gui.install/usr/share/lliurex-remote-installer/LliurexRemoteInstaller.py

    r4474 r4737  
    5050                self.debs_button=builder.get_object("debs_button")
    5151                self.exes_button=builder.get_object("exes_button")
     52                self.update_button=builder.get_object("update_button")
    5253               
    5354               
     
    9697                self.exec_box=self.core.exec_box
    9798                self.stack.add_titled(self.exec_box,"exes","Executables")
     99                self.update_box=self.core.update_box
     100                self.stack.add_titled(self.update_box,"update","Update")
    98101               
    99102                self.stack.add_titled(self.login_overlay,"login","Login")
     
    147150                self.deb_box.set_info(var)
    148151                self.exec_box.set_info(var)
     152                self.update_box.set_info(var)
     153               
    149154               
    150155               
     
    162167                self.debs_button.set_name("OPTION_BUTTON")
    163168                self.exes_button.set_name("OPTION_BUTTON")
     169                self.update_button.set_name("OPTION_BUTTON")
    164170                self.login_msg_label.set_name("ERROR_LABEL")
    165171                       
     
    173179                self.debs_button.connect("clicked",self.debs_button_clicked)
    174180                self.exes_button.connect("clicked",self.exes_button_clicked)
     181                self.update_button.connect("clicked",self.update_button_clicked)
    175182                self.main_window.connect("delete_event",self.check_changes)
    176183               
     
    192199        def validate_user_thread(self):
    193200               
    194                 self.login_ret=self.core.n4d.validate_user(self.user_entry.get_text(),self.password_entry.get_text(),self.server_ip_entry.get_text())
     201                user=self.user_entry.get_text()
     202                password=self.password_entry.get_text()
     203               
     204               
     205                # DELETE ME
     206                if user=="":
     207                        user="lliurex"
     208                if password=="":
     209                        password="lliurex"
     210               
     211                self.login_ret=self.core.n4d.validate_user(user,password,self.server_ip_entry.get_text())
    195212               
    196213        #def validate_user_thread
     
    270287                                pkg_list.append(pkg)
    271288                        COMMENT=COMMENT+pkg_list
     289                if self.core.var['update']['activate'] == "True":
     290                        COMMENT.append("UPDATE: Sheduled from "+self.core.var['update']['url'])
     291                        #COMMENT.append(self.core.var['update']['url'])
     292                        COMMENT.append("")
    272293                if COMMENT not in [None,"",[]]:
    273294                        COMMENT='\n'.join(COMMENT)
     
    312333                if self.stack.get_visible_child_name()=="exes":
    313334                        selected="sh"
     335                if self.stack.get_visible_child_name()=="update":
     336                        selected="update"
    314337                       
    315338                       
     
    346369                        self.debs_button.set_name("OPTION_BUTTON")
    347370                        self.exes_button.set_name("OPTION_BUTTON")
     371                        self.update_button.set_name("OPTION_BUTTON")
    348372               
    349373        #def apt_button_clicked
     
    391415                        self.debs_button.set_name("SELECTED_OPTION_BUTTON")
    392416                        self.exes_button.set_name("OPTION_BUTTON")
     417                        self.update_button.set_name("OPTION_BUTTON")
    393418               
    394419        #def debs_button_clicked
     
    436461                        self.debs_button.set_name("OPTION_BUTTON")
    437462                        self.exes_button.set_name("SELECTED_OPTION_BUTTON")
     463                        self.update_button.set_name("OPTION_BUTTON")
    438464               
    439465        #def exes_button_clicked
     466       
     467       
     468        def update_button_clicked(self,widget):
     469               
     470                change_child=True
     471               
     472                if self.stack.get_visible_child_name()=="apt":
     473                        if self.apt_box.check_changes():
     474                                change_child=self.apt_box.changes_detected_dialog()
     475                                if change_child:
     476                                        self.apt_box.set_info(self.core.var)
     477                                        apt_id=self.apt_box.current_id
     478                                        self.apt_box.url_entry.set_text(self.core.var["apt"][apt_id]["url"])
     479                                       
     480                                        for x in self.apt_box.package_list_box.get_children():
     481                                                self.apt_box.package_list_box.remove(x)
     482                       
     483                                        for x in self.core.var["apt"][apt_id]["packages"]:
     484                                                self.apt_box.new_package_button("%s"%x)
     485               
     486                if self.stack.get_visible_child_name()=="debs":
     487                        if self.deb_box.check_changes():
     488                                change_child=self.deb_box.changes_detected_dialog()
     489                                if change_child:
     490                                        self.deb_box.set_info(self.core.var)
     491                                       
     492                                        for c in self.deb_box.package_list_box.get_children():
     493                                                self.deb_box.package_list_box.remove(c)
     494                       
     495                                        for x in self.core.var["deb"]["packages"]:
     496                                                self.deb_box.new_package_button("%s"%x)
     497                                               
     498                if self.stack.get_visible_child_name()=="exes":
     499                        if self.exec_box.check_changes():
     500                                change_child=self.exec_box.changes_detected_dialog()
     501                                if change_child:
     502                                        self.exec_box.set_info(self.core.var)
     503                                       
     504                                        for c in self.exec_box.package_list_box.get_children():
     505                                                self.exec_box.package_list_box.remove(c)
     506                       
     507                                        for x in self.core.var["sh"]["packages"]:
     508                                                self.exec_box.new_package_button("%s"%x)
     509                       
     510                                       
     511                                       
     512                                        #self.apt_box.stack.set_visible_child_name("empty")
     513                       
     514                       
     515               
     516                if change_child:
     517                        #self.update_box.set_info(self.core.var)
     518                        self.stack.set_visible_child_name("update")
     519                        self.apt_button.set_name("OPTION_BUTTON")
     520                        self.debs_button.set_name("OPTION_BUTTON")
     521                        self.exes_button.set_name("OPTION_BUTTON")
     522                        self.update_button.set_name("SELECTED_OPTION_BUTTON")
     523               
     524        #def update_button_clicked
    440525       
    441526#class LliurexRemoteInstaller
  • lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-gui.install/usr/share/lliurex-remote-installer/N4dManager.py

    r4625 r4737  
    3939               
    4040        #def lliurex_mirror
     41       
     42        def mirror_version(self):
     43                try:
     44                        mirror_checked=self.client.mirror_version(self.user,"LliureXRemoteInstaller")
     45                        version='False'
     46                        if mirror_checked[0]:
     47                                version=mirror_checked[1]
     48
     49                        return[True,version]
     50                       
     51                except Exception as e:
     52                        print e
     53                        return False
     54               
     55        #def lliurex_mirror
     56       
     57        def net_mirror_version(self):
     58                try:
     59                        mirror_checked=self.client.net_mirror_version(self.user,"LliureXRemoteInstaller")
     60                        version='False'
     61                        if mirror_checked[0]:
     62                                version=mirror_checked[1]
     63
     64                        return[True,version]
     65                       
     66                except Exception as e:
     67                        print e
     68                        return False
     69               
     70        #def net_lliurex_mirror
    4171       
    4272        def test_var (self):
  • lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-gui.install/usr/share/lliurex-remote-installer/lliurex-remote-installer.ui

    r3960 r4737  
    609609                <property name="fill">True</property>
    610610                <property name="position">2</property>
     611              </packing>
     612            </child>
     613            <child>
     614              <object class="GtkButton" id="update_button">
     615                <property name="label" translatable="yes">UPDATE</property>
     616                <property name="use_action_appearance">True</property>
     617                <property name="visible">True</property>
     618                <property name="can_focus">True</property>
     619                <property name="receives_default">True</property>
     620              </object>
     621              <packing>
     622                <property name="expand">False</property>
     623                <property name="fill">True</property>
     624                <property name="position">3</property>
    611625              </packing>
    612626            </child>
     
    10211035    </child>
    10221036  </object>
     1037  <object class="GtkBox" id="update_data_box">
     1038    <property name="visible">True</property>
     1039    <property name="can_focus">False</property>
     1040    <property name="orientation">vertical</property>
     1041    <child>
     1042      <object class="GtkBox" id="box19">
     1043        <property name="visible">True</property>
     1044        <property name="can_focus">False</property>
     1045        <child>
     1046          <object class="GtkButton" id="apply_update_button">
     1047            <property name="label">gtk-apply</property>
     1048            <property name="visible">True</property>
     1049            <property name="can_focus">True</property>
     1050            <property name="receives_default">True</property>
     1051            <property name="margin_bottom">10</property>
     1052            <property name="use_stock">True</property>
     1053          </object>
     1054          <packing>
     1055            <property name="expand">False</property>
     1056            <property name="fill">True</property>
     1057            <property name="padding">5</property>
     1058            <property name="pack_type">end</property>
     1059            <property name="position">0</property>
     1060          </packing>
     1061        </child>
     1062      </object>
     1063      <packing>
     1064        <property name="expand">False</property>
     1065        <property name="fill">True</property>
     1066        <property name="pack_type">end</property>
     1067        <property name="position">0</property>
     1068      </packing>
     1069    </child>
     1070    <child>
     1071      <object class="GtkLabel" id="package_label_update">
     1072        <property name="visible">True</property>
     1073        <property name="can_focus">False</property>
     1074        <property name="halign">start</property>
     1075        <property name="valign">center</property>
     1076        <property name="margin_left">15</property>
     1077        <property name="margin_top">2</property>
     1078        <property name="ypad">8</property>
     1079        <property name="label" translatable="yes">Current sheduled update:</property>
     1080        <property name="xalign">0</property>
     1081      </object>
     1082      <packing>
     1083        <property name="expand">False</property>
     1084        <property name="fill">True</property>
     1085        <property name="position">1</property>
     1086      </packing>
     1087    </child>
     1088    <child>
     1089      <object class="GtkBox" id="update_current_box">
     1090        <property name="visible">True</property>
     1091        <property name="can_focus">False</property>
     1092        <property name="margin_top">10</property>
     1093        <property name="margin_bottom">10</property>
     1094        <property name="orientation">vertical</property>
     1095        <child>
     1096          <placeholder/>
     1097        </child>
     1098      </object>
     1099      <packing>
     1100        <property name="expand">False</property>
     1101        <property name="fill">True</property>
     1102        <property name="position">2</property>
     1103      </packing>
     1104    </child>
     1105    <child>
     1106      <object class="GtkBox" id="update_sheduled_box">
     1107        <property name="visible">True</property>
     1108        <property name="can_focus">False</property>
     1109        <child>
     1110          <object class="GtkFrame" id="update_frame">
     1111            <property name="visible">True</property>
     1112            <property name="can_focus">False</property>
     1113            <property name="margin_left">10</property>
     1114            <property name="margin_right">10</property>
     1115            <property name="label_xalign">0</property>
     1116            <property name="shadow_type">in</property>
     1117            <child>
     1118              <object class="GtkAlignment" id="alignment1">
     1119                <property name="visible">True</property>
     1120                <property name="can_focus">False</property>
     1121                <property name="top_padding">5</property>
     1122                <property name="bottom_padding">5</property>
     1123                <property name="left_padding">5</property>
     1124                <property name="right_padding">5</property>
     1125                <child>
     1126                  <object class="GtkBox" id="box13">
     1127                    <property name="visible">True</property>
     1128                    <property name="can_focus">False</property>
     1129                    <property name="orientation">vertical</property>
     1130                    <child>
     1131                      <object class="GtkLabel" id="update_label_1">
     1132                        <property name="visible">True</property>
     1133                        <property name="can_focus">False</property>
     1134                        <property name="label" translatable="yes">Schedule new update on boot:</property>
     1135                        <property name="xalign">0</property>
     1136                      </object>
     1137                      <packing>
     1138                        <property name="expand">False</property>
     1139                        <property name="fill">True</property>
     1140                        <property name="position">0</property>
     1141                      </packing>
     1142                    </child>
     1143                    <child>
     1144                      <object class="GtkLabel" id="update_label_2">
     1145                        <property name="visible">True</property>
     1146                        <property name="can_focus">False</property>
     1147                        <property name="label" translatable="yes">Each sheduled update will only be executed once per client.</property>
     1148                        <property name="xalign">0</property>
     1149                      </object>
     1150                      <packing>
     1151                        <property name="expand">False</property>
     1152                        <property name="fill">True</property>
     1153                        <property name="position">1</property>
     1154                      </packing>
     1155                    </child>
     1156                    <child>
     1157                      <object class="GtkGrid" id="grid3">
     1158                        <property name="visible">True</property>
     1159                        <property name="can_focus">False</property>
     1160                        <property name="margin_top">15</property>
     1161                        <property name="row_spacing">2</property>
     1162                        <property name="column_spacing">2</property>
     1163                        <property name="column_homogeneous">True</property>
     1164                        <child>
     1165                          <object class="GtkRadioButton" id="update_radiobutton_1">
     1166                            <property name="label" translatable="yes">radiobutton</property>
     1167                            <property name="visible">True</property>
     1168                            <property name="can_focus">True</property>
     1169                            <property name="receives_default">False</property>
     1170                            <property name="xalign">0</property>
     1171                            <property name="active">True</property>
     1172                            <property name="draw_indicator">True</property>
     1173                            <property name="group">update_radiobutton_2</property>
     1174                          </object>
     1175                          <packing>
     1176                            <property name="left_attach">0</property>
     1177                            <property name="top_attach">0</property>
     1178                          </packing>
     1179                        </child>
     1180                        <child>
     1181                          <object class="GtkRadioButton" id="update_radiobutton_2">
     1182                            <property name="label" translatable="yes">radiobutton</property>
     1183                            <property name="visible">True</property>
     1184                            <property name="can_focus">True</property>
     1185                            <property name="receives_default">False</property>
     1186                            <property name="xalign">0</property>
     1187                            <property name="active">True</property>
     1188                            <property name="draw_indicator">True</property>
     1189                          </object>
     1190                          <packing>
     1191                            <property name="left_attach">0</property>
     1192                            <property name="top_attach">1</property>
     1193                          </packing>
     1194                        </child>
     1195                        <child>
     1196                          <object class="GtkLabel" id="update_label_3">
     1197                            <property name="visible">True</property>
     1198                            <property name="can_focus">False</property>
     1199                            <property name="label" translatable="yes">label</property>
     1200                          </object>
     1201                          <packing>
     1202                            <property name="left_attach">1</property>
     1203                            <property name="top_attach">0</property>
     1204                          </packing>
     1205                        </child>
     1206                        <child>
     1207                          <object class="GtkLabel" id="update_label_4">
     1208                            <property name="visible">True</property>
     1209                            <property name="can_focus">False</property>
     1210                            <property name="label" translatable="yes">label</property>
     1211                          </object>
     1212                          <packing>
     1213                            <property name="left_attach">1</property>
     1214                            <property name="top_attach">1</property>
     1215                          </packing>
     1216                        </child>
     1217                        <child>
     1218                          <object class="GtkSpinner" id="update_spinner_1">
     1219                            <property name="visible">True</property>
     1220                            <property name="can_focus">False</property>
     1221                            <property name="active">True</property>
     1222                          </object>
     1223                          <packing>
     1224                            <property name="left_attach">2</property>
     1225                            <property name="top_attach">0</property>
     1226                          </packing>
     1227                        </child>
     1228                        <child>
     1229                          <object class="GtkSpinner" id="update_spinner_2">
     1230                            <property name="visible">True</property>
     1231                            <property name="can_focus">False</property>
     1232                            <property name="active">True</property>
     1233                          </object>
     1234                          <packing>
     1235                            <property name="left_attach">2</property>
     1236                            <property name="top_attach">1</property>
     1237                          </packing>
     1238                        </child>
     1239                      </object>
     1240                      <packing>
     1241                        <property name="expand">False</property>
     1242                        <property name="fill">True</property>
     1243                        <property name="position">2</property>
     1244                      </packing>
     1245                    </child>
     1246                  </object>
     1247                </child>
     1248              </object>
     1249            </child>
     1250            <child type="label_item">
     1251              <placeholder/>
     1252            </child>
     1253          </object>
     1254          <packing>
     1255            <property name="expand">True</property>
     1256            <property name="fill">True</property>
     1257            <property name="position">0</property>
     1258          </packing>
     1259        </child>
     1260      </object>
     1261      <packing>
     1262        <property name="expand">False</property>
     1263        <property name="fill">True</property>
     1264        <property name="position">3</property>
     1265      </packing>
     1266    </child>
     1267    <child>
     1268      <object class="GtkBox" id="box17">
     1269        <property name="visible">True</property>
     1270        <property name="can_focus">False</property>
     1271        <child>
     1272          <object class="GtkButton" id="test_update_mirrors">
     1273            <property name="label">gtk-refresh</property>
     1274            <property name="visible">True</property>
     1275            <property name="can_focus">True</property>
     1276            <property name="receives_default">True</property>
     1277            <property name="margin_bottom">10</property>
     1278            <property name="use_stock">True</property>
     1279          </object>
     1280          <packing>
     1281            <property name="expand">False</property>
     1282            <property name="fill">True</property>
     1283            <property name="padding">5</property>
     1284            <property name="pack_type">end</property>
     1285            <property name="position">0</property>
     1286          </packing>
     1287        </child>
     1288      </object>
     1289      <packing>
     1290        <property name="expand">False</property>
     1291        <property name="fill">True</property>
     1292        <property name="padding">15</property>
     1293        <property name="position">5</property>
     1294      </packing>
     1295    </child>
     1296  </object>
    10231297</interface>
  • lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-server.install/etc/n4d/conf.d/LliureXRemoteInstaller

    r3851 r4737  
    1717test_list =admin,admins,adm,teachers
    1818remove_file =admin,admins,adm,teachers
     19mirror_version =admin,admins,adm,teachers
     20net_mirror_version =admin,admins,adm,teachers
  • lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-server.install/usr/share/n4d/python-plugins/LliureXRemoteInstaller.py

    r4611 r4737  
    33import os.path
    44import shutil
     5import re
     6from urllib2 import urlopen
    57
    68class LliureXRemoteInstaller:
    79       
    810        N4D_VAR="LLX_REMOTE_INSTALLER"
    9         initial_dict={'deb': {'url': 'http://server/llx-remote/', 'packages': []}, 'sh': {'url': 'http://server/llx-remote/', 'packages': []}, 'apt': {'Mirror':{'url':'mirror', 'packages': []},'LliureX':{'url':'lliurex', 'packages': []}}}
     11        initial_dict={'deb': {'url': 'http://server/llx-remote/', 'packages': []}, 'sh': {'url': 'http://server/llx-remote/', 'packages': []}, 'apt': {'Mirror':{'url':'mirror', 'packages': []},'LliureX':{'url':'lliurex', 'packages': []}},'update':{'activate':'False', 'url':'Mirror', 'version':'0','datetime':'0'}}
    1012       
    1113        #VALOR VARIABLE DEL REPO ADDAPLICATION_SOURCES
     
    2123        LIST='packages'
    2224        URL='url'
     25        UPDATE='update'
    2326        SHARE_DIRECTORY='/var/www/llx-remote'
     27        MIRROR_DIRECTORY='/net/mirror/llx16'
     28        NET_MIRROR_DIRECTORY='http://lliurex.net/xenial'
     29        TIMESTAMP_DIRECTORY='/pool/main/l/lliurex-version-timestamp/'
    2430       
    2531       
     
    7278                                        VALOR[self.APT].update({'Mirror':{'url':'mirror', 'packages': []}})
    7379                                        objects["VariablesManager"].set_variable(namevar,VALOR)
     80                                try:
     81                                        exists=VALOR[self.UPDATE]
     82                                except Exception as e:
     83                                        print "[LLXRemoteInstaller] (test_var) Creating new values to variable[update]......."
     84                                        VALOR[self.UPDATE]={}
     85                                        VALOR[self.UPDATE]['activate']='False'
     86                                        VALOR[self.UPDATE]['url']='mirror'
     87                                        VALOR[self.UPDATE]['version']='0'
     88                                        VALOR[self.UPDATE]['datetime']='0'
     89                                        objects["VariablesManager"].set_variable(namevar,VALOR)
    7490                                COMMENT=("[LLXRemoteInstaller] (test_var) %s Variable exists in your system, it hasn't been created again" %namevar)
    7591                                print ("%s" %COMMENT)
     
    98114        #def_reset_var
    99115
    100 
     116        def mirror_version(self):
     117                try:
     118                        mirror_version_exists=objects["LliurexVersion"].lliurex_version("-m")
     119                        version='False'
     120                        if mirror_version_exists[0]:
     121                                if mirror_version_exists[1]=='True':
     122                                        DIRECTORY=self.MIRROR_DIRECTORY+self.TIMESTAMP_DIRECTORY
     123                                        lst=os.listdir(DIRECTORY)
     124                                        lst_ordered=sorted([f for f in lst])
     125                                        version=re.search(r'\_(.*)\_', lst_ordered[-1]).group(1)
     126                                       
     127                        return [True,version]
     128                except Exception as e:
     129                        return [False,str(e)]
     130        #def_mirror_version
     131       
     132       
     133        def net_mirror_version(self):
     134                try:
     135                       
     136                        DIRECTORY=self.NET_MIRROR_DIRECTORY+self.TIMESTAMP_DIRECTORY
     137                        urlpath =urlopen(DIRECTORY)
     138                        net_mirror_info= urlpath.read().decode('utf-8')
     139                        info=re.findall('<a href="?\'?([^"\'>]*)deb', net_mirror_info)
     140                        lst_ordered=sorted([f for f in info])
     141                        version=re.search(r'\_(.*)\_', lst_ordered[-1]).group(1)
     142                                       
     143                        return [True,version]
     144                except Exception as e:
     145                        return [False,str(e)]
     146        #def_mirror_version
    101147
    102148        def update_var_dict (self,namevar=None,dict={},user=None,passwd=None):
     
    120166               
    121167        #def_add_list
     168       
     169       
     170        def update2version (self,Mirror=False):
     171                try:
     172                        update_version="Ninguna"
     173                        if Mirror:
     174                                update_version=subprocess.Popen(["LANGUAGE=en_EN; find /net/mirror/llx16/pool/main/l/lliurex-version-timestamp -name 'lliurex-version-timestamp*.deb' | tail -n 1 | cut -d_ -f2" ],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()[0]
     175                        else:
     176                                pass
     177                       
     178                       
     179                        COMMENT="Update_version is: %s" %update_version
     180                        print ("%s" %COMMENT)   
     181                        return [True,str(COMMENT)]     
     182                       
     183                except Exception as e:
     184                        return [False,str(e)]
     185               
     186        #def_update2version
    122187       
    123188       
     
    404469       
    405470       
    406        
     471                #initial_dict={'deb': {'url': 'http://server/llx-remote/', 'packages': []}, 'update':{'activate':'False', 'url':'Mirror', 'version':'0'}}
     472
    407473       
    408474       
     
    414480                        COMMENT="[LLXRemoteInstaller](dict_ok) Comprobando la lista de la GUI........"
    415481                        print ("%s" %COMMENT)
     482                       
     483                        #TEST DEL UPDATE
     484                        activate_update=dict[self.UPDATE]['activate']
     485                        url_update=dict[self.UPDATE][self.URL]
     486                        version_update=dict[self.UPDATE]['version']
     487                        datetime_update=dict[self.UPDATE]['datetime']
     488                       
     489                        print "[LLXRemoteInstaller](dict_ok) El update posee activate:%s - url:%s - version:%s - datetime:%s  "%(activate_update,url_update,version_update,datetime_update)
     490                        if activate_update or url_update or  version_update or datetime_update == None:
     491                                dict[self.UPDATE]['activate']='False'
     492                               
     493                        print "[LLXRemoteInstaller](dict_ok) Finalmente UPDATE posee activate:%s - url:%s - version:%s - datetime:%s  "%(activate_update,url_update,version_update,datetime_update)
     494                       
    416495                       
    417496                        #TEST DE LOS DEBS
Note: See TracChangeset for help on using the changeset viewer.