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 }