151 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"code.google.com/p/goconf/conf"
 | |
| 	"database/sql"
 | |
| 	"flag"
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"os/user"
 | |
| 	"path"
 | |
| )
 | |
| 
 | |
| type AsinkGlobals struct {
 | |
| 	configFileName string
 | |
| 	syncDir        string
 | |
| 	cacheDir       string
 | |
| 	tmpDir         string
 | |
| 	db             *sql.DB
 | |
| 	storage        Storage
 | |
| }
 | |
| 
 | |
| var globals AsinkGlobals
 | |
| 
 | |
| func init() {
 | |
| 	const config_usage = "Config File to use"
 | |
| 	userHomeDir := "~"
 | |
| 
 | |
| 	u, err := user.Current()
 | |
| 	if err == nil {
 | |
| 		userHomeDir = u.HomeDir
 | |
| 	}
 | |
| 
 | |
| 	flag.StringVar(&globals.configFileName, "config", path.Join(userHomeDir, ".asink", "config"), config_usage)
 | |
| 	flag.StringVar(&globals.configFileName, "c", path.Join(userHomeDir, ".asink", "config"), config_usage+" (shorthand)")
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	flag.Parse()
 | |
| 	fmt.Println("config file:", globals.configFileName)
 | |
| 
 | |
| 	config, err := conf.ReadConfigFile(globals.configFileName)
 | |
| 	if err != nil {
 | |
| 		fmt.Println(err)
 | |
| 		fmt.Println("Error reading config file at ", globals.configFileName, ". Does it exist?")
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	globals.storage, err = GetStorage(config)
 | |
| 	if err != nil {
 | |
| 		fmt.Println(err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	globals.syncDir, err = config.GetString("local", "syncdir")
 | |
| 	globals.cacheDir, err = config.GetString("local", "cachedir")
 | |
| 	globals.tmpDir, err = config.GetString("local", "tmpdir")
 | |
| 
 | |
| 	//make sure all the necessary directories exist
 | |
| 	err = ensureDirExists(globals.syncDir)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	err = ensureDirExists(globals.cacheDir)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	err = ensureDirExists(globals.tmpDir)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 
 | |
| 	//TODO FIXME REMOVEME
 | |
| 	fmt.Println(globals.syncDir)
 | |
| 	fmt.Println(globals.cacheDir)
 | |
| 	fmt.Println(globals.tmpDir)
 | |
| 	fmt.Println(globals.storage)
 | |
| 	//TODO FIXME REMOVEME
 | |
| 
 | |
| 	fileUpdates := make(chan *Event)
 | |
| 	go StartWatching(globals.syncDir, fileUpdates)
 | |
| 
 | |
| 	globals.db, err = GetAndInitDB(config)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	for {
 | |
| 		event := <-fileUpdates
 | |
| 		ProcessEvent(globals, event)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ProcessEvent(globals AsinkGlobals, event *Event) {
 | |
| 	//add to database
 | |
| 	err := DatabaseAddEvent(globals.db, event)
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 
 | |
| 	if event.IsUpdate() {
 | |
| 		//copy to tmp
 | |
| 		tmpfilename, err := copyToTmp(event.Path, globals.tmpDir)
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 		event.Status |= COPIED_TO_TMP
 | |
| 
 | |
| 		//get the file's hash
 | |
| 		hash, err := HashFile(tmpfilename)
 | |
| 		event.Hash = hash
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 		event.Status |= HASHED
 | |
| 
 | |
| 		//rename to local cache w/ filename=hash
 | |
| 		err = os.Rename(tmpfilename, path.Join(globals.cacheDir, event.Hash))
 | |
| 		if err != nil {
 | |
| 			err := os.Remove(tmpfilename)
 | |
| 			if err != nil {
 | |
| 				panic(err)
 | |
| 			}
 | |
| 		}
 | |
| 		event.Status |= CACHED
 | |
| 
 | |
| 		//update database
 | |
| 		err = DatabaseUpdateEvent(globals.db, event)
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 
 | |
| 		//upload file to remote storage
 | |
| 		err = globals.storage.Put(event.Path, event.Hash)
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 		event.Status |= UPLOADED
 | |
| 
 | |
| 		//update database again
 | |
| 		err = DatabaseUpdateEvent(globals.db, event)
 | |
| 		if err != nil {
 | |
| 			panic(err)
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 	fmt.Println(event)
 | |
| 
 | |
| 	//TODO notify server of new file
 | |
| }
 |