Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2018 15:13:45

SharkyEXE
Зарегистрирован: 2017-12-10
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

Всем здравствуйте.

Есть констуркция

     def NTP_set(self):
      if os.path.exists(os.path.join(plugin_path, "ntpdate")):
       cmd = '%s%s %s %s && echo "\n"' % (plugin_path, "/ntpdate -v -u ", 10, ntp2.vniiftri.ru)
       res = popen(cmd).read()
       if res == "":
        cmd = "ls -l %s%s" % (plugin_path, "/ntpdate")
        res = popen(cmd).read()
        if res[3]!="x":
         cmd = "chmod 755 %s%s" % (plugin_path, "/ntpdate")
         res = popen(cmd).read()
         self.session.open(MessageBox, _("ntpdate problem: attributes for 'ntpdate' have not been correct! Fixed now! Try again!\n%s" % res), MessageBox.TYPE_INFO)
        else:
          self.session.open(MessageBox, _("ntpdate problem: Internet connection ok? Time server ok?"), MessageBox.TYPE_INFO)
       else:
        self.session.open(MyConsole, _("Системное время с NTP ..."), [cmd])
        self.close()
        self.close()
      else:
       self.session.open(MessageBox, _("'ntpdate' не установлен !"), MessageBox.TYPE_ERROR)

Суть проще некуда , если вдуматься

1) Происходит запуск блока

2) Если есть файл ntpdate - то происходит выполнение команды ntpdate -v -u 10 ntp2.vniiftri.ru и вывод окна (MyConsole, _(“Системное время с NTP …”),

3) Если нету файла ntpdate - вывод сообщения ‘ntpdate’ не установлен !

4) Если есть файл ntpdate , но у него атрибуты не 755 - файлу ntpdate присваиваются атрибуты 755 и вывод сообщения ntpdate problem: attributes for ‘ntpdate’ have not been correct! Fixed now! Try again!

Интерес вызывает сообщение ntpdate problem: Internet connection ok? Time server ok? - сколько я не выключал интернет , выдергивал провод физически , изменял адрес с ntp2.vniiftri.ru на 1 - сообщения ntpdate problem: Internet connection ok? Time server ok? я не поулчил

Пожалуйста, помогите мне, как правильно написать условие IF , чтобы при отсутствии интернета и/или адреса , откуда обновлять - было сообщение ntpdate problem: Internet connection ok? Time server ok?

Спаисбо.

Прикреплённый файлы:
attachment plugin.py (24,1 KБ)

Офлайн

#2 Сен. 23, 2018 15:54:49

BM21
Зарегистрирован: 2018-09-15
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

SharkyEXE
Всем здравствуйте.Есть констуркция
Попробовать подкл. сокетом на нужный порт ntp сервера и если будет ошибка возможно тогда стоит выдать сообщение о неполадках с интернетом.

Офлайн

#3 Сен. 23, 2018 15:56:17

SharkyEXE
Зарегистрирован: 2017-12-10
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

Да нет, тут больше, почему не отрабатывает блок

 if res[3]!="x":
         cmd = "chmod 755 %s%s" % (plugin_path, "/ntpdate")
         res = popen(cmd).read()
         self.session.open(MessageBox, _("ntpdate problem: attributes for 'ntpdate' have not been correct! Fixed now! Try again!\n%s" % res), MessageBox.TYPE_INFO)
        else:
          self.session.open(MessageBox, _("ntpdate problem: Internet connection ok? Time server ok?"), MessageBox.TYPE_INFO)

Офлайн

#4 Сен. 23, 2018 16:51:01

BM21
Зарегистрирован: 2018-09-15
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

SharkyEXE
Да нет, тут больше, почему не отрабатывает блок
А вы проверяли что в res перед этим куском кода попадает? М.б там др. данные?

Офлайн

#5 Сен. 23, 2018 16:51:27

SharkyEXE
Зарегистрирован: 2017-12-10
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

