keitaircメインレポジトリ
Révision | 1698e63d8e35ec229420cabfdb6fe9e8a91a61d7 (tree) |
---|---|
l'heure | 2010-06-25 02:08:24 |
Auteur | ISHIKAWA Mutsumi <ishikawa@hanz...> |
Commiter | ISHIKAWA Mutsumi |
cleanup Keitairc::Config
@@ -2,6 +2,7 @@ | ||
2 | 2 | # Keitairc::Config |
3 | 3 | # |
4 | 4 | # Copyright (c) 2008 Jun Morimoto <morimoto@mrmt.net> |
5 | +# Copyright (c) 2010 ISHIKAWA Mutsumi <ishikawa@hanzubon.jp> | |
5 | 6 | # This program is covered by the GNU General Public License 2 |
6 | 7 | |
7 | 8 | package Keitairc::Config; |
@@ -27,11 +28,11 @@ sub new{ | ||
27 | 28 | |
28 | 29 | $me->define( |
29 | 30 | # required |
30 | - 'irc_nick', | |
31 | - 'irc_username', | |
32 | - 'irc_server', | |
33 | - 'web_password', | |
34 | - 'web_host', | |
31 | + 'irc_nick' => {ATTR => 'RO|REQ'}, | |
32 | + 'irc_username' => {ATTR => 'RO|REQ'}, | |
33 | + 'irc_server' => {ATTR => 'RO|REQ'}, | |
34 | + 'web_password' => {ATTR => 'RO|REQ'}, | |
35 | + 'web_host' => {ATTR => 'RO|REQ'}, | |
35 | 36 | |
36 | 37 | # optional |
37 | 38 | 'irc_password', |
@@ -42,7 +43,7 @@ sub new{ | ||
42 | 43 | 'softbank_serial_key' => {DEFAULT => ''}, |
43 | 44 | 'emobile_userid' => {DEFAULT => ''}, |
44 | 45 | 'irc_keyword', |
45 | - 'web_listen_port', | |
46 | + 'web_listen_port' => {ATTR => 'RO'}, | |
46 | 47 | 'web_title' => {DEFAULT => 'keitairc'}, |
47 | 48 | 'common_header' => {DEFAULT => ' |
48 | 49 | <meta name="Robots" content="noindex,nofollow" /> |
@@ -51,54 +52,54 @@ sub new{ | ||
51 | 52 | <meta http-equiv="cache-control" content="no-cache" /> |
52 | 53 | <meta http-equiv="expires" content="-1" />'}, |
53 | 54 | 'extra_header' => {DEFAULT => ''}, |
54 | - 'silent_config' => {DEFAULT => $arg->{silent}}, | |
55 | + 'silent_config' => {DEFAULT => $arg->{silent}, ATTR => 'RO'}, | |
55 | 56 | 'version' => {DEFAULT => $arg->{version}}, |
56 | - 'template_dir' => {DEFAULT => getcwd() . '/data/templates:__KEITAIRC_DATA_DIR__/templates'}, | |
57 | - 'plugin_dir' => {DEFAULT => getcwd() . '/data/plugins:__KEITAIRC_DATA_DIR__/plugins'}, | |
58 | - 'public_dir' => {DEFAULT => getcwd() . '/data/public:__KEITAIRC_DATA_DIR__/public'}, | |
57 | + 'template_dir' => {DEFAULT => getcwd() . '/data/templates:__KEITAIRC_DATA_DIR__/templates', ATTR => 'RO'}, | |
58 | + 'plugin_dir' => {DEFAULT => getcwd() . '/data/plugins:__KEITAIRC_DATA_DIR__/plugins', ATTR => 'RO'}, | |
59 | + 'public_dir' => {DEFAULT => getcwd() . '/data/public:__KEITAIRC_DATA_DIR__/public', ATTR => 'RO'}, | |
59 | 60 | 'url_redirect' => {DEFAULT => ''}, |
60 | 61 | 'smtp_server' => {DEFAULT => ''}, |
61 | 62 | 'smtp_from' => {DEFAULT => ''}, |
62 | 63 | 'smtp_to' => {DEFAULT => ''}, |
63 | 64 | 'rgeocode_server' => {DEFAULT => 'finds'}, |
64 | - 'pid_file' => {DEFAULT => 'keitairc.pid'}, | |
65 | - | |
66 | - 'web_root' => {DEFAULT => '/', VALIDATE => \&valid_web_root}, | |
67 | - 'web_schema' => {DEFAULT => 'http', VALIDATE => \&valid_web_schema}, | |
68 | - 'fontsize' => {DEFAULT => '+0', VALIDATE => \&valid_fontsize}, | |
69 | - 'mobile_fontsize' => {DEFAULT => -1, VALIDATE => \&valid_fontsize}, | |
70 | - 'irc_charset' => {DEFAULT => 'utf8', VALIDATE => \&valid_charset}, | |
71 | - 'web_charset' => {DEFAULT => 'shiftjis', VALIDATE => \&valid_charset}, | |
72 | - 'pid_dir' => {DEFAULT => $ENV{HOME} . '/.keitairc_log', VALIDATE => \&valid_dir}, | |
73 | - 'url_target' => {DEFAULT => '_self', VALIDATE => \&valid_url_target}, | |
74 | - 'log' => {DEFAULT => 'file', VALIDATE => \&valid_log}, | |
65 | + 'pid_file' => {DEFAULT => 'keitairc.pid', ATTR => 'RO'}, | |
66 | + | |
67 | + 'web_root' => {TYPE => 'web_root', DEFAULT => '/', ATTR => 'RO'}, | |
68 | + 'web_schema' => {TYPE => 'web_schema', DEFAULT => 'http', ATTR => 'RO'}, | |
69 | + 'fontsize' => {TYPE => 'fontsize', DEFAULT => '+0'}, | |
70 | + 'mobile_fontsize' => {TYPE => 'fontsize', DEFAULT => -1}, | |
71 | + 'irc_charset' => {TYPE => 'charset', DEFAULT => 'utf8'}, | |
72 | + 'web_charset' => {TYPE => 'charset', DEFAULT => 'shiftjis'}, | |
73 | + 'pid_dir' => {TYPE => 'dir', DEFAULT => $ENV{HOME} . '/.keitairc_log', ATTR => 'RO'}, | |
74 | + 'url_target' => {TYPE => 'url_target', DEFAULT => '_self'}, | |
75 | + 'log' => {TYPE => 'log', DEFAULT => 'file', ATTR => 'RO'}, | |
75 | 76 | |
76 | 77 | # optional integer params |
77 | - 'irc_port' => {DEFAULT => 6667, VALIDATE => \&valid_int}, | |
78 | - 'cookie_ttl' => {DEFAULT => 86400 * 3, VALIDATE => \&valid_int}, # 3 days | |
79 | - 'session_ttl' => {DEFAULT => 60 * 30, VALIDATE => \&valid_int}, # 30 min | |
80 | - 'cache_expire' => {DEFAULT => 10800, VALIDATE => \&valid_int}, | |
81 | - 'web_port' => {DEFAULT => 8080, VALIDATE => \&valid_int}, | |
82 | - 'web_lines' => {DEFAULT => 100, VALIDATE => \&valid_int}, | |
83 | - 'ping_delay' => {DEFAULT => 30, VALIDATE => \&valid_int}, | |
84 | - 'reconnect_delay' => {DEFAULT => 10, VALIDATE => \&valid_int}, | |
78 | + 'irc_port' => {TYPE => 'int', DEFAULT => 6667}, | |
79 | + 'cookie_ttl' => {TYPE => 'int', DEFAULT => 86400 * 3}, # 3 days | |
80 | + 'session_ttl' => {TYPE => 'int', DEFAULT => 60 * 30}, # 30 min | |
81 | + 'cache_expire' => {TYPE => 'int', DEFAULT => 3600 * 12}, # 12 hour | |
82 | + 'web_port' => {TYPE => 'int', DEFAULT => 8080}, | |
83 | + 'web_lines' => {TYPE => 'int', DEFAULT => 100}, | |
84 | + 'ping_delay' => {TYPE => 'int', DEFAULT => 30}, | |
85 | + 'reconnect_delay' => {TYPE => 'int', DEFAULT => 10}, | |
85 | 86 | |
86 | 87 | # optional boolean params |
87 | - 'show_joinleave' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1}, | |
88 | - 'show_console' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0}, | |
89 | - 'follow_nick' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1}, | |
90 | - 'debug' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0}, | |
91 | - 'daemonize' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 0}, | |
92 | - 'reverse_message' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1}, | |
93 | - 'reverse_recent' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1}, | |
94 | - 'reverse_unread' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1}, | |
95 | - 'webkit_newui' => {ARGCOUNT => ARGCOUNT_NONE, DEFAULT => 1}, | |
88 | + 'show_joinleave' => {TYPE => 'bool', DEFAULT => 1}, | |
89 | + 'show_console' => {TYPE => 'bool', DEFAULT => 0}, | |
90 | + 'follow_nick' => {TYPE => 'bool', DEFAULT => 1}, | |
91 | + 'debug' => {TYPE => 'bool', DEFAULT => 0}, | |
92 | + 'daemonize' => {TYPE => 'bool', DEFAULT => 0}, | |
93 | + 'reverse_message' => {TYPE => 'bool', DEFAULT => 1}, | |
94 | + 'reverse_recent' => {TYPE => 'bool', DEFAULT => 1}, | |
95 | + 'reverse_unread' => {TYPE => 'bool', DEFAULT => 1}, | |
96 | + 'webkit_newui' => {TYPE => 'bool', DEFAULT => 1}, | |
96 | 97 | |
97 | 98 | # obsolates (ignored) |
98 | - 'show_newmsgonly' => {VALIDATE => \&valid_obsolates}, | |
99 | - 'web_username' => {VALIDATE => \&valid_obsolates}, | |
100 | - 'use_cookie' => {VALIDATE => \&valid_obsolates}, | |
101 | - 'au_pcsv' => {VALIDATE => \&valid_obsolates}, | |
99 | + 'show_newmsgonly' => {TYPE => 'obsolates'}, | |
100 | + 'web_username' => {TYPE => 'obsolates'}, | |
101 | + 'use_cookie' => {TYPE => 'obsolates'}, | |
102 | + 'au_pcsv' => {TYPE => 'obsolates'}, | |
102 | 103 | ); |
103 | 104 | |
104 | 105 | if(-r '/etc/keitairc'){ |
@@ -118,7 +119,7 @@ sub new{ | ||
118 | 119 | $me->args(\@argv); |
119 | 120 | |
120 | 121 | # check required parameters |
121 | - foreach my $n (qw(irc_nick irc_username irc_server web_host web_password)) { | |
122 | + foreach my $n (keys %{$me->{'REQ'}}) { | |
122 | 123 | if(!defined($me->get($n)) || !length($me->get($n))) { |
123 | 124 | die($n . ' does not specified'); |
124 | 125 | } |
@@ -132,7 +133,7 @@ sub new{ | ||
132 | 133 | } |
133 | 134 | |
134 | 135 | ################################################################ |
135 | -sub file{ | |
136 | +sub file { | |
136 | 137 | my $me = shift; |
137 | 138 | my $file = shift; |
138 | 139 | if(-r $file){ |
@@ -144,6 +145,73 @@ sub file{ | ||
144 | 145 | } |
145 | 146 | |
146 | 147 | ################################################################ |
148 | +sub define { | |
149 | + my $me = shift; | |
150 | + my @args = (); | |
151 | + | |
152 | + while (@_) { | |
153 | + my $var = shift; | |
154 | + my $cfg = ref($_[0]) eq 'HASH' ? shift : { }; | |
155 | + if (defined $cfg->{TYPE}) { | |
156 | + if (!defined $cfg->{VALIDATE} && defined &{'valid_' . $cfg->{TYPE}}) { | |
157 | + $cfg->{VALIDATE} = \&{'valid_' . $cfg->{TYPE}}; | |
158 | + } | |
159 | + if (!defined $cfg->{ARGCOUNT} && $cfg->{TYPE} eq 'bool') { | |
160 | + $cfg->{ARGCOUNT} = ARGCOUNT_NONE; | |
161 | + } | |
162 | + $me->type($var, $cfg->{TYPE}); | |
163 | + delete $cfg->{TYPE}; | |
164 | + } | |
165 | + if (defined $cfg->{ATTR}) { | |
166 | + my @attr = split(/\|/, $cfg->{ATTR}); | |
167 | + foreach my $at (@attr) { | |
168 | + if ($at eq 'RO') { | |
169 | + $me->readonly($var, 1); | |
170 | + } elsif ($at eq 'REQ') { | |
171 | + $me->required($var, 1); | |
172 | + } else { | |
173 | + warn 'Ignore unknown attribute: ' . $at; | |
174 | + } | |
175 | + } | |
176 | + delete $cfg->{ATTR}; | |
177 | + } | |
178 | + push(@args, $var => $cfg); | |
179 | + } | |
180 | + | |
181 | + return $me->SUPER::define(@args); | |
182 | +} | |
183 | + | |
184 | +sub type { | |
185 | + my ($me, $name, $type) = @_; | |
186 | + $me->{TYPE} = {} if (!defined $me->{TYPE}); | |
187 | + $me->{TYPE}->{$name} = $type if (defined $type); | |
188 | + return (defined $me->{TYPE}->{$name} ? $me->{TYPE}->{$name} : 'string'); | |
189 | +} | |
190 | + | |
191 | +sub bool_attr { | |
192 | + my ($me, $type_name, $name, $flag) = @_; | |
193 | + $me->{$type_name} = {} if (!defined $me->{$type_name}); | |
194 | + if (defined $flag) { | |
195 | + if ($flag) { | |
196 | + $me->{$type_name}->{$name} = 1; | |
197 | + } else { | |
198 | + delete $me->{$type_name}->{$name}; | |
199 | + } | |
200 | + } | |
201 | + return defined $me->{$type_name}->{$name}; | |
202 | +} | |
203 | + | |
204 | +sub readonly { | |
205 | + my $me = shift; | |
206 | + return $me->bool_attr('RO', @_); | |
207 | +} | |
208 | + | |
209 | +sub required { | |
210 | + my $me = shift; | |
211 | + return $me->bool_attr('REQ', @_); | |
212 | +} | |
213 | + | |
214 | +################################################################ | |
147 | 215 | sub content_charset{ |
148 | 216 | my $me = shift; |
149 | 217 | Encode::MIME::Name::get_mime_name(Encode::resolve_alias($me->web_charset())); |