github.com/aporeto-inc/trireme-lib@v10.358.0+incompatible/utils/nfqparser/nfqparser.go (about)

     1  package nfqparser
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	"io/ioutil"
     7  	"strings"
     8  	"sync"
     9  )
    10  
    11  // NFQParser holds nfqparser fields
    12  type NFQParser struct {
    13  	nfqStr string
    14  	// NOTE: For unit test
    15  	filePath string
    16  	contents map[string]NFQLayout
    17  
    18  	sync.Mutex
    19  }
    20  
    21  // NewNFQParser returns nfqparser handler
    22  func NewNFQParser() *NFQParser {
    23  
    24  	return &NFQParser{
    25  		contents: make(map[string]NFQLayout),
    26  		filePath: nfqFilePath,
    27  	}
    28  }
    29  
    30  // Synchronize reads from file and parses it
    31  func (n *NFQParser) Synchronize() error {
    32  
    33  	n.Lock()
    34  	defer n.Unlock()
    35  
    36  	data, err := ioutil.ReadFile(n.filePath)
    37  	if err != nil {
    38  		return err
    39  	}
    40  
    41  	n.nfqStr = string(data)
    42  
    43  	scanner := bufio.NewScanner(bytes.NewReader(data))
    44  	for scanner.Scan() {
    45  		line := scanner.Text()
    46  		lineParts := strings.Fields(line)
    47  		newNFQ := makeNFQLayout(lineParts)
    48  
    49  		n.contents[newNFQ.QueueNum] = newNFQ
    50  	}
    51  
    52  	return nil
    53  }
    54  
    55  // RetrieveByQueue returns layout for a specific queue number
    56  func (n *NFQParser) RetrieveByQueue(queueNum string) *NFQLayout {
    57  
    58  	n.Lock()
    59  	defer n.Unlock()
    60  
    61  	content, ok := n.contents[queueNum]
    62  	if ok {
    63  		return &content
    64  	}
    65  
    66  	return nil
    67  }
    68  
    69  // RetrieveAll returns all layouts
    70  func (n *NFQParser) RetrieveAll() map[string]NFQLayout {
    71  
    72  	n.Lock()
    73  	defer n.Unlock()
    74  
    75  	return n.contents
    76  }
    77  
    78  // String returns string renresentation of nfqueue data
    79  func (n *NFQParser) String() string {
    80  
    81  	n.Lock()
    82  	defer n.Unlock()
    83  
    84  	return n.nfqStr
    85  }
    86  
    87  func makeNFQLayout(data []string) NFQLayout {
    88  
    89  	newNFQ := NFQLayout{}
    90  	newNFQ.QueueNum = data[0]
    91  	newNFQ.PeerPortID = data[1]
    92  	newNFQ.QueueTotal = data[2]
    93  	newNFQ.CopyMode = data[3]
    94  	newNFQ.CopyRange = data[4]
    95  	newNFQ.QueueDropped = data[5]
    96  	newNFQ.UserDropped = data[6]
    97  	newNFQ.IDSequence = data[7]
    98  
    99  	return newNFQ
   100  }