func DbConn() *utils.DCDB { configIni_, err := config.NewConfig("ini", "config.ini") if err != nil { fmt.Println(err) } configIni, err := configIni_.GetSection("default") db := utils.DbConnect(configIni) return db }
func main() { f, err := os.OpenFile("dclog.txt", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0777) defer f.Close() //log.SetOutput(f) log.SetOutput(io.MultiWriter(f, os.Stdout)) log.SetFlags(log.LstdFlags | log.Lshortfile) txType := "Mining" txTime := "1406545931" userId := []byte("2") var blockId int64 = 123924 var txSlice [][]byte // hash txSlice = append(txSlice, []byte("22cb812e53e22ee539af4a1d39b4596d")) // type txSlice = append(txSlice, utils.Int64ToByte(utils.TypeInt(txType))) // time txSlice = append(txSlice, []byte(txTime)) // user_id txSlice = append(txSlice, userId) // promised_amount_id txSlice = append(txSlice, []byte(`26`)) // amount txSlice = append(txSlice, []byte(`6`)) // sign txSlice = append(txSlice, []byte("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")) blockData := new(utils.BlockData) blockData.BlockId = blockId blockData.Time = utils.StrToInt64(txTime) blockData.UserId = utils.BytesToInt64(userId) dir, err := utils.GetCurrentDir() if err != nil { fmt.Println(err) } configIni_, err := config.NewConfig("ini", dir+"/config.ini") if err != nil { fmt.Println(err) } configIni, err := configIni_.GetSection("default") db := utils.DbConnect(configIni) // делаем снимок БД в виде хэшей до начала тестов hashesStart, err := tests_utils.AllHashes(db) err = tests_utils.MakeTest(txSlice, blockData, txType, hashesStart, db, "work") if err != nil { fmt.Println(err) } }
func TestYaml(t *testing.T) { f, err := os.Create("testyaml.conf") if err != nil { t.Fatal(err) } _, err = f.WriteString(yamlcontext) if err != nil { f.Close() t.Fatal(err) } f.Close() defer os.Remove("testyaml.conf") yamlconf, err := config.NewConfig("yaml", "testyaml.conf") if err != nil { t.Fatal(err) } if yamlconf.String("appname") != "beeapi" { t.Fatal("appname not equal to beeapi") } if port, err := yamlconf.Int("httpport"); err != nil || port != 8080 { t.Error(port) t.Fatal(err) } if port, err := yamlconf.Int64("mysqlport"); err != nil || port != 3600 { t.Error(port) t.Fatal(err) } if pi, err := yamlconf.Float("PI"); err != nil || pi != 3.1415976 { t.Error(pi) t.Fatal(err) } if yamlconf.String("runmode") != "dev" { t.Fatal("runmode not equal to dev") } if v, err := yamlconf.Bool("autorender"); err != nil || v != false { t.Error(v) t.Fatal(err) } if v, err := yamlconf.Bool("copyrequestbody"); err != nil || v != true { t.Error(v) t.Fatal(err) } if err = yamlconf.Set("name", "astaxie"); err != nil { t.Fatal(err) } if yamlconf.String("name") != "astaxie" { t.Fatal("get name error") } }
func (c *Controller) ClearDb() (string, error) { if !c.NodeAdmin || c.SessRestricted != 0 { return "", utils.ErrInfo(errors.New("Permission denied")) } err := c.ExecSql(`UPDATE install SET progress = 0`) if err != nil { utils.Mutex.Unlock() return "", utils.ErrInfo(err) } confIni, err := config.NewConfig("ini", *utils.Dir+"/config.ini") confIni.Set("db_type", "") err = confIni.SaveConfigFile(*utils.Dir + "/config.ini") return "", nil }
func ConfigInit() { // мониторим config.ini на наличие изменений go func() { for { log.Debug("ConfigInit monitor") if _, err := os.Stat(*utils.Dir + "/config.ini"); os.IsNotExist(err) { utils.Sleep(1) continue } configIni_, err := config.NewConfig("ini", *utils.Dir+"/config.ini") if err != nil { log.Error("%v", utils.ErrInfo(err)) } configIni, err = configIni_.GetSection("default") if err != nil { log.Error("%v", utils.ErrInfo(err)) } if len(configIni["db_type"]) > 0 { break } utils.Sleep(3) } }() globalLangReadOnly = make(map[int]map[string]string) for _, v := range consts.LangMap { data, err := static.Asset(fmt.Sprintf("static/lang/%d.ini", v)) if err != nil { log.Error("%v", utils.ErrInfo(err)) } iniconf_, err := config.NewConfigData("ini", []byte(data)) if err != nil { log.Error("%v", utils.ErrInfo(err)) } //fmt.Println(iniconf_) iniconf, err := iniconf_.GetSection("default") globalLangReadOnly[v] = make(map[string]string) globalLangReadOnly[v] = iniconf } }
func ConfigInit() { // мониторим config.ini на наличие изменений go func() { for { log.Debug("ConfigInit monitor") if _, err := os.Stat(*utils.Dir + "/config.ini"); os.IsNotExist(err) { utils.Sleep(1) continue } configIni_, err := config.NewConfig("ini", *utils.Dir+"/config.ini") if err != nil { log.Error("%v", utils.ErrInfo(err)) } configIni, err = configIni_.GetSection("default") if err != nil { log.Error("%v", utils.ErrInfo(err)) } if len(configIni["db_type"]) > 0 { break } utils.Sleep(3) } }() }
func Start(dir string, thrustWindowLoder *window.Window) { var err error IosLog("start") defer func() { if r := recover(); r != nil { log.Error("Recovered", r) panic(r) } }() if dir != "" { fmt.Println("dir", dir) *utils.Dir = dir } IosLog("dir:" + dir) fmt.Println("utils.Dir", *utils.Dir) fmt.Println("dcVersion:", consts.VERSION) log.Debug("dcVersion: %v", consts.VERSION) // читаем config.ini configIni := make(map[string]string) configIni_, err := config.NewConfig("ini", *utils.Dir+"/config.ini") if err != nil { IosLog("err:" + fmt.Sprintf("%s", utils.ErrInfo(err))) log.Error("%v", utils.ErrInfo(err)) } else { configIni, err = configIni_.GetSection("default") } // убьем ранее запущенный Dcoin if !utils.Mobile() { fmt.Println("kill dcoin.pid") if _, err := os.Stat(*utils.Dir + "/dcoin.pid"); err == nil { dat, err := ioutil.ReadFile(*utils.Dir + "/dcoin.pid") if err != nil { log.Error("%v", utils.ErrInfo(err)) } var pidMap map[string]string err = json.Unmarshal(dat, &pidMap) if err != nil { log.Error("%v", utils.ErrInfo(err)) } fmt.Println("old PID ("+*utils.Dir+"/dcoin.pid"+"):", pidMap["pid"]) utils.DB, err = utils.NewDbConnect(configIni) err = KillPid(pidMap["pid"]) if nil != err { fmt.Println(err) log.Error("KillPid %v", utils.ErrInfo(err)) } if fmt.Sprintf("%s", err) != "null" { fmt.Println(fmt.Sprintf("%s", err)) // даем 15 сек, чтобы завершиться предыдущему процессу for i := 0; i < 15; i++ { log.Debug("waiting killer %d", i) if _, err := os.Stat(*utils.Dir + "/dcoin.pid"); err == nil { fmt.Println("waiting killer") utils.Sleep(1) } else { // если dcoin.pid нет, значит завершился break } } } } } // сохраним текущий pid и версию if !utils.Mobile() { pid := os.Getpid() PidAndVer, err := json.Marshal(map[string]string{"pid": utils.IntToStr(pid), "version": consts.VERSION}) if err != nil { log.Error("%v", utils.ErrInfo(err)) } err = ioutil.WriteFile(*utils.Dir+"/dcoin.pid", PidAndVer, 0644) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) } } controllers.SessInit() controllers.ConfigInit() daemons.ConfigInit() go func() { utils.DB, err = utils.NewDbConnect(configIni) log.Debug("%v", utils.DB) IosLog("utils.DB:" + fmt.Sprintf("%v", utils.DB)) if err != nil { IosLog("err:" + fmt.Sprintf("%s", utils.ErrInfo(err))) log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } }() f, err := os.OpenFile(*utils.Dir+"/dclog.txt", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0777) if err != nil { IosLog("err:" + fmt.Sprintf("%s", utils.ErrInfo(err))) log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } defer f.Close() IosLog("configIni:" + fmt.Sprintf("%v", configIni)) var backend *logging.LogBackend switch configIni["log_output"] { case "file": backend = logging.NewLogBackend(f, "", 0) case "console": backend = logging.NewLogBackend(os.Stderr, "", 0) case "file_console": //backend = logging.NewLogBackend(io.MultiWriter(f, os.Stderr), "", 0) default: backend = logging.NewLogBackend(f, "", 0) } backendFormatter := logging.NewBackendFormatter(backend, format) backendLeveled := logging.AddModuleLevel(backendFormatter) logLevel_ := "DEBUG" if *utils.LogLevel == "" { logLevel_ = configIni["log_level"] } else { logLevel_ = *utils.LogLevel } logLevel, err := logging.LogLevel(logLevel_) if err != nil { log.Error("%v", utils.ErrInfo(err)) } log.Debug("logLevel: %v", logLevel) backendLeveled.SetLevel(logLevel, "") logging.SetBackend(backendLeveled) rand.Seed(time.Now().UTC().UnixNano()) // если есть OldFileName, значит работаем под именем tmp_dc и нужно перезапуститься под нормальным именем log.Error("OldFileName %v", *utils.OldFileName) if *utils.OldFileName != "" { // вначале нужно обновить БД в зависимости от версии dat, err := ioutil.ReadFile(*utils.Dir + "/dcoin.pid") if err != nil { log.Error("%v", utils.ErrInfo(err)) } var pidMap map[string]string err = json.Unmarshal(dat, &pidMap) if err != nil { log.Error("%v", utils.ErrInfo(err)) } log.Debug("OldFileName %v", *utils.OldFileName) err = utils.CopyFileContents(*utils.Dir+`/dc.tmp`, *utils.OldFileName) if err != nil { log.Debug("%v", os.Stderr) log.Debug("%v", utils.ErrInfo(err)) } // ждем подключения к БД for { if utils.DB == nil || utils.DB.DB == nil { utils.Sleep(1) continue } break } if len(pidMap["version"]) > 0 { if utils.VersionOrdinal(pidMap["version"]) < utils.VersionOrdinal("1.0.2b5") { log.Debug("%v", "ALTER TABLE config ADD COLUMN analytics_disabled smallint") err = utils.DB.ExecSql(`ALTER TABLE config ADD COLUMN analytics_disabled smallint`) if err != nil { log.Error("%v", utils.ErrInfo(err)) } } if utils.VersionOrdinal(pidMap["version"]) < utils.VersionOrdinal("2.0.1b2") { log.Debug("%v", "ALTER TABLE config ADD COLUMN sqlite_db_url varchar(255)") err = utils.DB.ExecSql(`ALTER TABLE config ADD COLUMN sqlite_db_url varchar(255)`) if err != nil { log.Error("%v", utils.ErrInfo(err)) } } } err = utils.DB.Close() if err != nil { log.Error("%v", utils.ErrInfo(err)) } fmt.Println("DB Closed") err = os.Remove(*utils.Dir + "/dcoin.pid") if err != nil { log.Error("%v", utils.ErrInfo(err)) } log.Debug("dc.tmp %v", *utils.Dir+`/dc.tmp`) err = exec.Command(*utils.OldFileName, "-dir", *utils.Dir).Start() if err != nil { log.Debug("%v", os.Stderr) log.Debug("%v", utils.ErrInfo(err)) } log.Debug("OldFileName %v", *utils.OldFileName) os.Exit(1) } // откат БД до указанного блока if *utils.RollbackToBlockId > 0 { utils.DB, err = utils.NewDbConnect(configIni) parser := new(dcparser.Parser) parser.DCDB = utils.DB err = parser.RollbackToBlockId(*utils.RollbackToBlockId) if err != nil { fmt.Println(err) panic(err) } fmt.Print("complete") os.Exit(0) } log.Debug("public") IosLog("public") if _, err := os.Stat(*utils.Dir + "/public"); os.IsNotExist(err) { err = os.Mkdir(*utils.Dir+"/public", 0755) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } } log.Debug("daemonsStart") IosLog("daemonsStart") daemons.StartDaemons() IosLog("MonitorDaemons") // мониторинг демонов daemonsTable := make(map[string]string) go func() { for { daemonNameAndTime := <-daemons.MonitorDaemonCh daemonsTable[daemonNameAndTime[0]] = daemonNameAndTime[1] if utils.Time()%10 == 0 { log.Debug("daemonsTable: %v\n", daemonsTable) } } }() // сигналы демонам для выхода IosLog("signals") stopdaemons.Signals() utils.Sleep(1) // мониторим сигнал из БД о том, что демонам надо завершаться go stopdaemons.WaitStopTime() BrowserHttpHost := "http://localhost:8089" HandleHttpHost := "" ListenHttpHost := ":" + *utils.ListenHttpHost go func() { // уже прошли процесс инсталяции, где юзер указал БД и был перезапуск кошелька if len(configIni["db_type"]) > 0 && !utils.Mobile() { for { // ждем, пока произойдет подключение к БД в другой гоурутине if utils.DB == nil || utils.DB.DB == nil { utils.Sleep(1) fmt.Println("wait DB") } else { break } } fmt.Println("GET http host") BrowserHttpHost, HandleHttpHost, ListenHttpHost = GetHttpHost() // для биржы нужен хост или каталог, поэтому нужно подключение к БД exhangeHttpListener(HandleHttpHost) // для ноды тоже нужна БД tcpListener() } IosLog(fmt.Sprintf("BrowserHttpHost: %v, HandleHttpHost: %v, ListenHttpHost: %v", BrowserHttpHost, HandleHttpHost, ListenHttpHost)) fmt.Printf("BrowserHttpHost: %v, HandleHttpHost: %v, ListenHttpHost: %v\n", BrowserHttpHost, HandleHttpHost, ListenHttpHost) // включаем листинг веб-сервером для клиентской части http.HandleFunc(HandleHttpHost+"/", controllers.Index) http.HandleFunc(HandleHttpHost+"/content", controllers.Content) http.HandleFunc(HandleHttpHost+"/ajax", controllers.Ajax) http.HandleFunc(HandleHttpHost+"/tools", controllers.Tools) http.HandleFunc(HandleHttpHost+"/cf/", controllers.IndexCf) http.HandleFunc(HandleHttpHost+"/cf/content", controllers.ContentCf) http.Handle(HandleHttpHost+"/public/", noDirListing(http.FileServer(http.Dir(*utils.Dir)))) http.Handle(HandleHttpHost+"/static/", http.FileServer(&assetfs.AssetFS{Asset: static.Asset, AssetDir: static.AssetDir, Prefix: ""})) log.Debug("ListenHttpHost", ListenHttpHost) IosLog(fmt.Sprintf("ListenHttpHost: %v", ListenHttpHost)) fmt.Println("ListenHttpHost", ListenHttpHost) httpListener(ListenHttpHost, BrowserHttpHost) if *utils.Console == 0 && !utils.Mobile() { utils.Sleep(1) if thrustWindowLoder != nil { thrustWindowLoder.Close() thrustWindow := thrust.NewWindow(thrust.WindowOptions{ RootUrl: BrowserHttpHost, Size: commands.SizeHW{Width: 1024, Height: 600}, }) thrustWindow.HandleEvent("*", func(cr commands.EventResult) { fmt.Println("HandleEvent", cr) }) thrustWindow.HandleRemote(func(er commands.EventResult, this *window.Window) { fmt.Println("RemoteMessage Recieved:", er.Message.Payload) openBrowser(er.Message.Payload) // Keep in mind once we have the message, lets say its json of some new type we made, // We can unmarshal it to that type. // Same goes for the other way around. this.SendRemoteMessage("boop") }) thrustWindow.Show() thrustWindow.Focus() } else { openBrowser(BrowserHttpHost) } } }() // ожидает появления свежих записей в чате, затем ждет появления коннектов // (заносятся из демеона connections и от тех, кто сам подключился к ноде) go utils.ChatOutput(utils.ChatNewTx) log.Debug("ALL RIGHT") IosLog("ALL RIGHT") fmt.Println("ALL RIGHT") utils.Sleep(3600 * 24 * 90) log.Debug("EXIT") }
// Шаг 1 - выбор либо стандартных настроек (sqlite и блокчейн с сервера) либо расширенных - pg/mysql и загрузка с нодов func (c *Controller) InstallStep1() (string, error) { c.r.ParseForm() installType := c.r.FormValue("type") url := c.r.FormValue("url") setupPassword := c.r.FormValue("setup_password") userId := utils.StrToInt64(c.r.FormValue("user_id")) firstLoad := c.r.FormValue("first_load") dbType := c.r.FormValue("db_type") dbHost := c.r.FormValue("host") dbPort := c.r.FormValue("port") dbName := c.r.FormValue("db_name") dbUsername := c.r.FormValue("username") dbPassword := c.r.FormValue("password") sqliteDbUrl := c.r.FormValue("sqlite_db_url") keyPassword := c.r.FormValue("key_password") if installType == "standard" { dbType = "sqlite" } else { if len(url) == 0 { url = consts.BLOCKCHAIN_URL } } if _, err := os.Stat(*utils.Dir + "/config.ini"); os.IsNotExist(err) { ioutil.WriteFile(*utils.Dir+"/config.ini", []byte(``), 0644) } confIni, err := config.NewConfig("ini", *utils.Dir+"/config.ini") //confIni.Set("sql_log", "1") confIni.Set("error_log", "1") confIni.Set("log_level", "DEBUG") confIni.Set("log", "0") confIni.Set("log_block_id_begin", "0") confIni.Set("log_block_id_end", "0") confIni.Set("bad_tx_log", "1") confIni.Set("nodes_ban_exit", "0") confIni.Set("log_tables", "") confIni.Set("log_fns", "") confIni.Set("sign_hash", "ip") if len(sqliteDbUrl) > 0 && dbType == "sqlite" { utils.SqliteDbUrl = sqliteDbUrl } if dbType == "sqlite" { confIni.Set("db_type", "sqlite") confIni.Set("db_user", "") confIni.Set("db_host", "") confIni.Set("db_port", "") confIni.Set("db_password", "") confIni.Set("db_name", "") } else if dbType == "postgresql" || dbType == "mysql" { confIni.Set("db_type", dbType) confIni.Set("db_user", dbUsername) confIni.Set("db_host", dbHost) confIni.Set("db_port", dbPort) confIni.Set("db_password", dbPassword) confIni.Set("db_name", dbName) } err = confIni.SaveConfigFile(*utils.Dir + "/config.ini") if err != nil { return "", err } log.Debug("sqliteDbUrl: %s", sqliteDbUrl) go func() { configIni, err = confIni.GetSection("default") if dbType == "sqlite" && len(sqliteDbUrl) > 0 { if utils.DB != nil && utils.DB.DB != nil { utils.DB.Close() log.Debug("DB CLOSE") } for i := 0; i < 5; i++ { log.Debug("sqliteDbUrl %v", sqliteDbUrl) _, err := utils.DownloadToFile(sqliteDbUrl, *utils.Dir+"/litedb.db", 3600, nil, nil, "install") if err != nil { log.Error("%v", utils.ErrInfo(err)) } if err == nil { break } } if err != nil { panic(err) os.Exit(1) } utils.DB, err = utils.NewDbConnect(configIni) log.Debug("DB OPEN") log.Debug("%v", utils.DB) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } } else { utils.DB, err = utils.NewDbConnect(configIni) } c.DCDB = utils.DB if c.DCDB.DB == nil { err = fmt.Errorf("utils.DB == nil") log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } if dbType != "sqlite" || len(sqliteDbUrl) == 0 { schema_ := &schema.SchemaStruct{} schema_.DCDB = c.DCDB schema_.DbType = dbType schema_.PrefixUserId = 0 schema_.GetSchema() err = c.DCDB.ExecSql(`INSERT INTO admin (user_id) VALUES (1)`) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } } //if len(userId)>0 { err = c.DCDB.ExecSql("INSERT INTO my_table (user_id, key_password) VALUES (?, ?)", userId, keyPassword) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } //} log.Debug("setupPassword: (%s) / (%s)", setupPassword, utils.DSha256(setupPassword)) if len(setupPassword) > 0 { setupPassword = string(utils.DSha256(setupPassword)) } err = c.DCDB.ExecSql("INSERT INTO config (sqlite_db_url, first_load_blockchain, first_load_blockchain_url, setup_password, auto_reload, chat_enabled) VALUES (?, ?, ?, ?, ?, ?)", sqliteDbUrl, firstLoad, url, setupPassword, 259200, 1) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } count, err := c.Single(`SELECT count(*) FROM payment_systems`).Int64() if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } if count == 0 { err = c.DCDB.ExecSql("INSERT INTO payment_systems (name)VALUES ('Adyen'),('Alipay'),('Amazon Payments'),('AsiaPay'),('Atos'),('Authorize.Net'),('BIPS'),('BPAY'),('Braintree'),('CentUp'),('Chargify'),('Citibank'),('ClickandBuy'),('Creditcall'),('CyberSource'),('DataCash'),('DigiCash'),('Digital River'),('Dwolla'),('ecoPayz'),('Edy'),('Elavon'),('Euronet Worldwide'),('eWAY'),('Flooz'),('Fortumo'),('Google'),('GoCardless'),('Heartland Payment Systems'),('HSBC'),('iKobo'),('iZettle'),('IP Payments'),('Klarna'),('Live Gamer'),('Mobilpenge'),('ModusLink'),('MPP Global Solutions'),('Neteller'),('Nochex'),('Ogone'),('Paymate'),('PayPal'),('Payoneer'),('PayPoint'),('Paysafecard'),('PayXpert'),('Payza'),('Peppercoin'),('Playspan'),('Popmoney'),('Realex Payments'),('Recurly'),('RBK Money'),('Sage Group'),('Serve'),('Skrill (Moneybookers)'),('Stripe'),('Square, Inc.'),('TFI Markets'),('TIMWE'),('Use My Services (UMS)'),('Ukash'),('V.me by Visa'),('VeriFone'),('Vindicia'),('WebMoney'),('WePay'),('Wirecard'),('Western Union'),('WorldPay'),('Yandex money'),('Qiwi'),('OK Pay'),('Bitcoin'),('Perfect Money')") if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } } count, err = c.Single(`SELECT count(*) FROM my_notifications`).Int64() if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } if count == 0 { err = c.DCDB.ExecSql(`INSERT INTO my_notifications (name, email, sms, mobile) VALUES ('admin_messages',1,1,1),('change_in_status',1,0,0),('dc_came_from',1,0,1),('dc_sent',1,0,0),('incoming_cash_requests',1,1,1),('new_version',1,1,1),('node_time',0,0,0),('system_error',1,1,0),('update_email',1,0,0),('update_primary_key',1,0,0),('update_sms_request',1,0,0),('voting_results',1,0,0),('voting_time',1,0,0)`) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } } err = c.DCDB.ExecSql(`INSERT INTO cf_lang (id, name) VALUES (1, 'English (US)'), (2, 'Afrikaans'), (3, 'Kiswahili'), (4, 'Türkçe'), (5, 'עברית'), (6, 'العربية'), (7, 'Español'), (8, 'Français (Canada)'), (9, 'Guarani'), (10, 'Português (Brasil)'), (11, 'Azərbaycan dili'), (12, 'Bahasa Indonesia'), (13, 'Bahasa Melayu'), (14, 'Basa Jawa'), (15, 'Bisaya'), (16, 'Filipino'), (17, 'Tiếng Việt'), (18, 'Հայերեն'), (19, 'اردو'), (20, 'हिन्दी'), (21, 'বাংলা'), (22, 'ਪੰਜਾਬੀ'), (23, 'தமிழ்'), (24, 'తెలుగు'), (25, 'ಕನ್ನಡ'), (26, 'മലയാളം'), (27, 'සිංහල'), (28, 'ภาษาไทย'), (29, '한국어'), (30, '中文(台灣)'), (31, '中文(简体)'), (32, '中文(香港)'), (33, '日本語'), (35, 'Čeština'), (36, 'Magyar'), (37, 'Polski'), (38, 'Română'), (39, 'Slovenčina'), (40, 'Slovenščina'), (41, 'Български'), (42, 'Русский'), (43, 'Українська'), (45, 'Bosanski'), (46, 'Català'), (47, 'Cymraeg'), (48, 'Dansk'), (49, 'Deutsch'), (50, 'Eesti'), (51, 'English (UK)'), (52, 'Español (España)'), (53, 'Euskara'), (54, 'Français (France)'), (55, 'Galego'), (56, 'Hrvatski'), (57, 'Italiano'), (58, 'Latviešu'), (59, 'Lietuvių'), (60, 'Nederlands'), (61, 'Norsk (bokmål)'), (62, 'Português (Portugal)'), (63, 'Shqip'), (64, 'Suomi'), (65, 'Svenska'), (66, 'Ελληνικά'), (67, 'Македонски'), (68, 'Српски');`) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } err = c.DCDB.ExecSql(`INSERT INTO install (progress) VALUES ('complete')`) if err != nil { log.Error("%v", utils.ErrInfo(err)) panic(err) os.Exit(1) } }() utils.Sleep(3) // даем время обновиться config.ini, чтобы в content выдался не installStep0, а updatingBlockchain TemplateStr, err := makeTemplate("install_step_1", "installStep1", &installStep1Struct{ Lang: c.Lang}) if err != nil { return "", utils.ErrInfo(err) } return TemplateStr, nil }
func main() { f, err := os.OpenFile("dclog.txt", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0777) defer f.Close() log.SetOutput(f) log.SetFlags(log.LstdFlags | log.Lshortfile) txType := "NewPct" txTime := "1426283713" userId := []byte("1") var txSlice [][]byte // hash txSlice = append(txSlice, []byte("22cb812e53e22ee539af4a1d39b4596d")) // type txSlice = append(txSlice, utils.Int64ToByte(TypeInt(txType))) // time txSlice = append(txSlice, []byte(txTime)) // user_id txSlice = append(txSlice, userId) //new_pct txSlice = append(txSlice, []byte(`{"1":{"miner_pct":"0.0000000044318","user_pct":"0.0000000027036"},"72":{"miner_pct":"0.0000000047610","user_pct":"0.0000000029646"}}`)) // sign txSlice = append(txSlice, []byte("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")) blockData := new(utils.BlockData) blockData.BlockId = 1200 blockData.Time = utils.StrToInt64(txTime) blockData.UserId = 1 dir, err := utils.GetCurrentDir() if err != nil { fmt.Println(err) } configIni_, err := config.NewConfig("ini", dir+"/config.ini") if err != nil { fmt.Println(err) } configIni, err := configIni_.GetSection("default") db := utils.DbConnect(configIni) parser := new(dcparser.Parser) parser.DCDB = db parser.TxSlice = txSlice parser.BlockData = blockData // делаем снимок БД в виде хэшей до начала тестов hashesStart, err := parser.AllHashes() err = dcparser.MakeTest(parser, txType, hashesStart) if err != nil { fmt.Println(err) } //go daemons.Testblock_is_ready() //parser.Db.HashTableData("holidays", "", "") //HashTableData(parser.Db.DB,"holidays", "", "") //hashes, err := parser.Db.AllHashes() utils.CheckErr(err) //fmt.Println(hashes) fmt.Println() }
func Content(w http.ResponseWriter, r *http.Request) { defer func() { if r := recover(); r != nil { log.Error("Content Recovered", r) fmt.Println("Content Recovered", r) } }() var err error w.Header().Set("Content-type", "text/html") sess, err := globalSessions.SessionStart(w, r) if err != nil { log.Error("%v", err) } defer sess.SessionRelease(w) sessUserId := GetSessUserId(sess) sessRestricted := GetSessRestricted(sess) sessPublicKey := GetSessPublicKey(sess) sessAdmin := GetSessAdmin(sess) log.Debug("sessUserId", sessUserId) log.Debug("sessRestricted", sessRestricted) log.Debug("sessPublicKey", sessPublicKey) log.Debug("user_id: %v", sess.Get("user_id")) c := new(Controller) c.r = r c.w = w c.sess = sess c.SessRestricted = sessRestricted c.SessUserId = sessUserId if sessAdmin == 1 { c.Admin = true } c.ContentInc = true var installProgress, configExists string var lastBlockTime int64 dbInit := false if len(configIni["db_user"]) > 0 || (configIni["db_type"] == "sqlite") { dbInit = true } if dbInit { var err error //c.DCDB, err = utils.NewDbConnect(configIni) c.DCDB = utils.DB if c.DCDB.DB == nil { log.Error("utils.DB == nil") dbInit = false } if dbInit { // отсутвие таблы выдаст ошибку, значит процесс инсталяции еще не пройден и надо выдать 0-й шаг _, err = c.DCDB.Single("SELECT progress FROM install").String() if err != nil { log.Error("%v", err) dbInit = false } } } c.dbInit = dbInit if dbInit { var err error installProgress, err = c.DCDB.Single("SELECT progress FROM install").String() if err != nil { log.Error("%v", err) } configExists, err = c.DCDB.Single("SELECT first_load_blockchain_url FROM config").String() if err != nil { log.Error("%v", err) } c.Variables, err = c.GetAllVariables() // Инфа о последнем блоке blockData, err := c.DCDB.GetLastBlockData() if err != nil { log.Error("%v", err) } //время последнего блока lastBlockTime = blockData["lastBlockTime"] log.Debug("installProgress", installProgress, "configExists", configExists, "lastBlockTime", lastBlockTime) // валюты currencyListCf, err := c.GetCurrencyList(true) if err != nil { log.Error("%v", err) } c.CurrencyListCf = currencyListCf currencyList, err := c.GetCurrencyList(false) if err != nil { log.Error("%v", err) } c.CurrencyList = currencyList confirmedBlockId, err := c.GetConfirmedBlockId() if err != nil { log.Error("%v", err) } c.ConfirmedBlockId = confirmedBlockId c.MinerId, err = c.GetMinerId(c.SessUserId) if err != nil { log.Error("%v", err) } paymentSystems, err := c.GetPaymentSystems() if err != nil { log.Error("%v", err) } c.PaymentSystems = paymentSystems } r.ParseForm() tplName := r.FormValue("tpl_name") c.Parameters, err = c.GetParameters() log.Debug("parameters=", c.Parameters) log.Debug("tpl_name=", tplName) // если в параметрах пришел язык, то установим его newLang := utils.StrToInt(c.Parameters["lang"]) if newLang > 0 { log.Debug("newLang", newLang) SetLang(w, r, newLang) } // уведомления //if utils.CheckInputData(parameters["alert"], "alert") { c.Alert = c.Parameters["alert"] //} lang := GetLang(w, r, c.Parameters) log.Debug("lang", lang) c.Lang = globalLangReadOnly[lang] c.LangInt = int64(lang) if lang == 42 { c.TimeFormat = "2006-01-02 15:04:05" } else { c.TimeFormat = "2006-02-01 15:04:05" } c.Periods = map[int64]string{86400: "1 " + c.Lang["day"], 604800: "1 " + c.Lang["week"], 31536000: "1 " + c.Lang["year"], 2592000: "1 " + c.Lang["month"], 1209600: "2 " + c.Lang["weeks"]} c.Races = map[int64]string{1: c.Lang["race_1"], 2: c.Lang["race_2"], 3: c.Lang["race_3"]} var status string var communityUsers []int64 if dbInit { communityUsers, err = c.DCDB.GetCommunityUsers() if err != nil { log.Error("%v", err) } c.CommunityUsers = communityUsers if len(communityUsers) == 0 { c.MyPrefix = "" } else { c.MyPrefix = utils.Int64ToStr(sessUserId) + "_" c.Community = true } log.Debug("c.MyPrefix %s", c.MyPrefix) // нужна мин. комиссия на пуле для перевода монет config, err := c.GetNodeConfig() if err != nil { log.Error("%v", err) } configCommission_ := make(map[string][]float64) if len(config["commission"]) > 0 { err = json.Unmarshal([]byte(config["commission"]), &configCommission_) if err != nil { log.Error("%v", err) } } configCommission := make(map[int64][]float64) for k, v := range configCommission_ { configCommission[utils.StrToInt64(k)] = v } c.NodeConfig = config c.ConfigCommission = configCommission c.NodeAdmin, err = c.NodeAdminAccess(c.SessUserId, c.SessRestricted) if err != nil { log.Error("%v", err) } status, err = c.DCDB.Single("SELECT status FROM " + c.MyPrefix + "my_table").String() if err != nil { log.Error("%v", err) } } log.Debug("dbInit", dbInit) setupPassword := c.NodeConfig["setup_password"] match, _ := regexp.MatchString("^(installStep[0-9_]+)|(blockExplorer)$", tplName) // CheckInputData - гарантирует, что tplName чист if tplName != "" && utils.CheckInputData(tplName, "tpl_name") && (sessUserId > 0 || match) { tplName = tplName } else if dbInit && installProgress == "complete" && len(configExists) == 0 { // первый запуск, еще не загружен блокчейн tplName = "updatingBlockchain" } else if dbInit && installProgress == "complete" && sessUserId > 0 { if status == "waiting_set_new_key" { tplName = "setPassword" } else if status == "waiting_accept_new_key" { tplName = "waitingAcceptNewKey" } } else if dbInit && installProgress == "complete" && !c.Community && sessUserId == 0 && status == "waiting_set_new_key" && setupPassword != "" { tplName = "setupPassword" } else if dbInit && installProgress == "complete" && sessUserId == 0 && status == "waiting_accept_new_key" { tplName = "waitingAcceptNewKey" } else if dbInit && installProgress == "complete" { tplName = "login" } else { tplName = "installStep0" // самый первый запуск } log.Debug("dbInit", dbInit, "installProgress", installProgress, "configExists", configExists) log.Debug("tplName>>>>>>>>>>>>>>>>>>>>>>", tplName) // идет загрузка блокчейна wTime := int64(2) if configIni != nil && configIni["test_mode"] == "1" { wTime = 2 * 365 * 86400 log.Debug("%v", wTime) log.Debug("%v", lastBlockTime) } if dbInit && tplName != "installStep0" && (utils.Time()-lastBlockTime > 3600*wTime) && len(configExists) > 0 { if len(communityUsers) > 0 { // исключение - админ пула poolAdminUserId, err := c.DCDB.Single("SELECT pool_admin_user_id FROM config").String() if err != nil { log.Error("%v", err) } if sessUserId != utils.StrToInt64(poolAdminUserId) { tplName = "updatingBlockchain" } } else { tplName = "updatingBlockchain" } } if tplName == "installStep0" { log.Debug("ConfigInit monitor") if _, err := os.Stat(*utils.Dir + "/config.ini"); err == nil { configIni_, err := config.NewConfig("ini", *utils.Dir+"/config.ini") if err != nil { log.Error("%v", utils.ErrInfo(err)) } configIni, err = configIni_.GetSection("default") if err != nil { log.Error("%v", utils.ErrInfo(err)) } if len(configIni["db_type"]) > 0 { tplName = "updatingBlockchain" } } } log.Debug("tplName2=", tplName) // кол-во ключей=подписей у юзера var countSign int var userId int64 // var myUserId int64 if sessUserId > 0 && dbInit && installProgress == "complete" { userId = sessUserId //myUserId = sessUserId countSign = 1 log.Debug("userId: %d", userId) pk, err := c.OneRow("SELECT hex(public_key_1) as public_key_1, hex(public_key_2) as public_key_2 FROM users WHERE user_id = ?", userId).String() if err != nil { log.Error("%v", err) } log.Debug("pk: %v", pk) if len(pk["public_key_1"]) > 0 { log.Debug("public_key_1: %x", pk["public_key_1"]) countSign = 2 } if len(pk["public_key_2"]) > 0 { log.Debug("public_key_2: %x", pk["public_key_2"]) countSign = 3 } } else { userId = 0 //myUserId = 0 } log.Debug("countSign: %v", countSign) c.UserId = userId var CountSignArr []int for i := 0; i < countSign; i++ { CountSignArr = append(CountSignArr, i) } c.CountSign = countSign c.CountSignArr = CountSignArr if tplName == "" { tplName = "login" } log.Debug("tplName::", tplName, sessUserId, installProgress) if ok, _ := regexp.MatchString(`^(?i)delAutoPayment|newAutoPayment|autoPayments|holidaysList|adminVariables|exchangeAdmin|votesExchange|chat|firstSelect|PoolAdminLogin|setupPassword|waitingAcceptNewKey|SetPassword|CfPagePreview|CfCatalog|AddCfProjectData|CfProjectChangeCategory|NewCfProject|MyCfProjects|DelCfProject|DelCfFunding|CfStart|PoolAdminControl|Credits|Home|WalletsList|Information|Notifications|Interface|MiningMenu|Upgrade5|NodeConfigControl|Upgrade7|Upgrade6|Upgrade5|Upgrade4|Upgrade3|Upgrade2|Upgrade1|Upgrade0|StatisticVoting|ProgressBar|MiningPromisedAmount|CurrencyExchangeDelete|CurrencyExchange|ChangeCreditor|ChangeCommission|CashRequestOut|ArbitrationSeller|ArbitrationBuyer|ArbitrationArbitrator|Arbitration|InstallStep2|InstallStep1|InstallStep0|DbInfo|ChangeHost|Assignments|NewUser|NewPhoto|Voting|VoteForMe|RepaymentCredit|PromisedAmountList|PromisedAmountActualization|NewPromisedAmount|Login|ForRepaidFix|DelPromisedAmount|DelCredit|ChangePromisedAmount|ChangePrimaryKey|ChangeNodeKey|ChangeAvatar|BugReporting|Abuse|UpgradeResend|UpdatingBlockchain|Statistic|RewritePrimaryKey|RestoringAccess|PoolTechWorks|Points|NewHolidays|NewCredit|MoneyBackRequest|MoneyBack|ChangeMoneyBack|ChangeKeyRequest|ChangeKeyClose|ChangeGeolocation|ChangeCountryRace|ChangeArbitratorConditions|CashRequestIn|BlockExplorer$`, tplName); !ok { w.Write([]byte("Access denied 0")) } else if len(tplName) > 0 && sessUserId > 0 && installProgress == "complete" { // если ключ юзера изменился, то выбрасываем его userPublicKey, err := c.DCDB.GetUserPublicKey(userId) if err != nil { log.Error("%v", err) } // но возможно у юзера включено сохранение приватного ключа // тогда, чтобы не получилось зацикливания, нужно проверить и my_keys myPrivateKey, err := c.GetMyPrivateKey(c.MyPrefix) if err != nil { log.Error("%v", err) } myPublicKey, err := c.GetMyPublicKey(c.MyPrefix) if err != nil { log.Error("%v", err) } countUsers, err := c.Single(`SELECT count(*) FROM users`).Int64() if err != nil { log.Error("%v", err) } if (string(utils.BinToHex(userPublicKey)) != sessPublicKey && len(myPrivateKey) == 0) || (countUsers > 0 && len(myPrivateKey) > 0 && !bytes.Equal(myPublicKey, []byte(userPublicKey))) { log.Debug("userPublicKey!=sessPublicKey %s!=%s / userId: %d", utils.BinToHex(userPublicKey), sessPublicKey, userId) log.Debug("len(myPrivateKey) = %d && %x!=%x", len(myPrivateKey), string(myPublicKey), userPublicKey) sess.Delete("user_id") sess.Delete("private_key") sess.Delete("public_key") log.Debug("window.location.href = /") if len(userPublicKey) > 0 { w.Write([]byte("<script language=\"javascript\">window.location.href = \"/\"</script>If you are not redirected automatically, follow the <a href=\"/\">/</a>")) return } else { c.sess.Delete("user_id") c.sess.Delete("public_key") c.sess.Delete("private_key") } } if tplName == "login" { tplName = "home" } if tplName == "home" && c.Parameters["first_select"] != "1" { data, err := c.OneRow(`SELECT first_select, miner_id from ` + c.MyPrefix + `my_table`).Int64() if err != nil { log.Error("%v", err) } if data["first_select"] == 0 && data["miner_id"] == 0 && c.SessRestricted == 0 { tplName = "firstSelect" } } c.TplName = tplName log.Debug("communityUsers:", communityUsers) if dbInit && len(communityUsers) > 0 { poolAdminUserId, err := c.GetPoolAdminUserId() if err != nil { log.Error("%v", err) } c.PoolAdminUserId = poolAdminUserId if c.SessUserId == poolAdminUserId { c.PoolAdmin = true } } else { c.PoolAdmin = true } if dbInit { // проверим, не идут ли тех. работы на пуле config, err := c.DCDB.OneRow("SELECT pool_admin_user_id, pool_tech_works FROM config").String() if err != nil { log.Error("%v", err) } if len(config["pool_admin_user_id"]) > 0 && utils.StrToInt64(config["pool_admin_user_id"]) != sessUserId && config["pool_tech_works"] == "1" && c.Community { tplName = "login" } // Если у юзера только 1 праймари ключ, то выдавать форму, где показываются данные для подписи и форма ввода подписи не нужно. // Только если он сам не захочет, указав это в my_table showSignData := false if sessRestricted == 0 { // у незареганных в пуле юзеров нет MyPrefix, поэтому сохранять значение show_sign_data им негде showSignData_, err := c.DCDB.Single("SELECT show_sign_data FROM " + c.MyPrefix + "my_table").String() if err != nil { log.Error("%v", err) } if showSignData_ == "1" { showSignData = true } else { showSignData = false } } if showSignData || countSign > 1 { c.ShowSignData = true } else { c.ShowSignData = false } } // писать в чат можно и при апдейте блокчейна if r.FormValue("tpl_name") == "chat" && tplName == "updatingBlockchain" { tplName = "chat" } if dbInit && tplName != "updatingBlockchain" && tplName != "setPassword" && tplName != "waitingAcceptNewKey" { html, err := CallController(c, "AlertMessage") if err != nil { log.Error("%v", err) } w.Write([]byte(html)) } w.Write([]byte("<input type='hidden' id='tpl_name' value='" + tplName + "'>")) myNotice, err := c.DCDB.GetMyNoticeData(sessRestricted, sessUserId, c.MyPrefix, globalLangReadOnly[lang]) if err != nil { log.Error("%v", err) } c.MyNotice = myNotice log.Debug("tplName==", tplName) // подсвечиваем красным номер блока, если идет процесс обновления var blockJs string blockId, err := c.GetBlockId() if err != nil { log.Error("%v", err) } if myNotice["main_status_complete"] != "1" { blockJs = "$('#block_id').html(" + utils.Int64ToStr(blockId) + ");$('#block_id').css('color', '#ff0000');" } else { blockJs = "$('#block_id').html(" + utils.Int64ToStr(blockId) + ");$('#block_id').css('color', '#428BCA');" } w.Write([]byte(`<script> $( document ).ready(function() { $('.lng_1').attr('href', '#` + tplName + `/lang=1'); $('.lng_42').attr('href', '#` + tplName + `/lang=42'); ` + blockJs + ` }); </script>`)) skipRestrictedUsers := []string{"cashRequestIn", "cashRequestOut", "upgrade", "notifications"} // тем, кто не зареган на пуле не выдаем некоторые страницы if sessRestricted == 0 || !utils.InSliceString(tplName, skipRestrictedUsers) { // вызываем контроллер в зависимости от шаблона html, err := CallController(c, tplName) if err != nil { log.Error("%v", err) } w.Write([]byte(html)) } } else if len(tplName) > 0 { log.Debug("tplName", tplName) html := "" if ok, _ := regexp.MatchString(`^(?i)blockExplorer|waitingAcceptNewKey|SetupPassword|CfCatalog|CfPagePreview|CfStart|Check_sign|CheckNode|GetBlock|GetMinerData|GetMinerDataMap|GetSellerData|Index|IndexCf|InstallStep0|InstallStep1|InstallStep2|Login|SignLogin|SynchronizationBlockchain|UpdatingBlockchain|Menu$`, tplName); !ok && c.SessUserId <= 0 { html = "Access denied 1" } else { // если сессия обнулилась в процессе навигации по админке, то вместо login шлем на /, чтобы очистилось меню if len(r.FormValue("tpl_name")) > 0 && tplName == "login" { log.Debug("window.location.href = /") w.Write([]byte("<script language=\"javascript\">window.location.href = \"/\"</script>If you are not redirected automatically, follow the <a href=\"/\">/</a>")) return } // вызываем контроллер в зависимости от шаблона html, err = CallController(c, tplName) if err != nil { log.Error("%v", err) } } w.Write([]byte(html)) } else { html, err := CallController(c, "login") if err != nil { log.Error("%v", err) } w.Write([]byte(html)) } //sess.Set("username", 11111) }