Changeset 6840


Ignore:
Timestamp:
Feb 16, 2018, 1:12:26 PM (19 months ago)
Author:
kbut
Message:

refactor code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lmd/trunk/fuentes/lmd-server.install/usr/sbin/lmd-update-image-delay

    • Property svn:executable set to *
    r6778 r6840  
    77import xmlrpc.client
    88import ssl
     9import sys
     10import time
    911
    1012class UpdateLTSPImage:
    11     def __init__(self, identifier):
     13        def __init__(self, identifier, datetime_delay):
    1214
    13         self.identifier = identifier
     15                self.identifier = identifier
     16                self.datetime = datetime.datetime.strptime(datetime_delay, '%d-%m-%Y %H:%M')
     17                self.TODAY = datetime.datetime.now()
     18                self.ID_DATE_STRING = self.TODAY.strftime("%Y%m%d")
     19                self.new_identifier = "{identifier}_{date_string}".format(identifier=self.identifier, date_string=self.ID_DATE_STRING)
    1420
    15         self.TODAY = datetime.datetime.now()
    16         self.ID_DATE_STRING = self.TODAY.strftime("%Y%m%d")
    17         self.new_identifier = "{identifier}_{date_string}".format(identifier=self.identifier, date_string=self.ID_DATE_STRING)
     21                self.CHROOT_BASE = '/opt/ltsp'
     22                self.LMD_CONFIG_BASE = '/etc/ltsp/images'
     23                context = ssl._create_unverified_context()
     24                self.n4d = xmlrpc.client.ServerProxy('https://localhost:9779',context=context)
     25                command = "ltsp-chroot -a {chroot} dpkg-architecture | grep DEB_BUILD_ARCH_CPU | awk -F'[/=]' {{'print $2'}}".format(chroot=self.identifier)
     26                p = subprocess.Popen([command],shell=True,stdout=subprocess.PIPE)
     27                self.arch = p.communicate()[0].strip().decode('utf-8')
    1828
    19         self.CHROOT_BASE = '/opt/ltsp'
    20         self.LMD_CONFIG_BASE = '/etc/ltsp/images'
    21         context = ssl._create_unverified_context()
    22         self.n4d = xmlrpc.client.ServerProxy('https://localhost:9779',context=context)
    23         command = "ltsp-chroot -a {chroot} dpkg-architecture | grep DEB_BUILD_ARCH_CPU | awk -F'[/=]' {{'print $2'}}".format(chroot=self.identifier)
    24         p = subprocess.Popen([command],shell=True,stdout=subprocess.PIPE)
    25         self.arch = p.communicate()[0].strip().decode('utf-8')
     29        def get_unique_identifier(self):
     30                '''
     31                        Set self.new_identifier unique identifier.
     32                        This identifier is non exists folder on /opt/ltsp with identifier value
     33                        and date on name
     34                '''
     35                counter = 1
     36                while os.path.exists(os.path.join(self.CHROOT_BASE,'images',self.new_identifier) + ".img") or os.path.exists(os.path.join(self.CHROOT_BASE,self.new_identifier)) or os.path.exists(os.path.join(self.LMD_CONFIG_BASE,self.new_identifier + ".json")) :
     37                        self.new_identifier = "{identifier}_{date_string}_{counter}".format(
     38                                                                                                                                identifier=self.identifier,
     39                                                                                                                                date_string=self.ID_DATE_STRING,
     40                                                                                                                                counter=str(counter))
     41                        counter+=1
     42                return self.new_identifier
    2643
    27     def get_unique_identifier(self):
    28         '''
    29             Set self.new_identifier unique identifier.
    30             This identifier is non exists folder on /opt/ltsp with identifier value
    31             and date on name
    32         '''
    33         counter = 1
    34         while os.path.exists(os.path.join(self.CHROOT_BASE,'images',self.new_identifier) + ".img"):
    35             self.new_identifier = "{identifier}_{date_string}_{counter}".format(
    36                                                                 identifier=self.identifier,
    37                                                                 date_string=self.ID_DATE_STRING,
    38                                                                 counter=str(counter))
    39             counter+=1
    40         return self.new_identifier
     44        def build_lmd_conf_file(self):
     45                '''
     46                        Create file on /etc/ltsp/images/ with new identifier based on original identifier.
     47                        On file change id and name.
     48                '''
     49                with open(os.path.join(self.LMD_CONFIG_BASE, self.identifier + ".json"), 'r') as data_file:
     50                        lmd_config = json.load(data_file)
     51                lmd_config['id'] = self.new_identifier
     52                lmd_config['name'] = "{name} ({date_string})".format(name=lmd_config['name'], date_string=self.TODAY.strftime("%d-%m-%Y"))
     53                lmd_config['status'] = "enabled-non-editable"
     54                with open(os.path.join(self.LMD_CONFIG_BASE, self.new_identifier + ".json"), 'w') as data_file:
     55                        json.dump(lmd_config, data_file, indent=4)
     56                print("Created config for Lmd")
    4157
    42     def build_lmd_conf_file(self):
    43         '''
    44             Create file on /etc/ltsp/images/ with new identifier based on original identifier.
    45             On file change id and name.
    46         '''
    47         with open(os.path.join(self.LMD_CONFIG_BASE, self.identifier + ".json"), 'r') as data_file:
    48             lmd_config = json.load(data_file)
    49         lmd_config['id'] = self.new_identifier
    50         lmd_config['name'] = "{name} ({date_string})".format(name=lmd_config['name'], date_string=self.TODAY.strftime("%d-%m-%Y"))
    51         lmd_config['status'] = "enabled-non-editable"
    52         with open(os.path.join(self.LMD_CONFIG_BASE, self.new_identifier + ".json"), 'w') as data_file:
    53             json.dump(lmd_config, data_file, indent=4)
    54         print("Created config for Lmd")
    55 
    56     def ltsp_update_image(self):
    57         arch_build = 'linux32'
    58         if self.arch == 'amd64':
    59             arch_build = 'linux64'
    60         options = {
    61             "original_chroot" : os.path.join(self.CHROOT_BASE,self.identifier),
    62             "new_chroot": os.path.join(self.CHROOT_BASE,self.new_identifier),
    63             "new_identifier" : self.new_identifier,
    64             "arch" : arch_build
    65         }
    66         command = "mount --bind {original_chroot} {new_chroot} && {arch} ltsp-update-image {new_identifier}".format(**options)
    67         process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
    68         while True:
    69             output = os.read(process.stdout.fileno(),1024).decode('utf-8')
    70             if output.strip() == '' and process.poll() is not None:
    71                 break
    72             if output:
    73                 print(output.strip())
    74         command = "umount -l {new_chroot}".format(**options)
    75         result = subprocess.Popen([command],shell=True).communicate()
     58        def ltsp_update_image(self):
     59                arch_build = 'linux32'
     60                if self.arch == 'amd64':
     61                        arch_build = 'linux64'
     62                options = {
     63                        "original_chroot" : os.path.join(self.CHROOT_BASE,self.identifier),
     64                        "new_chroot": os.path.join(self.CHROOT_BASE,self.new_identifier),
     65                        "new_identifier" : self.new_identifier,
     66                        "arch" : arch_build
     67                }
     68                command = "mount --bind {original_chroot} {new_chroot} && {arch} ltsp-update-image {new_identifier}".format(**options)
     69                process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
     70                while True:
     71                        output = os.read(process.stdout.fileno(),1024).decode('utf-8')
     72                        if output.strip() == '' and process.poll() is not None:
     73                                break
     74                        if output:
     75                                print(output.strip())
     76                                sys.stdout.flush()
     77                        time.sleep(1)
     78                command = "umount -l {new_chroot}".format(**options)
     79                subprocess.Popen([command],shell=True).communicate()
    7680
    7781
    78     def run(self):
    79         # Get unique identifier
    80         self.get_unique_identifier()
     82        def run(self):
     83                # Get unique identifier
     84                self.get_unique_identifier()
    8185
    82         # Create temp folder to mount original chroot
    83         os.mkdir(os.path.join(self.CHROOT_BASE, self.new_identifier))
    84         print("Created temp folder to chroot")
     86                # Create temp folder to mount original chroot
     87                os.mkdir(os.path.join(self.CHROOT_BASE, self.new_identifier))
     88                print("Created temp folder to chroot")
    8589
    86         self.build_lmd_conf_file()
    87         self.ltsp_update_image()
    88         os.rmdir(os.path.join(self.CHROOT_BASE, self.new_identifier))
    89         masterkey = ''
    90         with open('/etc/n4d/key') as file_data:
    91             masterkey = file_data.readlines()[0].strip()
    92         self.n4d.pushToBootList(masterkey,'LlxBootManager', "ltsp_label{new_identifier}".format(new_identifier=self.new_identifier))
    93         print("Finish update image. New image available")
     90                self.build_lmd_conf_file()
     91                self.ltsp_update_image()
     92                os.rmdir(os.path.join(self.CHROOT_BASE, self.new_identifier))
     93                masterkey = ''
     94                with open('/etc/n4d/key') as file_data:
     95                        masterkey = file_data.readlines()[0].strip()
     96                self.n4d.pushToBootList(masterkey,'LlxBootManager', "ltsp_label{new_identifier}".format(new_identifier=self.new_identifier))
     97               
     98                self.n4d.write_tasks(masterkey,'SchedulerServer','local',{'PromoteImg':
     99                        {
     100                                '0':{
     101                                        'dom':str(self.datetime.day),
     102                                        'mon':str(self.datetime.month),
     103                                        'h':str(self.datetime.hour),
     104                                        'm':str(self.datetime.minute),
     105                                        'cmd':'lmd-promote-image {new_identifier} {identifier}'.format(new_identifier=self.new_identifier,identifier=self.identifier),
     106                                        'dow':'*',
     107                                        'kind':'fixed',
     108                                        'autoremove':True,
     109                                        'name':'Promote image {new_identifier} to {identifier}'.format(new_identifier=self.new_identifier, identifier=self.identifier)
     110                                         }
     111                                }}
     112                )
     113                print("Finish update image. New image available")
    94114
    95115def main():
    96     p = UpdateLTSPImage(sys.argv[1])
    97     p.run()
     116        if len(sys.argv) >= 3:
     117                p = UpdateLTSPImage(sys.argv[1], sys.argv[2])
     118                p.run()
     119        else:
     120                print("!!! Error on arguments")
     121                sys.exit(1)
    98122
    99123if __name__ == '__main__':
    100     main()
     124        main()
Note: See TracChangeset for help on using the changeset viewer.