Selaa lähdekoodia

Receive v2 reports

Jakob Borg 10 vuotta sitten
vanhempi
sitoutus
201ff39b80
1 muutettua tiedostoa jossa 109 lisäystä ja 9 poistoa
  1. 109 9
      cmd/ursrv/main.go

+ 109 - 9
cmd/ursrv/main.go

@@ -60,6 +60,43 @@ type report struct {
 	SHA256Perf     float64
 	MemorySize     int
 
+	// v2 fields
+
+	URVersion  int
+	NumCPU     int
+	FolderUses struct {
+		ReadOnly      int
+		IgnorePerms   int
+		IgnoreDelete  int
+		AutoNormalize int
+	}
+	DeviceUses struct {
+		Introducer       int
+		CustomCertName   int
+		CompressAlways   int
+		CompressMetadata int
+		CompressNever    int
+		DynamicAddr      int
+		StaticAddr       int
+	}
+	Announce struct {
+		GlobalEnabled     bool
+		LocalEnabled      bool
+		DefaultServersDNS int
+		DefaultServersIP  int
+		OtherServers      int
+	}
+	Relays struct {
+		Enabled        bool
+		DefaultServers int
+		OtherServers   int
+	}
+	UsesRateLimit        bool
+	UpgradeAllowedManual bool
+	UpgradeAllowedAuto   bool
+
+	// Generated
+
 	Date string
 }
 
@@ -73,6 +110,19 @@ func (r *report) Validate() error {
 	return nil
 }
 
+func (r *report) FieldsInDBOrder() []interface{} {
+	return []interface{}{r.UniqueID, r.Version, r.LongVersion, r.Platform, r.NumFolders,
+		r.NumDevices, r.TotFiles, r.FolderMaxFiles, r.TotMiB, r.FolderMaxMiB,
+		r.MemoryUsageMiB, r.SHA256Perf, r.MemorySize, r.Date,
+		r.URVersion, r.NumCPU,
+		r.FolderUses.ReadOnly, r.FolderUses.IgnorePerms, r.FolderUses.IgnoreDelete, r.FolderUses.AutoNormalize,
+		r.DeviceUses.Introducer, r.DeviceUses.CustomCertName, r.DeviceUses.CompressAlways, r.DeviceUses.CompressMetadata, r.DeviceUses.CompressNever,
+		r.DeviceUses.DynamicAddr, r.DeviceUses.StaticAddr,
+		r.Announce.GlobalEnabled, r.Announce.LocalEnabled, r.Announce.DefaultServersDNS, r.Announce.DefaultServersIP, r.Announce.OtherServers,
+		r.Relays.Enabled, r.Relays.DefaultServers, r.Relays.OtherServers,
+		r.UsesRateLimit, r.UpgradeAllowedManual, r.UpgradeAllowedAuto}
+}
+
 func setupDB(db *sql.DB) error {
 	_, err := db.Exec(`CREATE TABLE IF NOT EXISTS Reports (
 		Received TIMESTAMP NOT NULL,
@@ -95,24 +145,74 @@ func setupDB(db *sql.DB) error {
 		return err
 	}
 
+	var t string
 	row := db.QueryRow(`SELECT 'UniqueIDIndex'::regclass`)
-	if err := row.Scan(nil); err != nil {
-		_, err = db.Exec(`CREATE UNIQUE INDEX UniqueIDIndex ON Reports (Date, UniqueID)`)
+	if err := row.Scan(&t); err != nil {
+		log.Println(err)
+		if _, err = db.Exec(`CREATE UNIQUE INDEX UniqueIDIndex ON Reports (Date, UniqueID)`); err != nil {
+			return err
+		}
 	}
 
 	row = db.QueryRow(`SELECT 'ReceivedIndex'::regclass`)
-	if err := row.Scan(nil); err != nil {
-		_, err = db.Exec(`CREATE INDEX ReceivedIndex ON Reports (Received)`)
+	if err := row.Scan(&t); err != nil {
+		if _, err = db.Exec(`CREATE INDEX ReceivedIndex ON Reports (Received)`); err != nil {
+			return err
+		}
 	}
 
-	return err
+	row = db.QueryRow(`SELECT attname FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'reports') AND attname = 'reportversion'`)
+	if err := row.Scan(&t); err != nil {
+		// The ReportVersion column doesn't exist; add the new columns.
+		_, err = db.Exec(`ALTER TABLE Reports
+		ADD COLUMN ReportVersion INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN NumCPU INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN FolderRO  INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN FolderIgnorePerms INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN FolderIgnoreDelete INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN FolderAutoNormalize INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN DeviceIntroducer INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN DeviceCustomCertName INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN DeviceCompressAlways INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN DeviceCompressMetadata INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN DeviceCompressNever INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN DeviceDynamicAddr INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN DeviceStaticAddr INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN AnnounceGlobalEnabled BOOLEAN NOT NULL DEFAULT FALSE,
+		ADD COLUMN AnnounceLocalEnabled BOOLEAN NOT NULL DEFAULT FALSE,
+		ADD COLUMN AnnounceDefaultServersDNS INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN AnnounceDefaultServersIP INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN AnnounceOtherServers INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN RelayEnabled BOOLEAN NOT NULL DEFAULT FALSE,
+		ADD COLUMN RelayDefaultServers INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN RelayOtherServers INTEGER NOT NULL DEFAULT 0,
+		ADD COLUMN RateLimitEnabled BOOLEAN NOT NULL DEFAULT FALSE,
+		ADD COLUMN UpgradeAllowedManual BOOLEAN NOT NULL DEFAULT FALSE,
+		ADD COLUMN UpgradeAllowedAuto BOOLEAN NOT NULL DEFAULT FALSE
+		`)
+		if err != nil {
+			return err
+		}
+	}
+
+	row = db.QueryRow(`SELECT 'ReportVersionIndex'::regclass`)
+	if err := row.Scan(&t); err != nil {
+		if _, err = db.Exec(`CREATE INDEX ReportVersionIndex ON Reports (ReportVersion)`); err != nil {
+			return err
+		}
+	}
+
+	return nil
 }
 
 func insertReport(db *sql.DB, r report) error {
-	_, err := db.Exec(`INSERT INTO Reports VALUES (TIMEZONE('UTC', NOW()), $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)`,
-		r.UniqueID, r.Version, r.LongVersion, r.Platform, r.NumFolders,
-		r.NumDevices, r.TotFiles, r.FolderMaxFiles, r.TotMiB, r.FolderMaxMiB,
-		r.MemoryUsageMiB, r.SHA256Perf, r.MemorySize, r.Date)
+	fields := r.FieldsInDBOrder()
+	params := make([]string, len(fields))
+	for i := range params {
+		params[i] = fmt.Sprintf("$%d", i+1)
+	}
+	query := "INSERT INTO Reports VALUES (TIMEZONE('UTC', NOW()), " + strings.Join(params, ", ") + ")"
+	_, err := db.Exec(query, fields...)
 
 	return err
 }