From 201ff39b809b4a979a64a7890cb7dcddfd7f4f5d Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Thu, 10 Sep 2015 14:03:34 +0200 Subject: [PATCH] Receive v2 reports --- cmd/ursrv/main.go | 118 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 109 insertions(+), 9 deletions(-) diff --git a/cmd/ursrv/main.go b/cmd/ursrv/main.go index 091b5d8b6..de971ff68 100644 --- a/cmd/ursrv/main.go +++ b/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 }