BSoft&Co Humeurs et Rumeurs

14Feb/124

adsAutoSwitcher – Appcelerator Titanium script to rotate Admob and iAds on iOS applications

Ads-auto-switcher-for-Titanium

adsAutoSwitcher.js is a (commonJS) script that allow you to use both iAds and Admob at the same place within a ©Titanium iOS project. It works with ti.admob module(1.3) : With this script, per default, Admob is always shown, while iAds is shown (on top of admob) and hidden during some seconds.  I made it to simplify my life when i need to manage ads within my applications Wink The script manages to move and/or to resize an UI object when ads are visible. Be carefull with admob when closing a window. The module ti.admob is not really good to stop a refreshing admob..Thinking

adsAutoSwitcher.js is freely available on gitbub

[updated 2012/25/11] New major version !  adsAutoSwitcher V2. The updated V2 changelog is :

  • Rewrite and simplification for ads.js, renammed as adsAutoSwitcher
  • Compatible with Ti SDK > 2
  • commonJS archi
  • And really so much easier to use now!! Smile

How To use :

This adsAutoSwitcher prints the ads on top of a tableview object by moving it down The ads are delayed of 2sec
Before : tableview top = 0, height = 200
After : top = 50, height = 200

  1.  
  2. var myAds = require ('modules/adsAutoSwither');
  3. var ads = new myAds();
  4. ads.setAdmobPublisherId('myAdmobKey');
  5. ads.setIadsShowHide('iAdsShowHide.Window');
  6. ads.setGlobalDelayStart(2000);
  7. ads.showAdvert(tableView,'move','top');

Same as before, but now, the tableview is resized from its top
Before : tableview top = 0, height = 200
After : top = 50, height = 150

  1. [...]
  2. ads.showAdvert(tableView,'resize','top');

Same as before, but now, the tableview is resized from its bottom
Before : tableview top = 0, height = 200.
After : top = 0, height = 150, so bottom is now 150

  1. [...]
  2. ads.showAdvert(tableView,'resize','bottom');

Fixed banner at top = 120. No UI object resized or moved

  1. [...]
  2. ads.setAdsTopInit(120);
  3. ads.showAdvert(tableView,'','');

