Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

buildinfo.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package main
  2. import (
  3. "crypto/sha256"
  4. "encoding/base64"
  5. "encoding/binary"
  6. "fmt"
  7. "io"
  8. "runtime/debug"
  9. "sort"
  10. "strconv"
  11. "time"
  12. )
  13. var version = "dev" // has to be set by ldflags
  14. const (
  15. buildInfoModuleStart byte = iota
  16. buildInfoModuleFinish
  17. buildInfoModuleDelimeter
  18. )
  19. func getVersion() string {
  20. goVersion, date, commit, modulesChecksum, dirty := getVersionData()
  21. dirtySuffix := ""
  22. if dirty {
  23. dirtySuffix = " [dirty]"
  24. }
  25. return fmt.Sprintf("%s (%s: %s on %s%s, modules checksum %s)",
  26. version,
  27. goVersion,
  28. date.Format(time.RFC3339),
  29. commit,
  30. dirtySuffix,
  31. modulesChecksum)
  32. }
  33. func getVersionData() (goVersion string, date time.Time, commit string, modulesChecksum string, dirty bool) {
  34. date = time.Now()
  35. buildInfo, ok := debug.ReadBuildInfo()
  36. if !ok {
  37. return
  38. }
  39. goVersion = buildInfo.GoVersion
  40. for _, setting := range buildInfo.Settings {
  41. switch setting.Key {
  42. case "vcs.time":
  43. date, _ = time.Parse(time.RFC3339, setting.Value)
  44. case "vcs.revision":
  45. commit = setting.Value
  46. case "vcs.modified":
  47. dirty, _ = strconv.ParseBool(setting.Value)
  48. }
  49. }
  50. hasher := sha256.New()
  51. if _, err := io.WriteString(hasher, buildInfo.Path); err != nil {
  52. panic(err)
  53. }
  54. binary.Write(hasher, binary.LittleEndian, uint64(1+len(buildInfo.Deps)))
  55. sort.Slice(buildInfo.Deps, func(i, j int) bool {
  56. return buildInfo.Deps[i].Path > buildInfo.Deps[j].Path
  57. })
  58. buildInfoCheckSumModule(hasher, &buildInfo.Main)
  59. for _, module := range buildInfo.Deps {
  60. buildInfoCheckSumModule(hasher, module)
  61. }
  62. modulesChecksum = base64.StdEncoding.EncodeToString(hasher.Sum(nil))
  63. return
  64. }
  65. func buildInfoCheckSumModule(w io.Writer, module *debug.Module) {
  66. w.Write([]byte{buildInfoModuleStart})
  67. if _, err := io.WriteString(w, module.Path); err != nil {
  68. panic(err)
  69. }
  70. w.Write([]byte{buildInfoModuleDelimeter})
  71. if _, err := io.WriteString(w, module.Version); err != nil {
  72. panic(err)
  73. }
  74. w.Write([]byte{buildInfoModuleDelimeter})
  75. if _, err := io.WriteString(w, module.Sum); err != nil {
  76. panic(err)
  77. }
  78. w.Write([]byte{buildInfoModuleFinish})
  79. }