~ubuntu-branches/ubuntu/hardy/steam/hardy

« back to all changes in this revision

Viewing changes to server/modules/collect_users.pike

  • Committer: Bazaar Package Importer
  • Author(s): Alain Schroeder
  • Date: 2006-11-21 16:03:12 UTC
  • mfrom: (2.1.4 feisty)
  • Revision ID: james.westby@ubuntu.com-20061121160312-nf96y6nihzsyd2uv
Tags: 2.2.31-3
Add patch to prevent inconsistent data after shutdown.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright (C) 2000-2004  Thomas Bopp, Thorsten Hampel, Ludger Merkens
 
1
/* Copyright (C) 2000-2005  Thomas Bopp, Thorsten Hampel, Ludger Merkens
2
2
 *
3
3
 *  This program is free software; you can redistribute it and/or modify
4
4
 *  it under the terms of the GNU General Public License as published by
14
14
 *  along with this program; if not, write to the Free Software
15
15
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
16
 * 
17
 
 * $Id: collect_users.pike,v 1.1.1.1 2005/02/23 14:47:21 cvs Exp $
 
17
 * $Id: collect_users.pike,v 1.2 2006/03/29 07:46:07 exodusd Exp $
18
18
 */
19
19
 
20
20
//! checks active users and possible moves them home
21
21
 
22
22
 
23
 
constant cvs_version="$Id: collect_users.pike,v 1.1.1.1 2005/02/23 14:47:21 cvs Exp $";
 
23
constant cvs_version="$Id: collect_users.pike,v 1.2 2006/03/29 07:46:07 exodusd Exp $";
24
24
 
25
25
inherit "/kernel/module";
26
26
 
30
30
#include <coal.h>
31
31
#include <database.h>
32
32
 
 
33
//#define DEBUG_COLLECT
 
34
 
 
35
#ifdef DEBUG_COLLECT
 
36
#define LOG_COLLECT(s, args...) werror("Collecting: " + s+ "\n", args)
 
37
#else
 
38
#define LOG_COLLECT(s, args...) 
 
39
#endif
33
40
 
34
41
static Thread.Queue userQueue = Thread.Queue();
35
42
 
36
43
void load_module()
37
44
{
 
45
    add_global_event(EVENT_LOGIN, user_login, PHASE_NOTIFY);
38
46
    start_thread(collect);
39
47
}
40
48
 
41
49
void user_login(object obj, object user, int feature, int prev_features)
42
50
{
 
51
    LOG_COLLECT("User %O logged in ...", user);
43
52
    userQueue->write(user);
44
53
}
45
54
 
64
73
 
65
74
static int check_user(object user)
66
75
{
67
 
  if ( !stringp(user->get_identifier()) )
68
 
    return 0;
69
 
  if ( user->get_status() == 0 ) {
70
 
    if ( user->get_environment() != user->query_attribute(USER_WORKROOM) ){
71
 
      MESSAGE("Collect: Moving user %s", user->get_identifier());
72
 
      object wr = user->query_attribute(USER_WORKROOM);
73
 
      if ( objectp(wr) )
74
 
        user->move(wr);
 
76
    LOG_COLLECT("Checking user %O", user);
 
77
    if ( !stringp(user->get_identifier()) )
 
78
        return 0;
 
79
    if ( user->get_status() == 0 ) {
 
80
        if ( user->get_environment() != user->query_attribute(USER_WORKROOM) ){
 
81
            LOG_COLLECT("Collect: Moving user %s", user->get_identifier());
 
82
            object wr = user->query_attribute(USER_WORKROOM);
 
83
            LOG_COLLECT("Found Workroom %O", wr);
 
84
            if ( objectp(wr) ) {
 
85
                user->move(wr);
 
86
                LOG_COLLECT("Moved !");
 
87
            }
 
88
        }
 
89
        return 0;
75
90
    }
76
 
    return 0;
77
 
  }
78
 
  return 1;
 
91
    return 1;
79
92
}
80
93
 
81
94
static void collect()
82
95
{
83
96
    while ( 1 ) {
84
97
        mixed err = catch {
 
98
            LOG_COLLECT(" Checking users ...");
85
99
            object user;
86
100
            array(object) check_users;
87
101
            check_users = ({ });
88
102
            while ( userQueue->size() > 0 ) {
89
103
                user = userQueue->read();
90
 
                if ( search(check_users, user) == -1 && check_user(user) )
 
104
                if ( search(check_users, user) == -1 && 
 
105
                     check_user(user) )
91
106
                    check_users += ({ user });
92
107
            }
93
108
            foreach ( check_users, user)
107
122
                  int t = time() - socket->get_last_response();
108
123
                  if ( t > COAL_TIMEOUT ) {
109
124
                    if ( !functionp(socket->get_ip) )
110
 
                        MESSAGE("Socket without IP function !");
111
 
                    MESSAGE("Socket description is " + master()->describe_object(socket));
112
 
                    MESSAGE("COAL: timeout on socket: "+socket->get_ip());
113
 
                    socket->close_connection();
 
125
                        werror("Socket without IP function !");
 
126
                    mixed e = catch(socket->close_connection());
114
127
                  }
115
128
              }
116
129
            }
117
130
        };
118
131
        if ( err != 0 )
119
 
            FATAL("Error on collect_users():\n %s\n%s", 
 
132
          FATAL("Error on collect_users():\n %s\n%s", 
120
133
                  err[0], describe_backtrace(err[1]));
121
 
        sleep(200);
 
134
#ifdef DEBUG_COLLECT
 
135
        sleep(10);
 
136
#else
 
137
        sleep(300);
 
138
#endif
122
139
    }
123
140
}
124
141