Full script for adsAutoSwitcher.js 2.0.008

  1.  
  2. Titanium.Admob = Ti.Admob;
  3.  
  4. function AdsAutoSwither() {
  5.     /**
  6.      *  Single contexte name of window
  7.      *  Only use it if your application is a single context application. Then set here the instance of your window
  8.      */
  9.     var _singleContextWin = null;
  10.     this.setSingleContextWin = function(name) {
  11.         _singleContextWin = name;    
  12.     };
  13.  
  14.     /**
  15.      *  Delay in ms before calling the ads
  16.      */
  17.     var _globalDelayStart = 0;
  18.     this.setGlobalDelayStart = function(ms) {
  19.         _globalDelayStart = ms;    
  20.     };
  21.  
  22.     /**
  23.      *  Top margin (px) for the object to move
  24.      */
  25.     var _objMargin = 0;
  26.     this.setObjMargin = function(px){
  27.         _objMargin = px;    
  28.     };
  29.  
  30.     /**
  31.      *  To enabled or not admob. Don't forget to change ads.iadsStartDelay if no admob
  32.      */
  33.     var _useAdmob = true;
  34.     this.setUseAdmob = function(b) {
  35.         _useAdmob = b;    
  36.     };
  37.  
  38.     /**
  39.      *  To enabled or not iAds.
  40.      */
  41.     var _useIads = true;  
  42.     this.setUseIads = function(b) {
  43.         _useIads = b;
  44.     };
  45.  
  46.     /**
  47.      *  Milliseconds before starting iads
  48.      */
  49.     var _iadsStartDelay = 30000;
  50.     this.setIadsStartDelay = function(ms) {
  51.         _iadsStartDelay = ms;        
  52.     };
  53.  
  54.     /**
  55.      *  Initial top position for the ads banners
  56.      *  Set it to Ti.Platform.displayCaps.platformHeight + 50 for a bottom ad
  57.      */
  58.     var _adsTopInit = -50;
  59.     this.setAdsTopInit = function(px) {
  60.         _adsTopInit = px;    
  61.     };
  62.  
  63.     /**
  64.      *  The event's name to be fired. It's recommanded to use one per ads's instance.
  65.      */
  66.     var _iAdsShowHide = 'iAdsShowHide';
  67.     this.setIadsShowHide = function(str) {
  68.         _iAdsShowHide = str;
  69.     };
  70.  
  71.     /**
  72.      *  Required : your admob id
  73.      */
  74.     var _admobPublisherId = null;
  75.     this.setAdmobPublisherId = function(str) {
  76.         _admobPublisherId = str;    
  77.     };
  78.  
  79.     // -- Admob extra public parameters -- //
  80.     /**
  81.      *  Date of birth, to better target the ads, new Date(1985, 10, 1, 12, 1, 1)
  82.      */
  83.     this.adDateOfBirth = '';
  84.  
  85.     /**
  86.      *  Gender 'male' or 'female'
  87.      */
  88.     this.adGender  = '';
  89.  
  90.     /**
  91.      *  Keywords about the ads to print
  92.      */
  93.     this.adKeywords = '';
  94.  
  95.     /**
  96.      *  Test mode for admob
  97.      */
  98.     this.adTesting = false;
  99.  
  100.     /**
  101.      *  admob's backgroundColor
  102.      */
  103.     this.adBackgroundColor =  "#FDFEFD";
  104.  
  105.     // --   iAds extra public parameters     -- //
  106.     /**
  107.      *  iAds's border color
  108.      */
  109.     this.iAdsBorderColor = '#FDFEFD';
  110.  
  111.     /**
  112.      *  iAds's backgroundColor
  113.      */
  114.     this.iAdsBackgroundColor = '#FDFEFD';
  115.  
  116.     /**
  117.      *  How long iAd stay visible (milliseconds)
  118.      */
  119.     this.iAdsTimeToShow = 15000;
  120.  
  121.     /**
  122.      *  How long iAd is hidden (milliseconds)
  123.      */
  124.     this.iAdsTimeToHide = 30000;
  125.  
  126.     /**
  127.      *  Public methods to expose the actual iAds/Admob visibility
  128.      */
  129.     var _iAdsVisible = false;
  130.     this.getIadsVisible = function() {
  131.         return _iAdsVisible;    
  132.     };
  133.     var _adMobVisible = false;
  134.     this.getAdMobVisible = function() {
  135.         return _adMobVisible;    
  136.     };
  137.  
  138.     // --   Private members     -- //
  139.     /**
  140.      *  The UI object to be moved/resized when an ad is visible
  141.      */
  142.     var _objUI = {};
  143.  
  144.     /**
  145.      *  The type of transformation for the object, can be : 'move' or 'resize' or '' (empty for fixed banner)
  146.      */
  147.     var _alterFrom = '';
  148.  
  149.     /**
  150.      *  From where the object transformation should start : 'top' or 'bottom'
  151.      */
  152.     var _alterType = '';
  153.  
  154.     /**
  155.      *  Top, bottom and height for the objUI
  156.      */
  157.     var _objUIinitTop, _objUIinitBottom, _objUIinitHeight;
  158.  
  159.     var _admob = null;
  160. // ----------------------------------------------------------------------------
  161.  
  162. // ----------------------------------------------------------------------------
  163. // ----------------------------------------------------------------------------
  164.     var _hideExtraAdsSpace = function() {
  165.         if (_alterType === 'move') {
  166.             if (_alterFrom === 'top') {
  167.                 _objUI.animate({top:_objUIinitTop+ _objMargin,duration:250});
  168.             }    
  169.             else { // TO CHECK ( - adsmargin?)
  170.                 _objUI.animate({bottom:_objUIinitBottom+ _objMargin,duration:250});
  171.             }    
  172.         } else {
  173.             if (_alterFrom === 'top') {
  174.                 _objUI.animate({height:_objUIinitHeight,top:_objUIinitTop,duration:250});
  175.             }
  176.             else {
  177.                 _objUI.animate({height:_objUIinitHeight,bottom:_objUIinitBottom,duration:250});
  178.             }    
  179.         }    
  180.     };
  181. // ----------------------------------------------------------------------------
  182.  
  183. // ----------------------------------------------------------------------------
  184.     var _buildIads = function() {
  185.         var firstRun = true;
  186.         if (parseFloat(Titanium.Platform.version) >= 3.2) {
  187.             Ti.API.info('ads.showiAds - build iads');
  188.             var _iads = Ti.UI.iOS.createAdView({
  189.                 width: Ti.UI.SIZE || 'auto',
  190.                 height: Ti.UI.SIZE || 'auto',
  191.                 top: _adsTopInit,  
  192.                 borderColor: this.iAdsBorderColor,
  193.                 backgroundColor: this.iAdsBackgroundColor
  194.             });
  195.             _iads.addEventListener('load', function(){
  196.                 Ti.API.info("ads.showiAds - iads loaded. First Run ? :"+firstRun);
  197.                 _iAdsVisible = true;
  198.                 if (firstRun) {
  199.                     Ti.API.info("ads.showiAds - First iAds run : True");
  200.                     firstRun = false;
  201.                 }
  202.                 else {
  203.                     Ti.API.info("ads.showiAds - First iAds run ? : False");
  204.                 }
  205.                 timer=setInterval(_showIads, this.iAdsTimeToShow);
  206.             });
  207.             _iads.addEventListener('error', function(e){
  208.                 Ti.API.info("ads.showiAds - iads error :"+e.message+ " --- adMobVisible="+_adMobVisible);
  209.                 if (_iAdsVisible &&  _alterType != '') {
  210.                     if (_adMobVisible) {
  211.                         if (_alterType === 'move') {
  212.                             if (_alterFrom === 'top') {
  213.                                 _objUI.animate({top:_objUIinitTop+50+_objMargin,duration:250});
  214.                             }    
  215.                             else { // TO CHECK ( - adsmargin?)
  216.                                 _objUI.animate({bottom:_objUIinitBottom+50+ _objMargin,duration:250});
  217.                             }    
  218.                         } else {
  219.                             if (_alterFrom === 'top') {
  220.                                 _objUI.animate({height:_objUIinitHeight-50,top:_objUIinitTop+50+_objMargin,duration:250});
  221.                             }
  222.                             else {
  223.                                 _objUI.animate({height:_objUIinitHeight-50,bottom:_objUIinitBottom-53,duration:250});
  224.                             }    
  225.                         }
  226.  
  227.                     } else { // hide the extra space for ads
  228.                         _hideExtraAdsSpace();
  229.                     }
  230.                 }
  231.                 _iads.top = _adsTopInit;
  232.                 _iAdsVisible = false;
  233.             });
  234.             try {
  235.                 Titanium.UI.currentWindow.add(_iads);
  236.             }
  237.             catch (e) {
  238.                 _singleContextWin.add(_iads);
  239.             }
  240.         }
  241.     };
  242. // ----------------------------------------------------------------------------
  243.  
  244. // ----------------------------------------------------------------------------
  245.     var _showIads = function() {
  246.         Ti.API.info("ads.showiAds - Receive iAdsShowHide. ads.iAdsVisible :"+_iAdsVisible + " -- iads.visible: "+_iads.visible+ " -- ads.adMobVisible: "+_adMobVisible);
  247.         if (_iAdsVisible && _iads.visible) {
  248.             if (_adMobVisible === false) {
  249.                 // if admob's not visible, let iAds on screen
  250.             }
  251.             else { // to hide iAds
  252.                 _iads.animate({top:_adsTopInit, duration:500}, function() { _iads.hide(); Ti.API.info("ads.showiAds - hide iads"); });
  253.             }
  254.         }  
  255.         else { // to show iAds
  256.             if (_adMobVisible === false && _alterType != '') {
  257.                 if (_alterType === 'move') {
  258.                     if (_alterFrom === 'top') {
  259.                         _objUI.animate({top:_objUIinitTop+50+_objMargin,duration:250});
  260.                     }    
  261.                     else { // TO CHECK ( - adsmargin?)
  262.                         _objUI.animate({bottom:_objUIinitBottom+50+ _objMargin,duration:250});
  263.                     }    
  264.                 } else {
  265.                     if (_alterFrom === 'top') {
  266.                         _objUI.animate({height:_objUIinitHeight-50,top:_objUIinitTop+50+_objMargin,duration:250});
  267.                     }
  268.                     else {
  269.                         _objUI.animate({height:_objUIinitHeight-58,bottom:_objUIinitBottom-58,duration:250});
  270.                     }    
  271.                 }
  272.             }
  273.             _iads.show();
  274.             Ti.API.info("ads.showiAds - iads show");
  275.             if (_alterFrom === 'top') {
  276.                 _iads.animate({top:_objUIinitTop,duration:500,curve:Ti.UI.ANIMATION_CURVE_EASE_IN_OUT});
  277.             } else if (_alterFrom === 'bottom') {
  278.                 _iads.animate({top:_objUIinitBottom-54,duration:500,curve:Ti.UI.ANIMATION_CURVE_EASE_IN_OUT});
  279.             }    
  280.         }
  281.     };    
  282. // ----------------------------------------------------------------------------
  283.  
  284. // ----------------------------------------------------------------------------
  285.     var _buildAdmob = function() {
  286.         if (_admob === null) {
  287.             Ti.API.info("ads.buildAdmob - try buildAdmob - ");
  288.             _admob = Ti.Admob.createView({        
  289.                 publisherId: _admobPublisherId, // required  
  290.                 top: _adsTopInit,
  291.                 left: 0,
  292.                 width: Ti.Platform.displayCaps.getPlatformWidth(), //320, // required
  293.                 height: 50, // required
  294.                 testing: this.adTesting,
  295.                 adBackgroundColor: this.adBackgroundColor,
  296.                 dateOfBirth: this.adDateOfBirth, //new Date(1985, 10, 1, 12, 1, 1),
  297.                 gender: this.adGender, //'male',
  298.                 keywords: this.adKeywords, //'',
  299.                 refreshAd:15.0 //not working with actual ti.admob module (1.3), set refresh time within admob site
  300.             });
  301.             _admob.addEventListener('didFailToReceiveAd', function() {
  302.                 _admob.top = _adsTopInit;
  303.                 _admob = null;
  304.                 if (!_iAdsVisible && _alterType != '') {
  305.                     _hideExtraAdsSpace();
  306.                 }
  307.                 _adMobVisible = false;
  308.                 setTimeout(_buildAdmob, 10000);
  309.                 Ti.API.info("ads.buildAdmob - admob error : didFailToReceiveAd. Retry in 10s. adMobVisible:"+_adMobVisible);
  310.             });
  311.             _admob.addEventListener('didReceiveAd', function() {
  312.                 Ti.API.info("ads.buildAdmob - admob event : didReceiveAd");
  313.                 _showAdmob();
  314.             });
  315.             try {
  316.                 Titanium.UI.currentWindow.add(_admob);
  317.             }
  318.             catch (e) {
  319.                 _singleContextWin.add(_admob);
  320.             }
  321.         }
  322.     };
  323. // ----------------------------------------------------------------------------
  324.  
  325. // ----------------------------------------------------------------------------
  326.     var _showAdmob = function() {
  327.         if (_adMobVisible === false) {
  328.             try {
  329.                 if (!_iAdsVisible && _alterType != '') {
  330.                     if (_alterType === 'move') {
  331.                         if (_alterFrom === 'top') {
  332.                             _objUI.animate({top:_objUIinitTop+50+_objMargin,duration:250});
  333.                         }    
  334.                         else { // TO CHECK ( - adsmargin?)
  335.                             _objUI.animate({bottom:_objUIinitBottom+50+ _objMargin,duration:250});
  336.                         }    
  337.                     } else {
  338.                         if (_alterFrom === 'top') {
  339.                             _objUI.animate({height:_objUIinitHeight-50,top:_objUIinitTop+50+_objMargin,duration:250});
  340.                         }
  341.                         else {
  342.                             _objUI.animate({height:_objUIinitHeight-58,bottom:_objUIinitBottom-58,duration:250});
  343.                         }    
  344.                     }
  345.                 }
  346.                 _adMobVisible = true;
  347.                 if (_alterFrom === 'top') {
  348.                     _admob.animate({top:_objUIinitTop,duration:500,curve:Ti.UI.ANIMATION_CURVE_EASE_IN_OUT});
  349.                 } else if (_alterFrom === 'bottom') {
  350.                     _admob.animate({top:_objUIinitBottom-58,duration:500,curve:Ti.UI.ANIMATION_CURVE_EASE_IN_OUT});
  351.                 }
  352.             }
  353.             catch (e) {
  354.                 _adMobVisible = false;
  355.                 Ti.API.info("ads.showAdmob - catch admob error showAdmob");
  356.                 setTimeout(_buildAdmob, 10000);
  357.             }
  358.         }
  359.     };
  360. // ----------------------------------------------------------------------------
  361.  
  362. // ----------------------------------------------------------------------------
  363.     /**
  364.      *  showAdvert  : the unique function to call to start showing the ads
  365.      *  objUI       : the object to move or resize.  
  366.      *  alterType   : The type of transformation for the object, can be : 'move' or 'resize' or '' (empty for a fixed banner)
  367.      *  alterFrom   : From where the object transformation should start : 'top' or 'bottom' of the objUI
  368.      */
  369.     this.showAdvert = function(objUI,alterType,alterFrom) {
  370.         if (Titanium.Network.online) {
  371.             _objUI = objUI;
  372.             _alterFrom = alterFrom;
  373.             _alterType = alterType;
  374.  
  375.             var postLayoutCallback  = function(e,AdsAutoSwither) {
  376.                 _objUI.removeEventListener('postlayout', postLayoutCallback);
  377.                 _objUIinitTop = objUI.getTop(), _objUIinitBottom = objUI.rect.bottom, _objUIinitHeight = objUI.rect.height;
  378.                 if (_objUIinitTop == 'undefined') {
  379. //                    _objUIinitTop = _objUIinitBottom - _objUIinitHeight - 50;
  380.                 }
  381.                 Ti.API.info('_objUIinitTop :'+_objUIinitTop+' -- _objUIinitBottom :'+_objUIinitBottom+' -- _objUIinitHeight :'+_objUIinitHeight);
  382.                 setTimeout(function(){
  383.                     if (_useAdmob) {
  384.                         Ti.Admob = require('ti.admob');
  385.                         _buildAdmob();
  386.                     }
  387.                     if (_useIads) { setTimeout(_buildIads, _iadsStartDelay); }  
  388.                 },_globalDelayStart)
  389.             }
  390.             _objUI.addEventListener('postlayout', postLayoutCallback);
  391.         }
  392.         else { // No internet connection. Retry in 30sec
  393.             setTimeout(this.showAdvert, 30000);  
  394.         }
  395.     };
  396. }
  397. module.exports = AdsAutoSwither;