А как проверить?

Офлайн

#6 Сен. 23, 2018 16:52:58

BM21
Зарегистрирован: 2018-09-15
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

SharkyEXE
cmd = “ls -l %s%s” % (plugin_path, “/ntpdate”) res = popen(cmd).read()
После
 cmd = "ls -l %s%s" % (plugin_path, "/ntpdate")
        res = popen(cmd).read()
Написать print res

Офлайн

#7 Сен. 23, 2018 16:57:02

SharkyEXE
Зарегистрирован: 2017-12-10
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

Сделал так

        res = popen(cmd).read()
       if res == "":
        cmd = "ls -l %s%s" % (plugin_path, "/ntpdate")
        res = popen(cmd).read()
        open('/usr/lib/enigma2/python/Plugins/Extensions/SetClock/log.txt', 'a').write(res)

Итого у меня так - см. картинку

Суть в чем - из разделов
        if res == "":
        cmd = "ls -l %s%s" % (plugin_path, "/ntpdate")
        res = popen(cmd).read()
        open('/usr/lib/enigma2/python/Plugins/Extensions/SetClock/log.txt', 'a').write(res)
        if res[3]!="x":
         cmd = "chmod 755 %s%s" % (plugin_path, "/ntpdate")
         res = popen(cmd).read()
         self.session.open(MessageBox, _("ntpdate problem: attributes for 'ntpdate' have not been correct! Fixed now! Try again!\n%s" % res), MessageBox.TYPE_INFO)
        else:
          self.session.open(MessageBox, _("ntpdate problem: Internet connection ok? Time server ok?"), MessageBox.TYPE_INFO)
работает только
         if res[3]!="x":
         cmd = "chmod 755 %s%s" % (plugin_path, "/ntpdate")
         res = popen(cmd).read()
         self.session.open(MessageBox, _("ntpdate problem: attributes for 'ntpdate' have not been correct! Fixed now! Try again!\n%s" % res), MessageBox.TYPE_INFO)
Чтобы у меня было ntpdate problem: Internet connection ok? Time server ok? - нужно, чтобы выполнилось if res == “”: , а у меня не выполняется if res == “”: , а сразу идет на выполнение self.session.open(MyConsole, _(“Системное время с NTP …”), )

Если по русски, надо переписать условие, типа
 if not res[3]!="x":
