Methode zur Bearbeitung der Konfigurationsdatei

Nico.Lausch

Neuer User
Mitglied seit
11 Jul 2007
Beiträge
55
Punkte für Reaktionen
0
Punkte
0
Hallo

ich bin gerade am planen wie ich die config Dateien
  • extensions.conf
  • sip.conf
  • & Co.

am besten per Interface (PHP) bearbeiten kann.

Ich dachte mir ich schreibe mir eine Art INI-Parser ...
hat jemand einen besseren Lösungsansatz?
 
Zuletzt bearbeitet:
z.B. damit
oder SSH und (vi/nano/mcedit)

Viele Grüße

Florian
 
Ich habe die Sache mal anprogrammiert ...
bitte nicht schimpfen da ich nicht alles 100 % kommentiert hab :)

kann wieder fast 1:1 übernommen werden
nur den Pfad für $configPath anpassen

Die Sache liest zur Zeit nur die Konfiguration aus.
Am Bearbeiten bin ich gerade dran.

bin für Verbesserungsforschläge & Anregungen dankbar.

index.php
PHP:
	// Klassen-Includes
	include("class.asteriskconfig.php");
	
	// Klassen-Instanziierung
	$ASTERISKCONFIG = new ASTERISKCONFIG();
	
	// Klassen-Funktionsaufruf
	$ASTERISKCONFIG->editAllConfigContext();
	$ASTERISKCONFIG->getErrors();

class.asteriskconfig.php
PHP:
	class ASTERISKCONFIG{
		
		// Globale Variablen
		public $errorLog = array();
		public $configFileBuffer; 		// Hält den Inhalt der Konfigurationsdatei bereit
	
		
		function ASTERISKCONFIG() {
			// Konfigurationsdatei in Globalen-String einlesen
			$this->configFileBuffer = $this->readConfig();
		}
		
		function exitsConfig($f) {
			// Pfad zur Konfigurationsdatei, welche ausgelesen werden soll
			$configPath = $f;
			// Datei existiert
			if(file_exists($configPath)){
				return true;
			}
			// Datei existiert nicht
			else {
				array_push($this->errorLog,'Konfigurationsdatei wurde nicht gefunden: <b>'.$configPath.'</b>');
				return false;
			}
		}
		
		function readConfig(){
			// Pfad zur Konfigurationsdatei, welche ausgelesen werden soll
			$configPath = './_config/extensions.conf';
			// Existiert die Konfigurationsdatei
			if($this->exitsConfig($configPath)) {
				
				// Konfigurationsdatei auslesen ...
				$configFile = file_get_contents($configPath);
				return $configFile;
				
			}
		}
		
		function getConfigContext($searchContext){
			
			
			/*												*/
			/* Context aus der Konfigurationsdatei ausgeben */
			/*												*/

			// Startposition vom Context in der Konfigurationsdatei suchen
			$startPosOfSearchContext = strpos($this->configFileBuffer, $searchContext);
			
			// Context-Such-Muster
			$pattern = '/([\[][ ]*'.$searchContext.'[ ]*[\]][\nA-Za-z0-9_\-,.\$\{\}\&=>\(\)\:\@\|\"\'\/ ;#]*)/';
			preg_match($pattern, $this->configFileBuffer, $match, PREG_OFFSET_CAPTURE);
			// Context wurde gefunden
			if($match[0][0]) {
				return $match[0][0];
			}
			// Context existiert nicht
			else {
				array_push($this->errorLog,'Context ist in der Datei: <b>'.$configPath.'</b> nicht vorhanden: <b>'.$searchContext.'</b>');
				return false;
			}
		}
		
		
		function editConfigContext($searchContext) {
			$context = $this->getConfigContext($searchContext);
			// Wenn Context existiert
			if($context) {
				// Umbrüche konvertieren
				$context = nl2br($context);
				// Umbrüche umwandeln
				$context = str_replace('<br />','***ASTERISK***',$context);
				// Context in ein Array lesen anhand der zuvor erstellen Zeichen (***ASTERISK***)
				$context = explode('***ASTERISK***',$context);
				// Context(Array) auslesen
				for($i=0;$i<count($context);$i++){
					// Wenn erste Stelle im String ein Buchstabe oder ein [ ist 
					// somit werden alle anderen Zeilen, wie z.B. Kommentare ausgeschlossen
					if(preg_match('([\]A-Za-z0-9])', $context[$i][1], $match, PREG_OFFSET_CAPTURE)){
						echo '<input type="" name="editcontext_'.$context[$i].'" value="'.$context[$i].'" style="width:400px;" /><br />';
					}
				}
			}
		}
		
		function editAllConfigContext(){
			$allContext = $this->getAllConfigContexts();
			for($i=0;$i<count($allContext);$i++){
				// Eckige Klammern abschneiden
				$context = substr($allContext[$i],1,strlen($allContext[$i])-2);
				// Jeden Context aus der Konfigurationsdatei einzeln auslesen
				echo '<b>'.$context.'</b><br />';
				$this->editConfigContext($context);
				echo '<br />';
			}
		}
		
		
		function getAllConfigContexts() {
			// AllContext-Such-Muster
			$pattern = '/([\[][ ]*[A-Za-z0-9_]*[ ]*[\]])/';
			preg_match_all($pattern, $this->configFileBuffer, $match);
			// Contexte wurde gefunden
			if($match[0]) {
				return $match[0];
			}
			// Contexte existiert nicht
			else {
				array_push($this->errorLog,'Keine Contexte in der Datei: <b>'.$configPath.'</b> vorhanden');
				return false;
			}
		}
		
		
		function getErrors(){
			echo 'Error & Debug Meldungen:<br />';
			echo '----------------------------<br />';
			// Fehler ausgeben
			for($i=0;$i<count($this->errorLog);$i++){
				echo '['.$i.'] '.$this->errorLog[$i].'<br />';
			}
		}
		
	}