adsAutoSwitcher.js is freely available on gitbub

4Jan/121

Les meilleurs tweaks cydia utiles pour iPhone jailbreaké (MAJ 13/02/12)

Voici une petite liste (non) exhaustive de quelques petits tweaks pour votre iPhone/iPoad... Bien sur, je parle de tweaks et autres applis.. trouvés sur cydia, donc jailbreak... Je ne parle pas ici des tweaks évidents selon moi, comme sbsetings, lockinfo ou intelliscreenX.. Juste de p'tits trucs qui devraient être déjà intégrés par Apple!
Tous ces tweak sont compatibles iOS 5.0.1 pour le moment, et souvent l'étaient déjà sous iOS 4.x.

Action Menu
Description : Ajoute des actions sur la barre de copier/coller
Author : Ryan Petrich
http://rpetri.ch/cydia/actionmenu/

Activator
Description : Ou comment "vraiment" utiliser le multitouch du device!!
http://rpetri.ch/cydia/activator/
Repo : http://rpetri.ch/repo/

Delete Word
Description : Comme sur un ordi, shift+delete supprime le mot entier
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=deletewordData

FolderEnhancer (payant)
Description : Quitte à avoir des dossiers dans iOS, autant en avoir des vrais!
http://moreinfo.thebigboss.org/moreinfo/user_depictions/ashikase/jp.ashikase.folderenhancer/

