예제 #1
0
        public void ExecuteTask()
        {
            while (UserAccountManager.WritingToUserDatabase)
            {
                Thread.Sleep(50);
            }

            accountingThreadStarted = true;
            IniFile ini = null;

            try
            {
                // Om maar 1x per uur robot task te draaien
                string webServiceURL = string.Format("http://{0}:{1}/", System.Net.Dns.GetHostName(), PortNumber).ToLower();

                // Lees de statistieken die we bij afsluiten programma hebben weggeschreven
                ini = new IniFile(ServiceIniFilename);
                try
                {
                    UserAccountManager.GlobalNumberOfRequests = Convert.ToInt64(ini.IniReadValue("Statistics", "GlobalNumberOfRequests"));

                    foreach (KeyValuePair <string, UserAccount> kvp in UserAccountManager.CloneUserDatabase())
                    {
                        // voor het uitlezen hebben we genoeg aan de "clone" vane de user gegevens
                        Int64 v = Convert.ToInt64(ini.IniReadValue("Statistics", string.Format("{0}_NumberOfRequests", kvp.Key)));
                        // Nu deze gebruiker gegevens opslaan
                        UserAccount ua = UserAccountManager.Account(kvp.Key);
                        if (ua != null)
                        {
                            ua.NumberOfRequests = v;
                        }
                    } //foreach
                }
                catch
                {
                }
                ini = null;
                ClearRequestCountersToServiceIniFile();

                // Vertel dat we verzoeken kunnen ontvangen. Is voornamelijk voor haproxy!
                Webservice.ForceServiceOffline = false;

                DateTime lastCheckIndex = DateTime.MinValue;
                DateTime lastReboot     = DateTime.Now.Date;
                while (accountingThreadStarted)
                {
                    try
                    {
                        if (Environment.UserInteractive)
                        {
                            // Laat op het scherm zien hoeveel request we binnen hebben.
                            int cLeft = Console.CursorLeft;
                            int cTop  = Console.CursorTop;
                            try
                            {
                                Console.WriteLine(string.Format("Global number of WebService Request : {0,-18}", UserAccountManager.GlobalNumberOfRequests));
                            }
                            finally
                            {
                                Console.CursorLeft = cLeft;
                                Console.CursorTop  = cTop;
                            }
                        }

                        if ((DateTime.Now - lastCheckIndex).TotalDays > 1)
                        {
                            lastCheckIndex = DateTime.Now.Date;

                            /*
                             * if ((DateTime.Now - ReceiveIndex.DateTimeOfIndex).TotalDays > 9)
                             * {
                             *  // Verstuur een mail dat de index te "oud" is
                             *  string message = string.Format("SubFingerindex on {0} is {1} days old", Environment.MachineName, (DateTime.Now - ReceiveIndex.DateTimeOfIndex).TotalDays);
                             *
                             *  Mail.SendMail(Mail.EMail_Automatisering, message, message);
                             * }
                             */
                        }

                        // ==========================================================================================================
                        // Moet de computer worden herstart?
                        // ==========================================================================================================
                        if ((DateTime.Now - lastReboot).TotalDays >= 7 && (DateTime.Now.DayOfWeek == DayOfWeek.Wednesday || DateTime.Now.DayOfWeek == DayOfWeek.Thursday))
                        {
                            Console.WriteLine();
                            Console.WriteLine("Rebooting computer...");
                            Program.RestartApplication = true; // zorg dat deze service wordt gestopt!
                            // Wacht 10 seconden
                            DateTime dt = DateTime.Now;
                            while (accountingThreadStarted && Program.ApplicationState != ApplicationState.Stopped)
                            {
                                Thread.Sleep(100);
                                if ((DateTime.Now - dt).TotalMilliseconds >= (10 * 1000))
                                {
                                    // Hoe dan ook stoppen na 10 seconden
                                    break;
                                }
                            } //while

                            accountingThreadStarted = false;
                            // Wacht 4 seconden!
                            Thread.Sleep(4 * 1000);
                            Console.WriteLine("Reboot signal send.");
                            RebootWindows.Reboot();
                            break;
                        }
                        // ==========================================================================================================

                        if (accountingThreadStarted)
                        {
                            waitEvent.WaitOne(5000, false); // na 5 seconden komen we hoe dan ook even tot leven
                        }
                    }
                    catch (Exception e)
                    {
                        CDRLogger.Logger.LogError(e);
                    }
                } //while

                // Save usage statistics for next run
                WriteRequestCountersToServiceIniFile();
            }
            finally
            {
                Thread.CurrentThread.Abort();
            }

            CDRLogger.Logger.LogInfo("Ending ExecuteTask();");
        }
