Exemplo n.º 1
0
Arquivo: abot.go Projeto: itsabot/abot
func buildPluginFile(l *log.Logger) *core.PluginJSON {
	// Create plugins.go file, truncate if exists
	fi, err := os.Create("plugins.go")
	if err != nil {
		l.Fatal(err)
	}
	defer func() {
		if err = fi.Close(); err != nil {
			l.Fatal(err)
		}
	}()

	s := "// This file is generated by `abot plugin install`. Do not edit.\n"
	s += "package main\n\nimport (\n"
	for url := range core.Conf().Dependencies {
		// Insert _ imports
		s += fmt.Sprintf("\t_ \"%s\"\n", url)
	}
	s += ")"
	_, err = fi.WriteString(s)
	if err != nil {
		l.Fatal(err)
	}

	return core.Conf()
}
Exemplo n.º 2
0
Arquivo: abot.go Projeto: itsabot/abot
func updateGlockfileAndInstall(l *log.Logger) {
	outC, err := exec.
		Command("/bin/sh", "-c", `pwd | sed "s|$GOPATH/src/||"`).
		CombinedOutput()
	if err != nil {
		l.Info(string(outC))
		l.Fatal(err)
	}

	// Update plugin dependency versions in GLOCKFILE
	p := string(outC)
	outC, err = exec.
		Command("/bin/sh", "-c", "glock save "+p).
		CombinedOutput()
	if err != nil {
		l.Info(string(outC))
		l.Fatal(err)
	}

	outC, err = exec.
		Command("/bin/sh", "-c", "go install").
		CombinedOutput()
	if err != nil {
		l.Info(string(outC))
		l.Fatal(err)
	}
}
Exemplo n.º 3
0
Arquivo: abot.go Projeto: itsabot/abot
func embedPluginConfs(plugins *core.PluginJSON, l *log.Logger) {
	log.Debug("embedding plugin confs")

	// Open plugins.go file for writing
	fi, err := os.OpenFile("plugins.go", os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		l.Fatal(err)
	}
	defer func() {
		if err = fi.Close(); err != nil {
			l.Fatal(err)
		}
	}()

	p := os.Getenv("GOPATH")
	tokenizedPath := strings.Split(p, string(os.PathListSeparator))

	// Insert plugin.json text as comments
	s := "\n\n/*\n"
	for u := range plugins.Dependencies {
		s += u + "\n"
		log.Debug("reading file", p)
		p = filepath.Join(tokenizedPath[0], "src", u, "plugin.json")
		fi2, err2 := os.Open(p)
		if err2 != nil {
			l.Fatal(err2)
		}
		scn := bufio.NewScanner(fi2)
		var tmp string
		for scn.Scan() {
			line := scn.Text() + "\n"
			s += line
			tmp += line
		}
		if err2 = scn.Err(); err2 != nil {
			l.Fatal(err2)
		}
		if err2 = fi2.Close(); err2 != nil {
			l.Fatal(err2)
		}

		var plg struct{ Name string }
		if err2 = json.Unmarshal([]byte(tmp), &plg); err2 != nil {
			l.Fatal(err2)
		}

		// Fetch remote plugin IDs to be included in the plugin confs
		plg.Name = url.QueryEscape(plg.Name)
		ul := os.Getenv("ITSABOT_URL") + "/api/plugins/by_name/" + plg.Name
		req, err2 := http.NewRequest("GET", ul, nil)
		if err2 != nil {
			l.Fatal(err2)
		}
		client := &http.Client{Timeout: 10 * time.Second}
		resp, err2 := client.Do(req)
		if err2 != nil {
			l.Fatal(err2)
		}
		var data struct{ ID uint64 }
		if err2 := json.NewDecoder(resp.Body).Decode(&data); err2 != nil {
			l.Fatal(err2)
		}
		id := strconv.FormatUint(data.ID, 10)

		// Remove closing characters to insert additional ID data
		s = s[:len(s)-3]
		s += ",\n\t\"ID\": " + id + "\n}\n"
	}
	s += "*/"
	_, err = fi.WriteString(s)
	if err != nil {
		l.Fatal(err)
	}
}
Exemplo n.º 4
0
Arquivo: abot.go Projeto: itsabot/abot
// newAbot creates a new directory for a new Abot project. It's similar to
// `rails new`.
func newAbot(l *log.Logger, name, dbconnstr string) error {
	// Create a new directory for the project
	if err := os.Mkdir(name, 0777); err != nil {
		return err
	}
	if err := os.Chdir(name); err != nil {
		return err
	}

	// Generate abot.env
	fi, err := os.Create("abot.env")
	if err != nil {
		return err
	}
	defer func() {
		if err = fi.Close(); err != nil {
			l.Info("failed to close abot.env.", err)
		}
	}()
	dir, err := os.Getwd()
	if err != nil {
		return err
	}
	_, err = fi.WriteString(serverAbotEnv(name, dir))
	if err != nil {
		return err
	}

	// Copy and modify base files
	p := filepath.Join(os.Getenv("ABOT_PATH"), "base", "plugins.json")
	if err = core.CopyFileContents(p, "plugins.json"); err != nil {
		return err
	}
	p = filepath.Join(os.Getenv("ABOT_PATH"), "base", "server.go.x")
	if err = core.CopyFileContents(p, "server.go"); err != nil {
		return err
	}
	p = filepath.Join(os.Getenv("ABOT_PATH"), "base", ".gitignore")
	if err = core.CopyFileContents(p, ".gitignore"); err != nil {
		return err
	}
	fi2, err := os.OpenFile(".gitignore", os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		return err
	}
	defer func() {
		if err = fi2.Close(); err != nil {
			l.Info("failed to close .gitignore.", err)
		}
	}()
	_, err = fi2.WriteString(name)
	if err != nil {
		l.Fatal("failed to write to .gitignore.", err)
	}

	// Walk the base/assets dir, copying all files
	p = filepath.Join(os.Getenv("ABOT_PATH"), "base", "assets")
	if err = filepath.Walk(p, recursiveCopy); err != nil {
		return err
	}
	p = filepath.Join(os.Getenv("ABOT_PATH"), "base", "cmd")
	if err = filepath.Walk(p, recursiveCopy); err != nil {
		return err
	}
	p = filepath.Join(os.Getenv("ABOT_PATH"), "base", "data")
	if err = filepath.Walk(p, recursiveCopy); err != nil {
		return err
	}
	p = filepath.Join(os.Getenv("ABOT_PATH"), "base", "db")
	if err = filepath.Walk(p, recursiveCopy); err != nil {
		return err
	}

	// Run cmd/dbsetup.sh
	cmd := exec.Command("/bin/sh", "-c", "cmd/dbsetup.sh "+dbconnstr)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	if err = cmd.Run(); err != nil {
		l.Info("Fix the errors above, then re-run cmd/dbsetup.sh")
		return err
	}

	// TODO analytics on a new Abot project
	return nil
}