iAppLocker
Description : Permet de protéger par code le lancement d'applis. Pas le meilleur, mais gratuit et simple.
http://modmyi.com/info/iapplocker.php

iPhoneDelivery
Description : iOS 5.. mais toujours pas les accusés de reception pour les sms... délirant!
http//code.google.com/p/iphone-delivery-report/
Repo : http://iphonedelivery.advinux.com/cydia/

ManualCorrect
Description : Change le comportement de l'autocorrection. Il faut taper sur la proposition pour qu'elle s'insère! Tellement plus pratique que de supporter des corrections trop souvent hasardeuses..
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=manualcorrectData

NCQuickDismiss
Description : Ajoute un bouton pour faire disparaitre les notifications (celles qui apparaissent en haut de l'écran) plus rapidement.
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=ncquickdismissDp

PreventSleep
Description : Toggle device from entering sleep mode.
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=preventsleepData

Pull To Dismiss
Description : Faire disparaitre le clavier grace à un glissement vers le bas (très utile dans les mails par ex)
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=pulltodismissDp

SnoozeOrStop
Description : Quand on est pas bien reveillé le matin.. peu s'avérer utile Wink
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=snoozeorstopData

SwipeToMoveCursor (voir aussi SwipeShiftCaret)
Description : Comme son nom l'indique, un tweak qui permet de se déplacer dans un texte en cours d'écriture via des swipes à gauche ou à droite..
Attention, ce tweak ajoute aussi un tas de raccourcis clavier, comme qqv etc. Voir les commentaires de ce post.
http://hitoriblog.com/depiction/SwipeToMoveCursor.html
Homepage (en Japonais) : http://hitoriblog.com/?p=2327
Repo : http://hitoriblog.com/apt/

SwitcherCleaner
Description : Montre uniquement dans la barre des taches, les applis ouvertes, et ajoute par défaut le bouton pour les fermer!
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=switchercleanerDp

MAJ 13/02/12
SwipeNav
Description : Ce tweak vous permet de naviguer de facon "naturelle" entre les pages d'une application. Il permet de passer d'une page à l'autre simplement via un swipe sur l'écran.
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=swipenavData

SwipeShiftCaret
Description : Equivalent à "SwipeToMoveCursor" mais en plus simple, et surtout plus récent.
http://moreinfo.thebigboss.org/moreinfo/depiction.php?file=swipeshiftcaretDp

28Jul/110

Les plateformes de téléchargement : Seedbox et direct download.

L'arrivée d'Hadopi et ses emules dans le monde, ont sans doute favorisé l'arrivée d'un nouveau type de service en ligne : Les plateformes de téléchargement.

Ces sociétés mettent à dispo, sous forme d'une application web le plus souvent, le moyen de récupérer tous types de contenus, via des torrents ou du direct download (megaupload, fileserve etc).

Vous donnez le lien ou le fichier torrent, et le service s'occupe du reste pour vous! Bien sur, ces sociétés ont des comptes premiums sur les site de direct download. Donc pas d'attente et gros débit..

Elles conservent ensuite sur le cloud les dits fichiers, afin que l'on puisse les récupérer plus tard, voir même les regarder en streaming pour les fichiers vidéos.
J'ai déjà eu l'occasion d'en tester 3 rapidement :
http://www.streamshark.net/
http://fetch.io
http://put.io/

J'ai une petite préférence pour fetch.io... mais c'est vraiment subjectif Smile

Tous offrent la possibilité de tester leur service pendant quelques jours, avec en général un quotat de téléchargement et d'espace de stockage limité.

Ensuite, il faut passer à la caisse... et acheter de la bande passante et du stockage. Les prix sont assez similaires d'une plateforme à l'autre. Les tarifs commencent à moins de 5€ par mois! (Le prix d'une pseudo license globale... Razz)

Et les débits pour ensuite récupérer ses fichiers plus que correct.. Smile
Cerise sur le gateau, en général, le service se charge également de recoller les morceaux d'un fichier (file.r01, r02... etc)

Ce genre de services, moyennant un petit pécule, peut se rendre très utile.. à garder sous le coude!

Si vous en connaissez d'autres, faites les connaitre en commentaire.

20Jan/100

(re)connexion automatique à un VPN sous Ubuntu

En ces temps peu glorieux d'Hadopi et tous ses dérivés... un bon moyen de pouvoir surfer sans être espionné, est d'utiliser un VPN.

Pour ma part, j'ai été confronté à des problèmes de déconnexions intempestives, sans reconnexion automatique. Ce qui peut être parfois gênant...

Voilà donc un (bon) moyen de palier ce problème. Ce n'est surement pas la meilleure solution, et je ne suis pas un fou de linux.. mais au moins, elle me satisfait!

Cette solution se compose de 2 fichiers. Un "check_vpn" qui se charge de lancer le script principal à intervalles définis. Et "vpn_restart.py", script en python qui relance la connexion si celle ci déconnectée.

check_vpn

#!/bin/bash
  1.  
  2. while [ 1 ]; do
  3.     echo -n $(date) "##  "
  4.     sudo /home/bsoft/Bureau/vpn_restart.py #où le script est installé
  5.     sleep 60  #en secondes, temps de boucle du script
  6. done

vpn_restart.py

#!/usr/bin/python
  1. #http://ubuntuforums.org/showthread.php?t=1316314
  2. import sys
  3. import os
  4. import dbus
  5. import gobject
  6. from  dbus.mainloop.glib import DBusGMainLoop
  7.  
  8. # The uuid of the VPN connection to activate
  9. VPN_CONNECTION_UUID = "20d3d577-51b4-435c-b408-2a3f3c8a5463"
  10.  
  11. # The uuid of the connection that needs to be active to start the VPN connection
  12. ACTIVE_CONNECTION_UUID = "recupere via get_active_conn(bus)"
  13.  
  14. # Mon conn ID
  15. CONN_ID = "Auto eth0"
  16. # Mon conn['type']
  17. CONN_TYPE = "802-3-ethernet"
  18.  
  19. # some service, path and interface constants
  20. NM_DBUS_SERVICE                   = "org.freedesktop.NetworkManager"
  21. NM_DBUS_PATH                      = "/org/freedesktop/NetworkManager"
  22. NM_DBUS_INTERFACE                 = "org.freedesktop.NetworkManager"
  23. NM_DBUS_IFACE_CONNECTION_ACTIVE   = "org.freedesktop.NetworkManager.Connection.Active"
  24. NM_DBUS_SERVICE_SYSTEM_SETTINGS   = "org.freedesktop.NetworkManagerSystemSettings"
  25. NM_DBUS_SERVICE_USER_SETTINGS     = "org.freedesktop.NetworkManagerUserSettings"
  26. NM_DBUS_IFACE_SETTINGS            = "org.freedesktop.NetworkManagerSettings"
  27. NM_DBUS_PATH_SETTINGS             = "/org/freedesktop/NetworkManagerSettings"
  28. NM_DBUS_IFACE_SETTINGS_CONNECTION = "org.freedesktop.NetworkManagerSettings.Connection"
  29.  
  30. DBusGMainLoop(set_as_default=True)
  31.  
  32. nm_dbus_settings_services = (NM_DBUS_SERVICE_SYSTEM_SETTINGS, NM_DBUS_SERVICE_USER_SETTINGS)
  33.  
  34. def get_connections(bus, service):
  35.     proxy = bus.get_object(service, NM_DBUS_PATH_SETTINGS)
  36.     iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS)
  37.     return iface.ListConnections()
  38.  
  39. def get_connection_by_uuid(bus, uuid):
  40.     for service in nm_dbus_settings_services:
  41.         for c in get_connections(bus, service):
  42.             proxy = bus.get_object(service, c)
  43.             iface = dbus.Interface(proxy, dbus_interface = NM_DBUS_IFACE_SETTINGS_CONNECTION)
  44.             settings = iface.GetSettings()
  45.             if settings['connection']['uuid'] == uuid:
  46.                 return (c, service)
  47.     return None
  48.  
  49. def list_uuids(bus):
  50.     for service in nm_dbus_settings_services:
  51.         for c in get_connections(bus, service):
  52.             proxy = bus.get_object(service, c)
  53.             iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS_CONNECTION)
  54.             settings = iface.GetSettings()
  55.             conn = settings['connection']
  56.             print "%s: %s - %s (%s)" % (service, conn['uuid'], conn['id'], conn['type'])
  57.  
  58. # recupere l'uuid de la connexion active via CONN_ID et CONN_TYPE
  59. def get_active_conn(bus):
  60.     for service in nm_dbus_settings_services:
  61.         for c in get_connections(bus, service):
  62.             proxy = bus.get_object(service, c)
  63.             iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS_CONNECTION)
  64.             settings = iface.GetSettings()
  65.             conn = settings['connection']
  66.             if conn['id'] == CONN_ID and conn['type'] == CONN_TYPE:
  67.     return conn['uuid']
  68.  
  69. def get_active_connection_path(bus, uuid):
  70.     proxy = bus.get_object(NM_DBUS_SERVICE, NM_DBUS_PATH)
  71.     iface = dbus.Interface(proxy, dbus_interface='org.freedesktop.DBus.Properties')
  72.     active_connections = iface.Get(NM_DBUS_INTERFACE, 'ActiveConnections')
  73.     connection_and_service = get_connection_by_uuid(bus, uuid)
  74.     if connection_and_service == None:
  75.         return None
  76.     for a in active_connections:
  77.         proxy = bus.get_object(NM_DBUS_SERVICE, a)
  78.         iface = dbus.Interface(proxy, dbus_interface='org.freedesktop.DBus.Properties')
  79.         path = iface.Get(NM_DBUS_IFACE_CONNECTION_ACTIVE, 'Connection')
  80.         service = iface.Get(NM_DBUS_IFACE_CONNECTION_ACTIVE, 'ServiceName')
  81.         if service != connection_and_service[1]:
  82.             continue
  83.         proxy = bus.get_object(connection_and_service[1], path)
  84.         iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS_CONNECTION)
  85.         settings = iface.GetSettings()
  86.         if settings['connection']['uuid'] == uuid:
  87.             return a
  88.     return None
  89.  
  90. def activate_connection(bus, vpn_connection, active_connection):
  91.     def reply_handler(opath):
  92.         print "<<SUCCESS>>"
  93.         sys.exit(0)
  94.     def error_handler(*args):
  95.         print "<<FAILURE>>"
  96.         sys.exit(1)
  97.     proxy = bus.get_object(NM_DBUS_SERVICE, NM_DBUS_PATH)
  98.     iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_INTERFACE)
  99.     iface.ActivateConnection(NM_DBUS_SERVICE_USER_SETTINGS,
  100.         vpn_connection[0],
  101.         dbus.ObjectPath("/"),
  102.         active_connection,
  103.         reply_handler=reply_handler,
  104.         error_handler=error_handler)
  105.  
  106. bus = dbus.SystemBus()
  107.  
  108. print "connections:"
  109. list_uuids(bus)
  110.  
  111. ACTIVE_CONNECTION_UUID = get_active_conn(bus)
  112.  
  113. if len(VPN_CONNECTION_UUID) < 1 or len(ACTIVE_CONNECTION_UUID) < 1:
  114.     print "you need to set the uuids"
  115.     sys.exit(0)
  116.  
  117. vpn_connection = get_connection_by_uuid(bus, VPN_CONNECTION_UUID)
  118. if not vpn_connection:
  119.     print "Configured VPN connection is not known to NM, check VPN_CONNECTION_UUID."
  120.     sys.exit(1)
  121.  
  122. active_connection = get_connection_by_uuid(bus, ACTIVE_CONNECTION_UUID)
  123. if not active_connection:
  124.     print "Configured active connection is not known to NM, check ACTIVE_CONNECTION_UUID."
  125.     sys.exit(1)
  126.  
  127. if get_active_connection_path(bus, VPN_CONNECTION_UUID) != None:
  128.     print "VPN connection already activated"
  129.     sys.exit(0)
  130.  
  131. active_connection_path = get_active_connection_path(bus, ACTIVE_CONNECTION_UUID)
  132. if not active_connection_path:
  133.     print "The required connection isn't active at the moment"
  134.     sys.exit(0)
  135.  
  136. print "connecting to:\n  '%s'\nwith active connection:\n  '%s'" % (vpn_connection, active_connection)
  137.  
  138. activate_connection(bus, vpn_connection, active_connection_path)
  139.  
  140. loop = gobject.MainLoop()
  141. loop.run()

Le script python peut très facilement être amélioré. On peut imaginer par exemple de fermer certaines applications lorsque la connexion VPN est morte..

Pour faire fonctionner le tout, il suffit de copier le script python où vous voulez.
Puis, de copier en admin (sudo) le script check_vpn dans /etc/init.d
Il faut le rendre exécutable (chmod u+x nom_du_fichier)
Puis il faut créer un lien symbolique du script dans /etc/rc2.d afin que celui ci démarre automatique avec le système.
ln -s /etc/init.d/check_vpn /etc/rc2.d/S88check_vpn

Et voilà!
Chez moi, sous Ubuntu 9.04, ca fonctionne très bien. Il faut bien entendu au préalable avoir une connexion VPN de configurée dans le network manager.