self.session.open(MessageBox, _("ntpdate problem: Internet connection ok? Time server ok?")

Я пробовал - выдает ошибку
13:37:20.8490 { D }     if not res[3]!="x":
13:37:20.8494 { D } IndexError: string index out of range

И также, чтобы это выполнилось, требуется, чтобы зашло в if res == “”: , а у меня не выполняется if res == “”: , а сразу идет на выполнение self.session.open(MyConsole, _(“Системное время с NTP …”), )

Отредактировано SharkyEXE (Сен. 23, 2018 17:06:47)

Прикреплённый файлы:
attachment 1_0_1_791D_1F_FD_1680000_0_0_0.jpg (352,6 KБ)

Офлайн

#8 Сен. 23, 2018 17:12:02

BM21
Зарегистрирован: 2018-09-15
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

SharkyEXE
def NTP_set(self): if os.path.exists(os.path.join(plugin_path, “ntpdate”)): cmd = ‘%s%s %s %s && echo “\n”’ % (plugin_path, “/ntpdate -v -u ”, 10, ntp2.vniiftri.ru) res = popen(cmd).read() if res == “”: cmd = “ls -l %s%s” % (plugin_path, “/ntpdate”) res = popen(cmd).read() if res!=“x”: cmd = “chmod 755 %s%s” % (plugin_path, “/ntpdate”) res = popen(cmd).read() self.session.open(MessageBox, _(“ntpdate problem: attributes for ‘ntpdate’ have not been correct! Fixed now! Try again!\n%s” % res), MessageBox.TYPE_INFO) else: self.session.open(MessageBox, _(“ntpdate problem: Internet connection ok? Time server ok?”), MessageBox.TYPE_INFO) else: self.session.open(MyConsole, _(“Системное время с NTP …”), ) self.close() self.close() else: self.session.open(MessageBox, _(“'ntpdate' не установлен !”), MessageBox.TYPE_ERROR)
М.б отступы где-то не правильно разставлены? Ну еще можно проверять корректность выполнения через код возврата, вместо вывода, закрывать пайп и рез-татом будет код возврата, или None если все ок и код возврата 0.
Тут просто форматирование кода на форуме не понятно как отступы разставлены.

Офлайн

#9 Сен. 23, 2018 17:15:35

SharkyEXE
Зарегистрирован: 2017-12-10
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

BM21

При Вашем желании есть файл в 1м сообщении тынц

Вы тут можете добавить, исправить строки, приложить файл Ваш здесь, я проверю, напишу.

Все делалось в программе AkelPad

Тут интересная задачка, а не банальное 2+2=4, был бы интерес поломать мозг…

Отредактировано SharkyEXE (Сен. 23, 2018 17:22:11)

Офлайн

#10 Сен. 23, 2018 17:50:39

BM21
Зарегистрирован: 2018-09-15
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобраться в констукции

Вот так я бы сделал, но лучше использовать os.subproccess если есть возможность. Тут еще не обрабатывается ошибка при вызове os.stat

 #-*-encoding: utf-8-*-
import stat
PROGRAM_NAME = 'ntpdate'
PLUGIN_PATH = './plugin'
NTP_SERVER = 'ntp2.vniiftri.ru'
def NTP_set(self):
    ntp_path = os.path.join(PLUGIN_PATH, PROGRAM_NAME)
    if os.path.exists(ntp_path):
        uid =  os.getuid() # ID пользователя из под которого запущен процесс
        if os.access(ntp_path, os.X_OK): # Если есть права на выполнение
            cmd = '%s%s %s %s && echo "\n"' % (PLUGIN_PATH, "/ntpdate -v -u ", 10, NTP_SERVER)
            try:
                fo = popen(cmd)
                out = fo.read()
                exit_code = fo.close()
            except OSError as e:
                self.session.open(MessageBox, _("Ошибка  запуска %s (%i): %s" % (PROGRAM_NAME, e.strerror)), MessageBox.TYPE_ERROR)
            
            if not exit_code is None: # Если программа вернула не нулевой код возврата
                self.session.open(MessageBox, _("Ошибка установки времени(%i): %s" % (exit_code, out)), MessageBox.TYPE_ERROR)
            else:
                self.session.open(MyConsole, _("Системное время с NTP ..."), [cmd])
                self.close()
                self.close()
        elif 0 == uid or os.stat(ntp_path)[4] == uid: # Если скрипт запущен из под рута или пользователь под которым запущен скрипт является вдладельцем ntpdate
            try:
                os.chmod(ntp_path,  stat.S_IRUSR |  stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IXGRP |  stat.S_IROTH |  stat.S_IXOTH) # выставляем 755
            except OSError as e:
                self.session.open(MessageBox, _("Ошибка установки прав на %s: %s" % (PROGRAM_NAME, e.strerror)), MessageBox.TYPE_ERROR)
            else:
                self.session.open(MessageBox, _("%s problem: attributes for '%s' have not been correct! Fixed now! Try again!" % (PROGRAM_NAME, PROGRAM_NAME)), MessageBox.TYPE_INFO)
            
            self.session.open(MessageBox, _("%s problem: attributes for '%' have not been correct! Fixed now! Try again!" % PROGRAM_NAME), MessageBox.TYPE_INFO)
        else:
            pass
            # Тут сообщение на тот сллучай если нисего сделать нельзя
    else:
        self.session.open(MessageBox, _("'%s' не установлен !" % PROGRAM_NAME), MessageBox.TYPE_ERROR)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version