|  |  | @ -10,8 +10,8 @@ import ( | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"github.com/subgraph/fw-daemon/nfqueue" |  |  |  | 	"github.com/subgraph/fw-daemon/nfqueue" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"io/ioutil" |  |  |  | 	"io/ioutil" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"os" |  |  |  | 	"os" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"path/filepath" |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"strconv" |  |  |  | 	"strconv" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	"path" | 
			
		
	
		
		
			
				
					
					|  |  |  | ) |  |  |  | ) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | const ( |  |  |  | const ( | 
			
		
	
	
		
		
			
				
					|  |  | @ -168,24 +168,35 @@ func parseRule(s string) (*Rule, error) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return r, nil |  |  |  | 	return r, nil | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | const ruleFile = ".sgfw_rules" |  |  |  | const ruleFile = "/var/lib/sgfw/sgfw_rules" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | func rulesPath() string { |  |  |  | func maybeCreateDir(dir string) error { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	home := os.Getenv("HOME") |  |  |  | 	_,err := os.Stat(dir) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if home != "" { |  |  |  | 	if os.IsNotExist(err) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return filepath.Join(home, ruleFile) |  |  |  | 		return os.MkdirAll(dir, 0755) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 	// XXX try something else?
 |  |  |  | 	return err | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	return "" |  |  |  | } | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | func rulesPath() (string, error) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	if err := maybeCreateDir(path.Dir(ruleFile)); err != nil { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		return ruleFile, err | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	return ruleFile, nil | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | func (fw *Firewall) saveRules() { |  |  |  | func (fw *Firewall) saveRules() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	fw.lock.Lock() |  |  |  | 	fw.lock.Lock() | 
			
		
	
		
		
			
				
					
					|  |  |  | 	defer fw.lock.Unlock() |  |  |  | 	defer fw.lock.Unlock() | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	f, err := os.Create(rulesPath()) |  |  |  | 	p,err := rulesPath() | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	if err != nil { |  |  |  | 	if err != nil { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		log.Warning("Failed to open %s for writing: %v", rulesPath(), err) |  |  |  | 		log.Warning("Failed to open %s for writing: %v", p, err) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		return | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	f, err := os.Create(p) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	if err != nil { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		log.Warning("Failed to open %s for writing: %v", p, err) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return |  |  |  | 		return | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 	defer f.Close() |  |  |  | 	defer f.Close() | 
			
		
	
	
		
		
			
				
					|  |  | @ -227,10 +238,15 @@ func (fw *Firewall) loadRules() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	fw.lock.Lock() |  |  |  | 	fw.lock.Lock() | 
			
		
	
		
		
			
				
					
					|  |  |  | 	defer fw.lock.Unlock() |  |  |  | 	defer fw.lock.Unlock() | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	bs, err := ioutil.ReadFile(rulesPath()) |  |  |  | 	p,err := rulesPath() | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	if err != nil { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		log.Warning("Failed to open %s for reading: %v", p, err) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		return | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	bs, err := ioutil.ReadFile(p) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if err != nil { |  |  |  | 	if err != nil { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if !os.IsNotExist(err) { |  |  |  | 		if !os.IsNotExist(err) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			log.Warning("Failed to open %s for reading: %v", rulesPath(), err) |  |  |  | 			log.Warning("Failed to open %s for reading: %v", p, err) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return |  |  |  | 		return | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
	
		
		
			
				
					|  |  | 
 |