Annuler un "shutdown"

Old SaltOld Salt Membre
07:34 modifié dans API AppKit #1
Bonjour à  tous,
J'essaie d'annuler (dans certains cas) une extinction manuelle ou programmée de l'ordinateur.
J'ai lu que l'on pouvait annuler l'extinction en faisant "sudo killall shutdown".
Mon application reçoit bien la notification "NSWorkspaceWillPowerOffNotification" et utilise alors le code suivant :

NSString *admin = [NSString stringWithString:@&quot;oldsalt&quot;];<br />	NSMutableString *source0;<br />	source0 = [NSMutableString stringWithString:@&quot;do shell script &#092;&quot;sudo /usr/bin/killall shutdown&#092;&quot; password &quot;];<br />	[source0 appendString:admin];<br />	[source0 appendString:@&quot; with administrator privileges&quot;];<br />	NSAppleScript *script0 = [[NSAppleScript alloc] initWithSource:source0];<br />	[script0 executeAndReturnError:nil];<br />	[script0 release];<br />


Mais le Mac s'éteint quand même...
Auriez-vous une idée ? Merci  :)

Réponses

  • AliGatorAliGator Membre, Modérateur
    07:34 modifié #2
    Une chose est sûre, c'est loin d'être une méthode orthodoxe que d'utiliser un killall shutdown. En plus exécuter une commande terminal par AppleScript... pourquoi ne pas passer par NSTask quitte à  faire ça ? En plus tu n'entourres même pas le password de guillemets dans ton code...

    Non je suis sûr qu'il y a une méthode plus propre et officielle pour que si ton application demande à  être quittée suite à  une demande de shutdown elle annule ce shutdown. J'ai jamais cherché car jamais eu à  faire mais ça doit sûrement exister.
  • AliGatorAliGator Membre, Modérateur
    07:34 modifié #3
    Tiens pourquoi ne pas par exemple retourner NO (ou plutôt NSTerminateCancel) dans le [tt]applicationShouldTerminate:[/tt] de ton application, ce qui devrait l'empêcher de quitter d'après la doc Apple ?
    Reste à  ne retourner ça que si tu as reçu une notif de shutdown juste avant et que tu veux que ce soit le cas où il interdise ce shutdown, et dans les autres cas retourner NSTerminateNow...

    A tester en tout cas
  • Old SaltOld Salt Membre
    07:34 modifié #4
    Merci de m'avoir répondu  :)

    1/ Je ne mets pas de guillemets autour du mot de passe, car j'envoie un objet NSString, pas le mot lui-même. Du moins, j'avais constaté qu'il fallait faire comme ça lors de mes tests pour envoyer un mot de passe.

    2/ Avec NSTask, je n'ai pas trouvé comment envoyer le mot de passe...

    3/ Je vais tester avec "NSTerminateCancel"
  • AliGatorAliGator Membre, Modérateur
    07:34 modifié #5
    1/ tu envoies un objet NSString mais dans une chaà®ne que tu construis pour AppleScript...
    Au final tel que tu construit ta chaà®ne source0, cela va donner au final (tu peux le constater si tu fais un [tt]NSLog(@source : %@",source0);[/tt]) :
    do shell script "sudo /usr/bin/killall shutdown" password oldsalt with administrator privileges
    Or si tu demandes à  AppleScript d'exécuter ça, il va identifier oldsalt comme une variable et non comme une chaà®ne littérale (testes en collant cette chaà®ne dans l'Editeur Applescript tu verras)

    A force d'échapper des chaà®nes dans des chaà®nes... on s'y perd ;)

    Au passage ton stringWithString ne sert à  rien, et un stringWithFormat aurait également été plus efficace (même si une NSMutableString est tout à  fait valable hein mais bon)
  • Old SaltOld Salt Membre
    décembre 2010 modifié #6
    Bon...
    NSTerminateCancel n'a pas l'effet escompté; cela empêche bien l'application de quitter si je fais un "Cmd-Q", mais ça n'interdit pas l'extinction du Mac  :(
  • Old SaltOld Salt Membre
    07:34 modifié #7
    dans 1291650575:
    1/ tu envoies un objet NSString mais dans une chaà®ne que tu construis pour AppleScript...
    Au final tel que tu construit ta chaà®ne source0, cela va donner au final (tu peux le constater si tu fais un [tt]NSLog(@source : %@",source0);[/tt]) :
    do shell script "sudo /usr/bin/killall shutdown" password oldsalt with administrator privileges

    Je viens de tester en faisant un AppleScript indépendant de mon appli :
    set utilisateur to &quot;cemoi&quot;<br />set mdp to &quot;oldsalt&quot;<br />do shell script &quot;sudo shutdown -h now&quot; user name utilisateur password mdp with administrator privileges<br />
    

    Et cela fonctionne parfaitement, pas besoin de guillemets.
    Par contre si je rajoute cette ligne, immédiatement à  la suite des précédentes :
    do shell script &quot;sudo /usr/bin/killall shutdown&quot; user name utilisateur password mdp with administrator privileges
    


    Elle est sans effet et n'empêche pas l'extinction.
    Est-ce le "sudo /usr/bin/killall shutdown" qui a une erreur quelque part, ou bien qui ne fonctionne pas ?  ???
  • 07:34 modifié #8
    C'est pas étonnant de la part d'Apple que NSTerminateCancel n'empêche pas l'extinction.
    Plus proprement, j'utiliserai NSTerminateLater
  • Old SaltOld Salt Membre
    07:34 modifié #9
    En fait, le but n'est pas d'empêcher l'appli de quitter, mais d'empêcher le Mac de s'éteindre.
    Effectivement, une appli peut interdire l'extinction, par example en cas de document non sauvegardé ou de dialogue modal.
    Le NSTerminateCancel pouvait être une autre possibilité...
  • 07:34 modifié #10
    C'est pas très conventionnel d'annuler une extinction comme ça...
  • Old SaltOld Salt Membre
    07:34 modifié #11
    dans 1291710795:
    C'est pas très conventionnel d'annuler une extinction comme ça...

    Tu veux dire avec une appli qui demande à  sauvegarder son document ?
    Je suis bien d'accord, mais à  part "killall shutdown" (que je n'arrive pas à  faire fonctionner), je ne vois pas d'autre moyen...
  • AliGatorAliGator Membre, Modérateur
    07:34 modifié #12
    Heu oulà  oulà  stop là  !

    1) Normal qu'il n'y ait pas besoin de guillemets dans ton exemple que tu mets directement dans AppleScript puisque dans cet exemple, tu utilises une variable AppleScript pour le nom de l'utilisateur et du mot de passe. D'ailleurs tu mets bien des guillemets autour de "cemoi" et "oldsalt" quand tu définis les valeurs desdites variables !! Alors que dans ton premier exemple où tu construisais ton code source AppleScript tu ne faisais pas comme cela et insérait directement ton mot de passe (via une variable Objective-C, pas AppleScript) dans la chaà®ne... C'est pourtant flagrant, je te dis, fait un NSLog de source0 et copie-colle le résultat dans l'Editeur AppleScript tu vas comprendre c'est pas sorcier

    2) Abandonne vraiment le killall shutdown, c'est vraiment un truc crade à  faire pour annuler une extinction, c'est quoi cette idée saugrenue ! Si tu commences à  essayer des trucs comme ça c'est que tu es sur la mauvaise voie !

    3) Si tu veux annuler l'extinction pour qu'une application ait le temps de sauvegarder son document, c'est NSTerminateLater qu'il faut utiliser oui, cette valeur de retour est même précisément faite pour ça !

    4) Lis la doc !! Graceful Application Termination y'a tout d'expliqué là  dedans ! Ils expliquent comment demander si on veut sauver le document, et justement comment repousser la fermeture de l'application (parce qu'on a demandé explicitement à  la quitter ou parce que l'ordinateur est en train de s'éteindre et a demandé lui-même à  quitter l'appli), le temps que l'utilisateur puisse sauvegarder son ou ses documents, puis continuer l'extinction une fois qu'il a sauvé son document (ou qu'il a décliné la sauvegarde) ou annuler l'extinction s'il a annulé la fermeture de l'appli.

    C'est vraiment cette procédure qu'il faut suivre, et surtout pas essayer des bidouilles avec un killall shutdown (on va croire que tu viens du monde Windows à  proposer des solutions crades comme ça :P)
  • Old SaltOld Salt Membre
    07:34 modifié #13
    1/ Tu as raison, en fait mon NSString *admin = [NSString stringWithString:@oldsalt] était en réalité un [textfield stringValue] et là  ça fonctionnait vraiment. J'ai trop simplifié, désolé de ne pas avoir testé suffisamment.

    2/ Je veux vraiment annuler une extinction, pour avoir le temps de faire certaines actions, par example lancer un script.

    3 et 4/ J'avais lu la doc, mais ça ne s'applique pas à  mes besoins.

    dans 1291716196:
    on va croire que tu viens du monde Windows à  proposer des solutions crades comme ça

    Là , c'est dur... moi qui utilise des Mac depuis 1985  ;)
  • BunoBuno Membre
    07:34 modifié #14
    dans 1291716196:
    on va croire que tu viens du monde Windows à  proposer des solutions crades comme ça :P )

    Hého! C'est quoi ce troll à  2 balles!  >:)   Je m'insurge! Même sous Windows, quoiqu'en pensent certains, on est un minimum respectueux des Bonnes Pratiques  >:(
  • 07:34 modifié #15
    Pourquoi elle ne te convient pas? C'est vraiment la manière la plus propre... En tout cas je ne cautionne pas le killall shutdown. C'est vraiment en tant que conseil que tu dois prendre la chose.. évite à  tout pris son utilisation, ou alors tu cours à  la catastrophe et tu vas t'attirer la rage des utilisateurs.
  • AliGatorAliGator Membre, Modérateur
    07:34 modifié #16
    1/ Ca ne change en rien le problème (mais fais le, le NSLog dont je te parle ! Je te parle pas de mettre des guillemets quand tu affectes la variable "admin" mais quand tu l'utilises pour construire source0... Fais le NSLog pour afficher la valeur de source0 tu vas bien voir bon sang !)

    2/ Je sais que tu veux vraiment annuler l'extinction. C'est pour ça qu'on te propose la solution de NSTerminateLater qui est faite pour ça.

    3/ et 4/ Je vois pas en quoi ça ne s'applique pas... Et je plussoie Eaglelouk, le killall c'est vraiment pas la solution et risque même de te provoquer des problèmes.
  • Old SaltOld Salt Membre
    07:34 modifié #17
    dans 1291719008:
    C'est vraiment en tant que conseil que tu dois prendre la chose.. évite à  tout pris son utilisation

    Oui, entendu.

    dans 1291720263:
    1/ Ca ne change en rien le problème (mais fais le, le NSLog dont je te parle ! Je te parle pas de mettre des guillemets quand tu affectes la variable "admin" mais quand tu l'utilises pour construire source0... Fais le NSLog pour afficher la valeur de source0 tu vas bien voir bon sang !)

    Bon, je me suis mélangé les pinceaux avec les guillemets dans mes différents tests, ça fait plusieurs jours que je suis dessus, il est temps de m'aérer un peu...

    Je vais regarder du côté de NSTerminateLater  :)
  • As-tu trouvé comment résoudre ce problème Old Salt ? j'ai le même problème que toi et je ne trouve aucune solution ! les NSTerminateLater et NSTerminateCancel sont inefficaces sur des agents et démons ! normal ces instructions ont été mises en places pour permettre la sauvegardes des applications à  base de documents ... merci pour toute lumière qui pourrait éclairer ma lanterne !
Connectez-vous ou Inscrivez-vous pour répondre.