# -*- coding: utf-8 -*- # Copyright 2012-2016 Mir Calculate. http://www.calculate-linux.org # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os from os import path from itertools import ifilter from calculate.core.datavars import DataVarsCore from calculate.core.server.gen_pid import search_worked_process from calculate.lib.cl_template import SystemIni from calculate.lib.utils.content import getCfgFiles from calculate.lib.utils.files import getRunCommands, readFile, writeFile class UpdateInfo(object): """ Информационный объект о процессе обновления """ update_file = "/var/lib/calculate/calculate-update/updates.available" def __init__(self, dv=None): if dv is None: self.dv = DataVarsCore() self.dv.importCore() else: self.dv = dv def need_update(self): return self.update_ready() @classmethod def update_ready(cls): """ Проверить есть ли обновления по ini.env """ return path.exists(cls.update_file) @classmethod def set_update_ready(cls, value): """ Установить статус обновления """ try: if value: writeFile(cls.update_file).close() else: os.unlink(cls.update_file) except OSError: pass def check_for_dispatch(self): """ Есть ли в системе не примененные файлы для dispatch-conf """ return bool(getCfgFiles(self.dv.Get('cl_config_protect'), prefix=self.dv.Get('cl_chroot_path'))) def is_console_gui_run(self): """ Проверить есть ли уже запущенная копия console-gui """ return any(ifilter(lambda x: "cl-console-gui" in x, getRunCommands())) def update_already_run(self): """ В системе уже есть работающий процесс обновления """ return search_worked_process("update", self.dv) @property def outdated_kernel(self): flag_path = self.dv.Get('update.cl_update_outdated_kernel_path') if path.exists(flag_path): try: flag_kernel = readFile(flag_path).strip() current_kernel = self.dv.Get('update.cl_update_kernel_version') if flag_kernel != current_kernel: return True except ValueError: pass return False @outdated_kernel.setter def outdated_kernel(self, value): flag_path = self.dv.Get('update.cl_update_outdated_kernel_path') try: if value: with writeFile(flag_path) as f: f.write(self.dv.Get('update.cl_update_kernel_version')) else: if path.exists(flag_path): os.unlink(flag_path) except IOError: pass