]> CyberLeo.Net >> Repos - Github/YOURLS.git/blob - includes/functions-install.php
Maintenance mode (interrupt everything is activated). Closes issue 221.
[Github/YOURLS.git] / includes / functions-install.php
1 <?php\r
2 \r
3 // Check if mod_rewrite is enabled. Note: unused, not reliable enough.\r
4 function yourls_check_mod_rewrite() {\r
5         return yourls_apache_mod_loaded( 'mod_rewrite' );\r
6 }\r
7 \r
8 // Check if extension cURL is enabled\r
9 function yourls_check_curl() {\r
10         return function_exists( 'curl_init' );\r
11 }\r
12 \r
13 // Check if server has MySQL 4.1+\r
14 function yourls_check_database_version() {\r
15         global $ydb;\r
16         return ( version_compare( '4.1', $ydb->mysql_version() ) <= 0 );\r
17 }\r
18 \r
19 // Check if PHP > 4.3\r
20 function yourls_check_php_version() {\r
21         return ( version_compare( '4.3', phpversion() ) <= 0 );\r
22 }\r
23 \r
24 // Check if server is an Apache\r
25 function yourls_is_apache() {\r
26         return (\r
27            strpos( $_SERVER['SERVER_SOFTWARE'], 'Apache' ) !== false\r
28         || strpos( $_SERVER['SERVER_SOFTWARE'], 'LiteSpeed' ) !== false\r
29         );\r
30 }\r
31 \r
32 // Check if server is running IIS\r
33 function yourls_is_iis() {\r
34         return ( strpos( $_SERVER['SERVER_SOFTWARE'], 'IIS' ) !== false );\r
35 }\r
36 \r
37 // Check if module exists in Apache config. Input string eg 'mod_rewrite', return true or $default. Stolen from WordPress\r
38 function yourls_apache_mod_loaded( $mod, $default = false ) {\r
39         if ( !yourls_is_apache() )\r
40                 return false;\r
41 \r
42         if ( function_exists( 'apache_get_modules' ) ) {\r
43                 $mods = apache_get_modules();\r
44                 if ( in_array( $mod, $mods ) )\r
45                         return true;\r
46         } elseif ( function_exists( 'phpinfo' ) ) {\r
47                         ob_start();\r
48                         phpinfo( 8 );\r
49                         $phpinfo = ob_get_clean();\r
50                         if ( false !== strpos( $phpinfo, $mod ) )\r
51                                 return true;\r
52         }\r
53         return $default;\r
54 }\r
55 \r
56 // Create .htaccess or web.config. Returns boolean\r
57 function yourls_create_htaccess() {\r
58         $host = parse_url( YOURLS_SITE );\r
59         $path = ( isset( $host['path'] ) ? $host['path'] : '' );\r
60 \r
61     if ( yourls_is_iis() ) {\r
62                 // Prepare content for a web.config file\r
63             $content = array(\r
64             '<?'.'xml version="1.0" encoding="UTF-8"?>',\r
65             '<configuration>', \r
66             '    <system.webServer>',\r
67             '        <rewrite>',\r
68             '            <rules>',\r
69             '                <rule name="YOURLS" stopProcessing="true">',\r
70             '                    <match url="^(.*)$" ignoreCase="false" />',\r
71             '                    <conditions>',\r
72             '                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />',\r
73             '                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />',\r
74             '                    </conditions>',\r
75             '                    <action type="Rewrite" url="'.$path.'/yourls-loader.php" appendQueryString="true" />',\r
76             '                </rule>',\r
77             '            </rules>',\r
78             '        </rewrite>',\r
79             '    </system.webServer>',\r
80             '</configuration>',\r
81             );\r
82         \r
83             $filename = YOURLS_ABSPATH.'/web.config';\r
84                 $marker = 'none';\r
85 \r
86     } else {\r
87                 // Prepare content for a .htaccess file\r
88             $content = array(\r
89                     '<IfModule mod_rewrite.c>',\r
90                     'RewriteEngine On',\r
91                     'RewriteBase '.$path.'/',\r
92                     'RewriteCond %{REQUEST_FILENAME} !-f',\r
93                     'RewriteCond %{REQUEST_FILENAME} !-d',\r
94                     'RewriteRule ^(.*)$ '.$path.'/yourls-loader.php [L]',\r
95                     '</IfModule>',\r
96             );\r
97         \r
98             $filename = YOURLS_ABSPATH.'/.htaccess';\r
99                 $marker = 'YOURLS';\r
100                 \r
101         }\r
102         \r
103         return ( yourls_insert_with_markers( $filename, $marker, $content ) );\r
104 }\r
105 \r
106 // Inserts $insertion (text in an array of lines) into $filename (.htaccess) between BEGIN/END $marker block. Returns bool. Stolen from WP\r
107 function yourls_insert_with_markers( $filename, $marker, $insertion ) {\r
108         if ( !file_exists( $filename ) || is_writeable( $filename ) ) {\r
109                 if ( !file_exists( $filename ) ) {\r
110                         $markerdata = '';\r
111                 } else {\r
112                         $markerdata = explode( "\n", implode( '', file( $filename ) ) );\r
113                 }\r
114 \r
115                 if ( !$f = @fopen( $filename, 'w' ) )\r
116                         return false;\r
117 \r
118                 $foundit = false;\r
119                 if ( $markerdata ) {\r
120                         $state = true;\r
121                         foreach ( $markerdata as $n => $markerline ) {\r
122                                 if ( strpos( $markerline, '# BEGIN ' . $marker ) !== false )\r
123                                         $state = false;\r
124                                 if ( $state ) {\r
125                                         if ( $n + 1 < count( $markerdata ) )\r
126                                                 fwrite( $f, "{$markerline}\n" );\r
127                                         else\r
128                                                 fwrite( $f, "{$markerline}" );\r
129                                 }\r
130                                 if ( strpos( $markerline, '# END ' . $marker ) !== false ) {\r
131                                         if ( $marker != 'none' )\r
132                                                 fwrite( $f, "# BEGIN {$marker}\n" );\r
133                                         if ( is_array( $insertion ) )\r
134                                                 foreach ( $insertion as $insertline )\r
135                                                         fwrite( $f, "{$insertline}\n" );\r
136                                         if ( $marker != 'none' )\r
137                                                 fwrite( $f, "# END {$marker}\n" );\r
138                                         $state = true;\r
139                                         $foundit = true;\r
140                                 }\r
141                         }\r
142                 }\r
143                 if ( !$foundit ) {\r
144                         if ( $marker != 'none' )\r
145                                 fwrite( $f, "\n\n# BEGIN {$marker}\n" );\r
146                         foreach ( $insertion as $insertline )\r
147                                 fwrite( $f, "{$insertline}\n" );\r
148                         if ( $marker != 'none' )\r
149                                 fwrite( $f, "# END {$marker}\n\n" );\r
150                 }\r
151                 fclose( $f );\r
152                 return true;\r
153         } else {\r
154                 return false;\r
155         }\r
156 }\r
157 \r
158 // Create MySQL tables. Return array( 'success' => array of success strings, 'errors' => array of error strings )\r
159 function yourls_create_sql_tables() {\r
160         global $ydb;\r
161         \r
162         $error_msg = array();\r
163         $success_msg = array();\r
164 \r
165         // Create Table Query\r
166         $create_tables = array();\r
167         $create_tables[YOURLS_DB_TABLE_URL] =\r
168                 'CREATE TABLE IF NOT EXISTS `'.YOURLS_DB_TABLE_URL.'` ('.\r
169                 '`keyword` varchar(200) BINARY NOT NULL,'.\r
170                 '`url` text BINARY NOT NULL,'.\r
171                 '`title` text CHARACTER SET utf8,'.\r
172                 '`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,'.\r
173                 '`ip` VARCHAR(41) NOT NULL,'.\r
174                 '`clicks` INT(10) UNSIGNED NOT NULL,'.\r
175                 ' PRIMARY KEY  (`keyword`),'.\r
176                 ' KEY `timestamp` (`timestamp`),'.\r
177                 ' KEY `ip` (`ip`)'.\r
178                 ');';\r
179 \r
180         $create_tables[YOURLS_DB_TABLE_OPTIONS] = \r
181                 'CREATE TABLE IF NOT EXISTS `'.YOURLS_DB_TABLE_OPTIONS.'` ('.\r
182                 '`option_id` bigint(20) unsigned NOT NULL auto_increment,'.\r
183                 '`option_name` varchar(64) NOT NULL default "",'.\r
184                 '`option_value` longtext NOT NULL,'.\r
185                 'PRIMARY KEY  (`option_id`,`option_name`),'.\r
186                 'KEY `option_name` (`option_name`)'.\r
187                 ') AUTO_INCREMENT=1 ;';\r
188                 \r
189         $create_tables[YOURLS_DB_TABLE_LOG] = \r
190                 'CREATE TABLE IF NOT EXISTS `'.YOURLS_DB_TABLE_LOG.'` ('.\r
191                 '`click_id` int(11) NOT NULL auto_increment,'.\r
192                 '`click_time` datetime NOT NULL,'.\r
193                 '`shorturl` varchar(200) BINARY NOT NULL,'.\r
194                 '`referrer` varchar(200) NOT NULL,'.\r
195                 '`user_agent` varchar(255) NOT NULL,'.\r
196                 '`ip_address` varchar(41) NOT NULL,'.\r
197                 '`country_code` char(2) NOT NULL,'.\r
198                 'PRIMARY KEY  (`click_id`),'.\r
199                 'KEY `shorturl` (`shorturl`)'.\r
200                 ') AUTO_INCREMENT=1 ;';\r
201 \r
202 \r
203         $create_table_count = 0;\r
204         \r
205         $ydb->show_errors = true;\r
206         \r
207         // Create tables\r
208         foreach ( $create_tables as $table_name => $table_query ) {\r
209                 $ydb->query( $table_query );\r
210                 $create_success = $ydb->query( "SHOW TABLES LIKE '$table_name'" );\r
211                 if( $create_success ) {\r
212                         $create_table_count++;\r
213                         $success_msg[] = "Table '$table_name' created."; \r
214                 } else {\r
215                         $error_msg[] = "Error creating table '$table_name'."; \r
216                 }\r
217         }\r
218                 \r
219         // Insert data into tables\r
220         yourls_update_option( 'version', YOURLS_VERSION );\r
221         yourls_update_option( 'db_version', YOURLS_DB_VERSION );\r
222         yourls_update_option( 'next_id', 1 );\r
223         \r
224         // Insert sample links\r
225         yourls_insert_link_in_db( 'http://planetozh.com/blog/', 'ozhblog', 'planetOzh: Ozh\' blog' );\r
226         yourls_insert_link_in_db( 'http://ozh.org/', 'ozh', 'ozh.org' );\r
227         yourls_insert_link_in_db( 'http://yourls.org/', 'yourls', 'YOURLS: Your Own URL Shortener' );\r
228                 \r
229         // Check results of operations\r
230         if ( sizeof( $create_tables ) == $create_table_count ) {\r
231                 $success_msg[] = 'YOURLS tables successfully created.';\r
232         } else {\r
233                 $error_msg[] = "Error creating YOURLS tables."; \r
234         }\r
235 \r
236         return array( 'success' => $success_msg, 'error' => $error_msg );\r
237 }\r
238 \r
239 \r
240 // Toggle maintenance mode. Inspired from WP. Returns true for success, false otherwise\r
241 function yourls_maintenance_mode( $maintenance = true ) {\r
242 \r
243         $file = YOURLS_ABSPATH . '/.maintenance' ;\r
244 \r
245         // Turn maintenance mode on : create .maintenance file\r
246         if ( (bool)$maintenance ) {\r
247                 if ( ! ( $fp = @fopen( $file, 'w' ) ) )\r
248                         return false;\r
249                 \r
250                 $maintenance_string = '<?php $maintenance_start = ' . time() . '; ?>';\r
251                 @fwrite( $fp, $maintenance_string );\r
252                 @fclose( $fp );\r
253                 @chmod( $file, 0644 ); // Read and write for owner, read for everybody else\r
254 \r
255                 // Not sure why the fwrite would fail if the fopen worked... Just in case\r
256                 return( is_readable( $file ) );\r
257                 \r
258         // Turn maintenance mode off : delete the .maintenance file\r
259         } else {\r
260                 return @unlink($file);\r
261         }\r
262 }