예제 #2
0
        public static void ReadUserDatabase()
        {
            lock (lockObject)
            {
                // Reset alle user account tags zodat we straks  kunnen herkenen welke account "verwijderd" moeten worden
                foreach (UserAccount ua in userDatabase.Values)
                {
                    ua.Tag = 0;
                } //foreach


                // First get the name of the inifile
                string iniFilename = UserDatabaseFilename;

                // First read the ini-file settings
                if (File.Exists(iniFilename))
                {
                    IniFile ini = new IniFile(iniFilename);

                    int count = 0;
                    while (true)
                    {
                        count++;
                        string section  = String.Format("User{0}", count);
                        bool   addToDB  = false;
                        string username = ini.IniReadValue(section, "Username", "");
                        if (username.Length <= 0)
                        {
                            // we zijn klaar!
                            break;
                        }


                        // Als account bestaat dan gegevens wijzigen anders user toevoegen
                        UserAccount ua = null;
                        if (!userDatabase.TryGetValue(username, out ua))
                        {
                            addToDB     = true;
                            ua          = new UserAccount();
                            ua.Username = username;
                        }
                        ua.Tag = 1; // deze account kan blijven

                        ua.Password = ini.IniReadValue(section, "Password", "_________" + count.ToString());
                        try
                        {
                            ua.NumberOfDifferentIPsPerHour = Convert.ToInt32(ini.IniReadValue(section, "NumberOfDifferentIPsPerHour", "0"));
                        }
                        catch { }
                        try
                        {
                            ua.NumberOfRequestsPerHour = Convert.ToInt32(ini.IniReadValue(section, "NumberOfRequestsPerHour", "0"));
                        }
                        catch { }


                        string groupList = ini.IniReadValue(section, "AccessGroup", "");
                        foreach (string group in groupList.Split(','))
                        {
                            // Skip over eventuele everbody groep (die is altijd al aanwezig)
                            if (group.ToUpper().Trim() != AccessGroupList.Everybody.ToString().ToUpper())
                            {
                                foreach (string s in Enum.GetNames(typeof(AccessGroupList)))
                                {
                                    if (group.ToUpper().Trim() == s.ToUpper())
                                    {
                                        ua.AccessGroupList.Add((AccessGroupList)Enum.Parse(typeof(AccessGroupList), s));
                                    }
                                } //foreach
                            }
                        }         //foreach


                        // Voeg toe aan de database

                        if (addToDB)
                        {
                            userDatabase.Add(ua.Username, ua);
                        }
                    } //while


                    // Nu useraccounts verwijderen die niet meer in ini file voorkomen. Tegelijk Tag resetten
                    var deleteUA = from entry in userDatabase
                                   where entry.Value.Tag == 0
                                   select entry.Key;
                    // verwijder de verwijderde useraccounts
                    foreach (string key in deleteUA)
                    {
                        userDatabase.Remove(key);
                    } //foreach


                    // Reset alle tags
                    foreach (UserAccount ua in userDatabase.Values)
                    {
                        ua.Tag = 0;
                    } //foreach
                }
                else
                {
                    userDatabase.Clear();

                    UserAccount ua;

                    ua          = new UserAccount();
                    ua.Username = "******";
                    ua.Password = "******";
                    ua.NumberOfDifferentIPsPerHour = -1; // unlimited
                    ua.NumberOfRequestsPerHour     = -1; //unlimited
                    ua.AccessGroupList.Add(AccessGroupList.Administrator);
                    userDatabase.Add(ua.Username, ua);

                    // Write it to disk
                    WriteUserDatabase();
                }
            }
        }