utils.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package utils
  2. import (
  3. "crypto/hmac"
  4. "crypto/sha256"
  5. "encoding/hex"
  6. "fmt"
  7. "log"
  8. "math/rand"
  9. "os"
  10. "path"
  11. "runtime"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. var root string
  17. func SetRoot() {
  18. if strings.HasPrefix(os.Args[0], os.TempDir()) {
  19. root = Cwd(2) + "/"
  20. } else {
  21. f, _ := os.Executable()
  22. root = path.Dir(f) + "/"
  23. }
  24. }
  25. func Cwd(i int) string {
  26. _, fp, _, _ := runtime.Caller(i)
  27. slice := strings.Split(fp, "/")
  28. slice = slice[:len(slice)-1]
  29. path := strings.Join(slice, "/")
  30. path = strings.Replace(path, root, "", 1)
  31. return path
  32. }
  33. func Err(err error) {
  34. _, fp, line, _ := runtime.Caller(1)
  35. errStr := fmt.Sprintf("Error at %s:%d: %s\n", fp, line, err)
  36. fmt.Printf("%s", errStr)
  37. log, _ := os.OpenFile("error.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0655)
  38. defer log.Close()
  39. errLogStr := fmt.Sprintf("%s %s", time.Now(), errStr)
  40. log.WriteString(errLogStr)
  41. }
  42. func Hash(key string, data string) string {
  43. bKey := []byte(key)
  44. bData := []byte(data)
  45. h := hmac.New(sha256.New, bKey)
  46. h.Write(bData)
  47. return hex.EncodeToString(h.Sum(nil))
  48. }
  49. func Salt(length int) string {
  50. const charset = "1234567890-=!@#$%^&*()_+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  51. b := make([]byte, length)
  52. for i := range b {
  53. b[i] = charset[rand.Intn(len(charset))]
  54. }
  55. return string(b)
  56. }
  57. func CheckArgs() {
  58. if len(os.Args) < 2 {
  59. log.Fatalf("ERROR: port number required: eg ./bin 3000")
  60. os.Exit(1)
  61. }
  62. _, err := strconv.Atoi(os.Args[1])
  63. if err != nil {
  64. log.Fatalf("ERROR: port must be a number")
  65. os.Exit(1)
  66. }
  67. }