und der Vollständigkeitshalber ...
./_config/extensions.conf
PHP:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                    ;
; Diese Datei beinhaltet den Waehlplan.              ;
; Hier werden alle Anrufe (Ein und Ausgehende)       ;
; geroutet, welche ueber die Telefonanlage kommen.   ;
;                                                    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;
; Generelle Einstellungen
;

[general]
Static=yes
Writeprotect=no

;
; Globale Einstellungen
;

[globals]
IAXINFO=guest

;
; In diesem Context wird festgelegt,
; welche Nebenstellen (SIP oder ISDN)
; bei welchen eingehende ISDN-MSN (angerufende Nummern)
; reagieren sollen und ueber welche Kanaele 
; die Nebenstellen laufen (SIP "SIP" oder ISDN "Zap/g2").
;

[call_incoming_ISDN]
exten => XXXXXX,1,Dial(SIP/80&SIP/81,60,tT)
exten => XXXXXX,n, VoiceMail(11)

;
; In diesem Context wird festgelegt,
; welche Nebenstellen (SIP oder ISDN)
; bei welchen einegehenden SIPGATE-MSN (angerufende Nummern)
; reagieren sollen und ueber welche Kanaele 
; die Nebenstellen laufen (SIP "SIP" oder ISDN "Zap/g2").
;

[call_incoming_SIPGATE]
exten =>  XXXXXX,1,Dial(Zap/g2/50,60,tT)
exten =>  XXXXXX,2,Hangup

;
; In diesem Context wird festgelegt,
; Ueber welche ISDN-Leitung raustelefoniert 
; wird, bei einer einer
;
; VORWAHL von: 20
;

[call_outcoming_ISDN]
exten => _20.,1,Dial(Zap/g1/${EXTEN:2},60,tT)
exten => _20.,2, Hangup

;
; In diesem Context wird festgelegt,
; Ueber welche SIP-Leitung raustelefoniert 
; wird, bei einer einer
;
; VORWAHL von: 30
;

[call_outcoming_SIPGATE]
exten => _30.,1,SetCallerID,XXXXX
exten => _30.,2, Dial,SIP/${EXTEN:2}@XXXXX|45|r
exten => _30.,3, Busy

;
; In diesem Context wird festgelegt,
; welche Nebenstellen bei welchen 
; internen Rufnummern reagieren und 
; ueber welche Kanaele die Nebenstellen
; laufen (SIP "SIP" oder ISDN "Zap/g2").
;

[intern]
exten => 80,1,Dial(SIP/80/60)
exten => 81,1,Dial(SIP/81/60)
exten => 90,1,Dial(Zap/g2/90/60)

; 
; In diesem Context wird festgelegt
; ueber welche Nummer ein ECHO-Test
; stattfindet.
;

[echotest]
exten => 00,1,answer
exten => 00,2,wait,1
exten => 00,3,playback,demo-echotest
exten => 00,4,echo,
exten => 00,5,playback,demo-echodone
exten => 00,6,hangup


;
; In diesem Context werden die oben 
; erzeugte Contexte der uebersicht halber
; geordnet und includiert.
;
; Dieser Context wird in der /etc/asterisk/zapata.conf
; sowohl fuer die eingehenden als auch fuer die 
; ausgehenden Anrufe genutzt, deswegen gibt es auch 
; die Unterscheidung Zwischen "IN" und "OUT" Calls 
; unter den einzelnen Contexen.
;

[default]
 
;IN
Include => call_incoming_ISDN
Include => call_incoming_SIPGATE
 
;OUT
Include => call_outcoming_ISDN
Include => call_outcoming_SIPGATE
 
;INTERN
Include => intern
 
;ECHO-TEST
Include => echotest
 
Kostenlos!

Neueste Beiträge

Statistik des Forums

Themen
248,866
Beiträge
2,303,227
Mitglieder
378,522
Neuestes Mitglied
Christian_B70