Certaines commandes DTMF sont réservées uniquement aux administrateurs du relais. Un code tournant, qui change toutes les minutes, sera reconnu par le relais. L'administrateur utilise un générateur de code, soit sur son navigateur internet, soit sur son smartphone Android. Les installations (relais et PC, smartphone) doivent être à la même heure. L'algorithme de création de code tournant se réfère à l'heure courante.

Le logiciel Code Sysop pour Android

Télécharger le fichier apk à installer sur votre mobile android. Il vous permet de connaitre votre code de sécurité.

  1. Télécharger le fichier sysop_code_apk.zip
  2. Installer

sysop_code_apk.zip

Vidéo de démonstration

Le logiciel Code Sysop pour navigateur internet

Capture d'écran de générateur de code de sécurité tournant

Télécharger le fichier zip, décompresser puis lancer le fichier index.html

sysop_code.zip

Code de génération de code tournant

/usr/share/svxlink/modules.d/accesscode.py

""""
"  SVXLINK SYSOP ROLLING CODE
"  SVXLink Card on http://svxcard.f5uii.net
"
"  This Python software generate a unique code, valid only for 3 minutes. It will secure your system operator DTMF remote commands.
"  Requires that your Raspberry Pi is clock synchronised.
"  08.02.2016 (b)- Christian, F5UII
"  version 0.1 - Under Creative Commons licence [by-nc-sa] http://creativecommons.org/licenses/by-nc-sa/4.0/
"
"""
 
import time
import math
from datetime import datetime, timedelta
a = time.localtime()
 
 
 
COMPLEXITY_CODE = 452 #Give a private complexity code. Remember to change this code for have your generated password personnal.
 
minute1 = datetime.now() + timedelta(minutes=1)
minute_1 = datetime.now() + timedelta(minutes=-1)
 
datejour = time.strftime('%d')
datemois = time.strftime('%m')
dateannee= time.strftime('%y')
heure = time.strftime('%H')
min = time.strftime('%M')
min_1 = minute_1.strftime('%M')
min1 = minute1.strftime('%M')
 
 
def codage(datejour,datemois,dateannee,heure,min):
 
        a=int(datejour)+int(datemois)+int(dateannee)+int(COMPLEXITY_CODE)
        b = a ^ (int(heure)+ int(min[1])*10+ int(min[0]))
        resu_b = b
        res = b - (math.floor(b/100))*100
        resu_b= '%02d' %res
        c= int(datejour)*int(datemois) ^ (int(heure)*int(min));
        resu_c = c
        res = c - (math.floor(c/100))*100
        resu_c= '%02d' %res
        resu= str(resu_b).zfill(2) + str(resu_c).zfill(2)
        return resu
 
file = open("/tmp/codes.tcl", "w")
 
file.write( "set code_A " + codage (datejour,datemois,dateannee,heure,min_1) + ";")
file.write( "set code_B " + codage (datejour,datemois,dateannee,heure,min) + ";")
file.write( "set code_C " + codage (datejour,datemois,dateannee,heure,min1) + ";")
 
file.close()

Code à insérer dans /usr/share/svxlink/events.d/local/Logic.tcl

proc dtmf_cmd_received {cmd} {
 
set runcmd [exec sudo python /usr/share/svxlink/modules.d/accesscode.py 2>&1];
source "/tmp/codes.tcl";
set sysopcode [string range $cmd 0 3]
set sscmd [string range $cmd 4 [string length $cmd]]
puts "extrait $sysopcode $sscmd"
if {($sysopcode ==  $code_A)  || ($sysopcode == $code_B) || ($sysopcode == $code_C)} {  #Sysop commands - 3 minutes window
   if  {$sscmd ==  11} {  # Sysop command to switch relay
   exec echo 1 > /sys/class/gpio/gpio20/value
   }
 
   if  {$sscmd ==  10} {  # Sysop command to switch relay
   exec echo 0 > /sys/class/gpio/gpio20/value
   }
 
   playMsg "Core" "please_identify";
   return 1
 
}
 
}

Exemple de contenu de codes.tcl

set code_A 9277;set code_B 7070;set code_C 7223;