[Gelöst] Rtorrent automatisch drosseln bei Gesprächen in Asterisk

xrated

Aktives Mitglied
Mitglied seit
2 Jul 2012
Beiträge
823
Punkte für Reaktionen
2
Punkte
18
Ich würde gerne einen bestimmten Daemon unter Linux stoppen sobald ein Gespräch geführt wird und beim auflegen soll dieser Daemon wieder gestartet werden. Ist sowas überhaupt möglich?
Ich habs selbst schon mal probiert mittels System cmd und sudoers, hat aber nicht funktioniert.
Asterisk läuft allerdings nicht mit Root und der Daemon wird normalerweise von Root über ein init.d Script gestartet aber der entsprechende Prozess läuft auch nicht mit Root und wird auch noch mittels screen gestartet.
 
Zuletzt bearbeitet:
Asterisk-technisch kannst Du nur System() machen. Der Rest ist Berechtigungssache.
 
Nach ewigem probieren habe ich das nun mit sudoers hinbekommen. Bei Gesprächsbeginn wird ein Tastaturbefehl via screen zu rtorrent gesendet.
Gibt es noch eine Möglichkeit das bei Gesprächsende erneut ein Befehl gesendet wird? Weil der hangup erfolgt ja automatisch.
 
Tolle Sache! Nun kann man endlich ohne stottern telefonieren während P2P läuft. QoS hilft da nämlich auch nicht immer 100%.

Folgendes via visudo eintragen (mein Host heisst Server):
Code:
Cmnd_Alias SCR = /usr/bin/sudo -u rt
Cmnd_Alias SCR2 = /usr/bin/screen -S rtorrent -X eval stuff ^Xdownload_rate=[[\:digit\:]]*^M stuff ^Xupload_rate=[[\:digit\:]]^M

asterisk SERVER=(rt)NOPASSWD: SCR,SCR2

:/bin/false muss in passwd nicht geändert werden

Ein Testabschnitt in extensions.conf

Code:
[test]
exten => 20,1,Answer
exten => 20,n,System(sudo -u rt screen -S rtorrent -X eval 'stuff ^Xdownload_rate=1^M' 'stuff ^Xupload_rate=1^M')
exten => 20,n,MusicOnHold()
exten => 20,n,Hangup
exten => h,1,System(sudo -u rt screen -S rtorrent -X eval 'stuff ^Xdownload_rate=300^M' 'stuff ^Xupload_rate=30^M')
 
Zuletzt bearbeitet:
Schön, dann könntest Du das Titel-Prefix bitte auf "gelöst" ändern.
 
Für jeden einzeln, sobald aufgelegt wird. Wenn Du das vermeiden willst, verwende GROUP() und GROUP_COUNT().
 
puuh jetzt wirds kompliziert. Also alles ist bei einem Provider aber ich habe dort 2 Nummern registriert.

Muss ich dann bei jeder Nummer die ich habe die Kategorie vom Channel ändern? Weil bei Asterisk muss ja glaube ich jedes Gespräch auf einem eigenem Channel sein oder?
 
Schau Dir hier das Beispiel 2 an, das machts vielleicht etwas deutlicher.

In Deinem Fall würdest Du für externe Gespräche eine GROUP setzen (meinst Du das mit "Kategorie vom Channel"?), und in der h-extension mit GROUP_COUNT nachschauen, ob noch andere Channels dieser Gruppe aktiv sind.
 
Mit Ausnahme eines kleinen Syntaxfehler, ja.
exten => h,1,GotoIf($[${GROUP_COUNT(trunkgroup1)} = 0]?throttlecontext,ext,zeile)

Oder um nicht für ein Kommando groß herumspringen zu müssen
Code:
exten => h,1,ExecIf($[${GROUP_COUNT(trunkgroup1)}=0]?System(sudo ...))
 
Also hier alles komplett. Vorraussetzung ist das rtorrent mit dem User rt läuft.

Mit visudo habe folgendes in sudoers eingetragen:
Code:
Host_Alias SERVER = 192.168.2.2
Cmnd_Alias C1 = /usr/bin/screen -S rtorrent -X eval stuff ^Xdownload_rate=[0-9]*^M stuff ^Xupload_rate=[0-9]*^M
Cmnd_Alias C2 = /bin/chown rt\:tty /dev/pts/[1-9]
asterisk SERVER=(rt)NOPASSWD: C1
asterisk SERVER=(root)NOPASSWD: C2

Der Chown ist deswegen drin weil bei einem ssh connect auf diese Maschine, jedes mal das tty von user rt auf den ssh user abgeändert wird und man dann keine Rechte mehr hat mit dem screen cmd.
Bei sudoers sollte man auch beachten was man freigibt. Würde man einfach chown user:group /dev/pts/* schreiben, könnte der User ein chown z.B. auf /dev/pts/../../root absetzen.

Damit man in asterisk nicht den vollen Syntax braucht habe ich ein kleines Script unter /usr/local/bin namens rtthrottle.sh was auch den chown nur dann macht wenn benötigt:
Code:
#!/bin/bash
var1=$1
var2=$2
if [[ "${var1}" -ge "0" ]] && [[ "${var2}" -ge "0" ]]; then
    for file in `find /dev/pts/* ! -user rt`; do
	sudo -u root chown rt:tty $file;
    done
    sudo -u rt screen -S rtorrent -X eval 'stuff ^Xdownload_rate='$var1'^M' 'stuff ^Xupload_rate='$var2'^M'
else
    echo "Error: Please specify down and up speed!"
fi

Der User asterisk muss darauf r und x Rechte haben.

Unter /etc/cron.d/rtorrent habe ich nochmal die Throttle zusätzlich je nach Tageszeit gedrosselt (optional):
Code:
0 18 * * 1-7 root /usr/local/bin/rtthrottle.sh 0 0
0 9 * * 1-5 root /usr/local/bin/rtthrottle.sh 300 30

Nun zum eigentlichen Dialplan:
Code:
[test]
exten => 20,1,Answer
exten => 20,n,System(/usr/local/bin/rtthrottle.sh 1 1)
exten => 20,n,SET(GROUP()=trunkgroup1)
exten => 20,n,MusicOnHold()
exten => 20,n,Hangup
exten => h,1,ExecIf($[${GROUP_COUNT(trunkgroup1)}=0]?System(/usr/local/bin/rtthrottle.sh 300 30))
 
Kostenlos!

Statistik des Forums

Themen
248,872
Beiträge
2,303,453
Mitglieder
378,532
Neuestes Mitglied
Nik320