Changeset 3947


Ignore:
Timestamp:
Mar 15, 2017, 11:56:18 AM (2 years ago)
Author:
Juanma
Message:

Refactorized TeacherShare?: Adopted ScpManager? as the only file transfer mechanism

Location:
n4d-client-plugins/trunk/fuentes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • n4d-client-plugins/trunk/fuentes/client-install-files/usr/share/n4d/python-plugins/TeacherShare.py

    r674 r3947  
    1 # -*- coding: utf-8 -*-
     1# -*- coding: utf-8 -*-<F12>
    22
    33import os.path
     
    1212from xmlrpclib import *
    1313
    14 
    15 NET="/net/server-sync/"
    16 
    17 NET_FOLDER="/net/server-sync/home/.lliurex-harvester/"
    18 ORIG_NET_FOLDER=NET_FOLDER
    19 
    20 NEW_NET_FOLDER="/net/server-sync/home/students/%%STUDENT%%/.harvester/"
    21 
    22 if not os.path.exists(NET):
    23        
    24         NET_FOLDER="/run/%%USER%%/home/.lliurex-harvester/"
    25         NEW_NET_FOLDER="/run/%%USER%%/home/students/%%STUDENT%%/.harvester/"
    26        
    27 
    28 
    2914class TeacherShare:
    3015
    31 
    32         def send_to_teacher(self,from_user,to_user,file_name,file_in_b64):
    33 
    34                 file_name=file_name.encode("utf-8")
    35                 server = ServerProxy ("https://server:9779")
    36                 try:
    37                         self.paths=server.get_paths("","TeacherShareManager")
    38                 except Exception as e:
    39                         print e
    40                         return False
    41                
    42                
    43                 if to_user in self.paths:
    44                         try:
    45                                 path,ip,name=self.paths[to_user]
    46                                 fname=self.generate_file_name(from_user,file_name,path)
    47                                 f=open(fname,'w')
    48                                 f.write(base64.b64decode(file_in_b64))
    49                                 f.close()
    50                                 os.chown(fname,pwd.getpwnam(to_user)[2],pwd.getpwnam(to_user)[3])
    51                                 return True
    52                                
    53                         except Exception as e:
    54                                 print e
    55                                 return False
    56 
    57                 else:
    58                         return False
    59                
    60                
    61                
    62         #def send_to_users
    63        
    64         def send_to_teacher_socket_p(self,from_user,to_user,file_path,queue):
    65                
    66                 ret_value=False
    67                 file_path=file_path.encode("utf-8")
    68                 server = ServerProxy ("https://server:9779")
    69                
    70                 try:
    71                         paths=server.get_paths("","TeacherShareManager")
    72                 except Exception as e:
    73                         print e
    74                                        
    75                 if to_user in paths:
    76                        
    77                         try:
    78                                 path,name,ip,port=paths[to_user]
    79                                 student_uid=pwd.getpwnam(from_user)[2]
    80                                 student_gid=pwd.getpwnam(from_user)[3]
    81                                 os.setgid(student_gid)
    82                                 os.setuid(student_uid)
    83                                 f=open(file_path,'rb')
    84                                 tmp=file_path.split("/")
    85                                 file_name=tmp[len(tmp)-1]
    86                                
    87                                 s=socket.socket()
    88                                 ssl_socket=ssl.wrap_socket(s)
    89                                 ssl_socket.connect((ip,port))
    90                                 ssl_socket.sendall("[N4D-HEADER-BEGIN]user="+from_user+";file="+file_name+"[N4D-HEADER-END]"+f.read())
    91                                 ret_value=True
    92                                 ssl_socket.close()
    93                                
    94                         except Exception as e:
    95                                 print e
    96                        
    97                
    98                 queue.put(ret_value)
    99                
    100         #def send_to_teacher_socket_mp
    101        
    10216        def send_to_teacher_net(self,from_user,to_user,file_path):
    10317
    10418                file_path=file_path.encode("utf8")
    105 
    106                 student_uid=pwd.getpwnam(from_user)[2]
    107                 student_gid=pwd.getpwnam(from_user)[3]
    108 
    109                 teacher_uid=pwd.getpwnam(to_user)[2]
    110                 teacher_gid=pwd.getpwnam(to_user)[3]
    111                
     19                #Get ip from user
     20                s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
     21                s.connect(("server",9779))
     22                student_ip=s.getsockname()[0]
    11223
    11324                server = ServerProxy ("https://server:9779")
     
    12536                        name=name.encode("utf8")
    12637                        try:
    127                                 #STEP 1 --- TO /NET
    12838                                src=file_path
    129                                 tmp=file_path.split("/")
    130                                 file_name=tmp[len(tmp)-1]
    131                                 tmp_net_folder=NEW_NET_FOLDER.replace("%%USER%%",from_user)
    132                                 tmp_net_folder=tmp_net_folder.replace("%%STUDENT%%",from_user)
    133                                 dst=tmp_net_folder+"/["+from_user+"]_"+file_name
    13439                                queue=multiprocessing.Queue()
    135                                 p=multiprocessing.Process(target=self.copy_file_as_user,args=(src,dst,student_uid,student_gid,False,queue))
     40                                p=multiprocessing.Process(target=self.copy_file_as_user,args=(src,student_ip,ip,from_user,to_user,False,queue))
    13641                                p.start()
    13742                                p.join()
     
    13944                                if not queue.get():
    14045                                        return False
    141                                
    142                                 #STEP 2 -- TEACHER GRABS IT
    143                                 server=ServerProxy("https://"+ip+":9779")
    144                                 return server.grab_file("","TeacherShare",to_user,"["+from_user+"]_"+file_name,from_user)
    145                                
     46                                else:
     47                                        return True
    14648                               
    14749                        except Exception as e:
    148                                
    14950                                print e
    15051                                return False
    151                
    152 
    15352        #def send_to_teacher_net
    15453       
    155         def grab_file(self,teacher,file_name,student):
    156 
    157                 file_name=file_name.encode("utf8")
    158                 try:
    159                         server=ServerProxy("https://server:9779")
    160                         paths=server.get_paths("","TeacherShareManager")
    161                         if teacher in paths:
    162                                 path,name,ip,port=paths[teacher]
    163                                 path=path.encode("utf8")
    164                                 name=name.encode("utf8")
    165                                 tmp_net_folder=NEW_NET_FOLDER.replace("%%STUDENT%%",student)
    166                                 tmp_net_folder=tmp_net_folder.replace("%%USER%%",teacher)
    167                                 src=tmp_net_folder+file_name
    168                                 dst=path+file_name
    169                                 teacher_uid=pwd.getpwnam(teacher)[2]
    170                                 teacher_gid=pwd.getpwnam(teacher)[3]
    171                                 queue=multiprocessing.Queue()
    172                                 p=multiprocessing.Process(target=self.copy_file_as_user,args=(src,dst,teacher_uid,teacher_gid,True,queue))
    173                                 p.start()
    174                                 p.join()
    175                                 return queue.get()
    176                                
     54        def copy_file_as_user(self,src,from_ip,to_ip,from_user,to_user,delete,queue):
     55                try:   
     56                        server=ServerProxy("https://"+to_ip+":9779")
     57                        ret=server.grab_file("","TeacherShare",from_user,from_ip,src)
     58                        if ret:
     59                                if delete:
     60                                        os.remove(src)
     61                                queue.put(True)
    17762                        else:
    178                                 print "[TeacherShare] Teacher " + teacher + " not sharing [!]"
    179                                 return False
    180                                
    181                        
    182                        
    183                 except Exception as e:
    184                         print e
    185                         return False
    186                
    187         #def grab_file
    188        
    189         def copy_file_as_user(self,src,dst,uid,gid,delete,queue):
    190                
    191                 try:
    192                         os.setgid(gid)
    193                         os.setuid(uid)
    194                        
    195                         tmp=dst.split("/")
    196                         folder=""+"/".join(tmp[0:len(tmp)-2])
    197                         prevmask = os.umask(0)
    198                        
    199                         if not os.path.exists(folder):
    200                                 os.makedirs(folder,02770)
    201                                 os.chmod(folder,02770)
    202                                
    203                         shutil.copyfile(src,dst)
    204                         os.chmod(dst,0660)
    205                         os.umask(prevmask)
    206                        
    207                         if delete:
    208                                 os.remove(src)
    209                         queue.put(True)
     63                                queue.put(False)
    21064                except Exception as e:
    21165                        print e
    21266                        queue.put(False)
    213                
    21467        #def copy_file_as_user
    215        
    216        
    217         def send_to_teacher_socket(self,from_user,to_user,file_name):
    218                
    219                 queue=multiprocessing.Queue()
    220                 p=multiprocessing.Process(target=self.send_to_teacher_socket_p,args=(from_user,to_user, file_name,queue,))
    221                 p.start()
    222                 p.join()
    223                 return queue.get()
    224                
    225         #def send_to_teacher_socket
    226        
    227         def generate_file_name(self,from_user,file_name,path):
    22868
    22969
     70        def grab_file(self,from_user,from_ip,src):
     71                if self.credentials:
     72                        teacher_uid=pwd.getpwnam(self.credentials[0])[2]
     73                        teacher_gid=pwd.getpwnam(self.credentials[0])[3]
     74                        server=ServerProxy("https://localhost:9779")
     75                        if self.credentials:
     76                                try:
     77                                        fileName=os.path.basename(src)
     78                                        dest=self.shared_path+"/["+from_user+"]_"+fileName
     79                                        ret=server.get_file(self.credentials,"ScpManager",from_user,self.credentials[0],self.credentials[1],from_ip,src,dest)
     80                                        os.chown(dest,teacher_uid,teacher_gid)
     81                                        return True
     82                                except Exception as e:
     83                                        print e
     84                                        return False
     85                else:
     86                        print("No credentials found")
     87                        return False
    23088
    231                 done=False
    232                 counter=1
    233                
    234                 original_path=path
    235                 original_file_name=file_name
    236                 file_name="["+from_user+"]_"+file_name
    237 
    238 
    239                 while not done:
    240                        
    241                         if os.path.exists(path+file_name):
    242                                 tmp_list=original_file_name.split(".")
    243                                 tmp_list[0]=tmp_list[0]+"_("+str(counter)+")"
    244                                 file_name=".".join(tmp_list)
    245                                 file_name="["+from_user+"]_"+file_name
    246                                 counter+=1
    247                         else:
    248                                 done=True
    249                        
    250                 return path+file_name
    251                
    252                
    253                
    254                
    255                
    256         #def generate_file_name
    257 
     89        def register_share_info(self,user,pwd,path):
     90                        self.credentials=(user,pwd)
     91                        self.shared_path=path
     92        #def register_credentials
    25893
    25994#class TeacherFileManager
    26095
    261 if __name__=="__main__":
    262        
    263         tfm=TeacherShare()
    264         tfm.send_to_teacher_socket(1,2,3)
    265         #print tfm.generate_file_name("hector","hola.txt","/tmp/test/")
  • n4d-client-plugins/trunk/fuentes/debian/changelog

    r677 r3947  
     1n4d-client-plugins (0.86) xenial; urgency=medium
     2
     3  * Refactorized TeacherShare: Adopted ScpManager as the only file transfer mechanism
     4
     5 -- Juanma Navarro Mañez <juanma1980@gmail.com>  Wed, 15 Mar 2017 11:54:12 +0100
     6
    17n4d-client-plugins (0.85) xenial; urgency=high
    28
Note: See TracChangeset for help on using the changeset viewer.