ML
    • Recent
    • Categories
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Need to parse large conf files

    Scheduled Pinned Locked Moved Solved IT Discussion
    scriptingasteriskconfig
    53 Posts 6 Posters 3.0k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • matteo nunziatiM
      matteo nunziati @matteo nunziati
      last edited by matteo nunziati

      @matteo-nunziati said in Need to parse large conf files:

      ok my last s**t, just in case @JaredBusch doesn't know what to do waiting for @Pete-S

      grep -B3 -n -e "^exten\|^\[" $YOURFILENAME | sort -n | uniq | cut -f2 -d: | cut -f2 -d- | grep -e "^[e\[\;]"
      

      still not granted to get only valid exten

      this is the outcome for @Pete-S test file:

      ;; This is a test file
      [context_1]
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ;;   Ben's inbound 2344242342                      ;
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      exten => 2344242342,1,NoOp()
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ;;   Bob's inbound 3145551212                      ;
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      exten => 3145551212,1,NoOp()
      ;;  Mary's inbound 4534535345                      ;
      ;   With some added comments                       ;
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      exten => 4534535345,1,NoOp()
      [context_2]
      exten => 33333333,1,NoOp()
      ;    Line 3,,,                                     ;
      ;    Line 4;Let's see if that comment remains      ;
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      exten => 3145454,1,NoOp()
      ;   And lets add this too                         ;;
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      exten => 232342,1,NoOp()
      [context_3]
      exten => 7777777,1
      exten => 8888888,1,NoOp()
      
      JaredBuschJ 1 Reply Last reply Reply Quote 0
      • JaredBuschJ
        JaredBusch @matteo nunziati
        last edited by

        @matteo-nunziati said in Need to parse large conf files:

        ok my last s**t, just in case @JaredBusch doesn't know what to do waiting for @Pete-S
        still not granted to get only valid exten

        doens't work right on a live file. close. but not correct.

        1 Reply Last reply Reply Quote 0
        • JaredBuschJ
          JaredBusch @JaredBusch
          last edited by JaredBusch

          @JaredBusch said in Need to parse large conf files:

          // find matching files, put in array called filename
          $filename:=glob("*.ini");

          it doesn't like the :

          I moved a copy of the files to the FreePBX 14 box since PHP 5.6 is "current" for CentOS.

          [jbusch@cccfreepbx newton_conf]$ sudo -u asterisk php parseit.php 
          PHP Parse error:  syntax error, unexpected ':' in /var/www/html/newton_conf/parseit.php on line 3
          

          2821a8fe-1c2b-4c43-9f87-68a5baecf3aa-image.png

          3817d8e0-37a5-4835-870f-0158ff0cd659-image.png

          1 2 Replies Last reply Reply Quote 0
          • 1
            1337 @JaredBusch
            last edited by

            @JaredBusch

            Hang on a sec. I'm just about finished.

            1 2 Replies Last reply Reply Quote 0
            • 1
              1337 @1337
              last edited by 1337

              This is the output:

              File: sample.conf
              [context_1]
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ;;   Bob's inbound 3145551212                      ;
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              exten => 3145551212,1,NoOp()
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ;;  Mary's inbound 4534535345                      ;
              ;   With some added comments                       ;
              exten => 4534535345,1,NoOp()
              [context_2]
              exten => 33333333,1,NoOp()
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ;;   What is this????????????                      ;
              ;    Lets add a long comment section               ;
              exten => 3145454,1,NoOp()
              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ;;  Let's make a wonky comment line here
              ;   And lets add this too                         ;;
              exten => 232342,1,NoOp()
              [context_3]
              exten => 7777777,1
              exten => 8888888,1,NoOp()
              

              Personally I'd format it a little for instance by remove all comment lines that are just ;;;;;; and all trailing and preceding ;

              Or if it's just for viewing I'd html it.

              1 Reply Last reply Reply Quote 0
              • 1
                1337 @1337
                last edited by

                This is the complete php file with comments.

                It takes all *.conf files and goes through them.

                <?php
                
                   // find matching files, put in array called filename
                   $filename=glob("*.conf");
                   
                
                   // scan through all the files
                   foreach ($filename as $f) {
                      // print filename
                      print "File: $f\n";
                
                      // read all lines into lines array
                      $lines=file($f);
                
                      $no=0; // linenumber
                      $comment=[]; // comments array
                
                      // go through the file and pick out what we need
                      foreach ($lines as $line) {
                         $no++;
                
                         // look for [context]
                         if ($line[0]=='[') {
                            $context=$line;
                            print "$context";
                         }
                         
                         // look for extensions
                         $search="exten =>";
                         if (substr($line,0,strlen($search))==$search) {
                            //print $line;
                
                            // we found the extension row
                            // lets take everything after "exten =>"
                            $extline=trim(substr($line,strlen($search)));
                
                            // lets divide it up
                            $parts=explode(',', $extline);
                            $ext=$parts[0]; // extension number
                
                            // check that it's ?????,1,?????
                            if ($parts[1]=='1') {
                               // valid extension, actual extension is $parts[0];
                               $ext=$line;
                               // print comments
                               foreach($comment as $c) print "$c";
                               // print the extesion and empty line
                               print "$ext";
                            }
                            $comments=[]; // clear comments
                         }
                         
                         // look for comments
                         if ($line[0]==';') {
                            // add to comments but only first 3 lines
                            if (count($comment)<3) $comment[]=$line;
                            //print_r($comment);
                         } else {
                
                            // non empty line? => clear comments
                            if (trim($line)>'') $comment=[];
                
                         }
                      }
                   }
                
                ?>
                
                1 Reply Last reply Reply Quote 0
                • 1
                  1337 @JaredBusch
                  last edited by 1337

                  @JaredBusch said in Need to parse large conf files:

                  @JaredBusch said in Need to parse large conf files:

                  // find matching files, put in array called filename
                  $filename:=glob("*.ini");

                  it doesn't like the :

                  I moved a copy of the files to the FreePBX 14 box since PHP 5.6 is "current" for CentOS.

                  It's because I've been working with another language all day that uses := to assign a variable and not just =

                  Takes me a few minutes to reboot my brain into php mode. :smiling_face_with_smiling_eyes:

                  1 1 Reply Last reply Reply Quote 0
                  • 1
                    1337 @1337
                    last edited by 1337

                    Just for fun I found some extensions.conf file on the net to try. It led me to add some better formatting so the output is more readable.

                    PS. Just a small change like this that would have caused hours of search on regex, options for grep, awk, sed etc to try and make something work. That's why I think it's easier to just go full on programming language as soon as it is more complex than just finding a few lines that matches.

                    I know as this is all for naught but whatever.

                    Output from the php script:

                    File: sample.conf
                    
                    [context_1]
                    ; Bob's inbound 3145551212
                    exten => 3145551212,1,NoOp()
                    
                    ; Mary's inbound 4534535345
                    ; With some added comments
                    exten => 4534535345,1,NoOp()
                    
                    [context_2]
                    exten => 33333333,1,NoOp()
                    
                    ; What is this????????????
                    ; Lets add a long comment section
                    ; Line 3,,,
                    exten => 3145454,1,NoOp()
                    
                    ; Let's make a wonky comment line here
                    ; And lets add this too
                    exten => 232342,1,NoOp()
                    
                    [context_3]
                    exten => 7777777,1
                    
                    exten => 8888888,1,NoOp()
                    

                    PHP script v2

                    <?php
                       // Ver 2 - improved formatting, only showing headings that have extensions
                       
                       // find matching files, put in array called filename
                       $filename=glob("*.conf");
                       
                    
                       // scan through all the files
                       foreach ($filename as $f) {
                          // print filename
                          print "File: $f\n\n";
                    
                          // read all lines into lines array
                          $lines=file($f);
                    
                          $no=0; // linenumber
                          $comment=[]; // comments array
                          $context=''; // context text
                    
                          // go through the file and pick out what we need
                          foreach ($lines as $line) {
                             $no++;
                    
                             // look for [context]
                             if ($line[0]=='[') {
                                $context=trim($line);
                             }
                             
                             // look for extensions
                             $search="exten =>";
                             if (substr($line,0,strlen($search))==$search) {
                                //print $line;
                    
                                // we found the extension row
                                // lets take everything after "exten =>"
                                $extline=trim(substr($line,strlen($search)));
                    
                                // lets divide it up
                                $parts=explode(',', $extline);
                    
                                // check that it's ?????,1,?????
                                if ($parts[1]=='1') {
                                   // valid extension, actual extension is $parts[0];
                                   $ext=trim($line);
                                   
                                   // print context if it has not been printed
                                   if ($context>'') { print "$context\n"; $context=''; }
                                   // print comments
                                   foreach($comment as $c) print "; $c\n";
                                   // print the extension and empty line
                                   print "$ext\n\n";
                                }
                                $comments=[]; // clear comments
                             }
                             
                             // look for comments
                             if ($line[0]==';') {
                                // remove whitespace and ;
                                $s=trim($line,"; \t\n\r\0\x0B");
                                // add to comments if not empty but only first 3 lines
                                if (($s>'') and (count($comment)<3)) $comment[]=$s;
                             } else {
                    
                                // non empty line? => clear comments
                                if (trim($line)>'') $comment=[];
                    
                             }
                          }
                       }
                    
                    
                    ?>
                    
                    JaredBuschJ 2 Replies Last reply Reply Quote 1
                    • JaredBuschJ
                      JaredBusch @1337
                      last edited by

                      @Pete-S this all hit as I was commuting home.

                      I have a copy of the files on a server I have access to from home and will be working on this tomorrow.

                      Thanks.

                      1 Reply Last reply Reply Quote 0
                      • JaredBuschJ
                        JaredBusch @1337
                        last edited by

                        @Pete-S Well tomorrow becamse the following Wednesday.. But. this works perfectly.

                        Now to figure out WTF all this stuff is that I need to replicate into FreePBX.

                        8c904acf-bfbc-480e-855a-b0985bd7c306-image.png

                        073eba70-ab8c-4c70-b633-2b41ea9972a2-image.png

                        1 1 Reply Last reply Reply Quote 1
                        • 1
                          1337 @JaredBusch
                          last edited by

                          @JaredBusch Glad it worked as intended.

                          1 Reply Last reply Reply Quote 0
                          • 1
                          • 2
                          • 3
                          • 1 / 3
                          • First post
                            Last post