Support uplink network management when two wlan devices are available
[infodrom/musiikki-web.git] / class / ajax.class.php
1 <?php
2
3 class AJAX {
4     protected static function callCommand($cmd, array $data=array())
5     {
6         if (($pipe = popen($cmd, 'w')) === false)
7             return false;
8
9         foreach ($data as $value)
10             fwrite($pipe, $value . "\n");
11
12         pclose($pipe);
13         return true;
14     }
15
16     public static function getdatetimeAction()
17     {
18         return array('year' => date('Y'),
19                      'month' => date('m'),
20                      'day' => date('d'),
21                      'hour' => date('H'),
22                      'minute' => date('i'),
23                      'second' => date('s'));
24     }
25
26     public static function datetimeAction()
27     {
28         $date = sprintf("%04d-%02d-%02d", $_POST['year'], $_POST['month'], $_POST['day']);
29         $time = sprintf("%02d:%02d:%02d", $_POST['hour'], $_POST['minute'], $_POST['second']);
30
31         $ok = self::callCommand("super musiikki-datetime", array($date, $time));
32
33         return $ok;
34     }
35
36     public static function getwifiAction()
37     {
38         if (!file_exists('/etc/hostapd/hostapd.conf'))
39             return array();
40
41         if (($f = fopen('/etc/hostapd/hostapd.conf', 'r')) === false)
42             return array();
43
44         $essid = '';
45         $password = '';
46
47         while (($line = fgets($f)) !== false) {
48             $line = trim($line);
49             if (substr($line,0,1) == '#') continue;
50             if (!strlen($line)) continue;
51
52             $parts = explode('=', $line, 2);
53             if ($parts[0] == 'ssid')
54                 $essid = $parts[1];
55             elseif ($parts[0] == 'wpa_passphrase')
56                 $password = $parts[1];
57         }
58
59         fclose($f);
60
61         return array('essid' => $essid,
62                      'password' => $password);
63     }
64
65     public static function wifiAction()
66     {
67         $ok = self::callCommand("super musiikki-wifi", array($_POST['essid'], $_POST['password']));
68
69         return $ok;
70     }
71
72     public static function getnetworkAction()
73     {
74         $name = NULL;
75         $conf = '/etc/network/interfaces.d/uplink.conf';
76         if (file_exists($conf)) {
77             $dest = readlink($conf);
78             $name = substr($dest, 9, -5);
79         }
80
81         $upstream = [];
82         foreach (new DirectoryIterator(dirname($conf)) as $fileInfo) {
83             if (substr($fileInfo->getBasename(), 0, 9) != 'upstream_') continue;
84             $upstream[] = substr($fileInfo->getBasename('.conf'), 9);
85         }
86         sort($upstream);
87
88         $ip = NULL;
89         $lines = [];
90         $f = popen("ip -f inet addr show wlan0", 'r');
91         while (($line = fgets($f)) !== false)
92             $lines[] = rtrim($line);
93         pclose($f);
94         if (count($lines)) {
95             if (preg_match('/inet (\d+\.\d+\.\d+\.\d+)\/.*/', $lines[1], $matches))
96                 $ip = $matches[1];
97         }
98
99         $networks = [];
100         $f = popen("iwlist wlan0 scan", 'r');
101         while (($line = fgets($f)) !== false) {
102             if (preg_match('/ESSID:"(.*?)"/', $line, $matches))
103                 if (strlen($matches[1]))
104                     $networks[] = $matches[1];
105         }
106         pclose($f);
107         sort($networks);
108
109         return ['name' => $name,
110                 'ip' => $ip,
111                 'networks' => $networks,
112                 'upstream' => $upstream];
113     }
114
115     public static function networkAction()
116     {
117         $ok = self::callCommand("super musiikki-wlan", array($_POST['wlan']));
118
119         return $ok;
120     }
121
122     public static function essidAction()
123     {
124         if (!preg_match('/^[A-Za-z0-9_-]+$/', $_POST['name']))
125             return;
126
127         $ok = self::callCommand("super musiikki-essid", array($_POST['name'], $_POST['essid'], $_POST['psk']));
128
129         return $ok;
130     }
131
132     public static function getsharesAction()
133     {
134         return array('ro_name' => '\\\\' . $_SERVER['SERVER_ADDR'] .'\\'. Config::SHARE_READ,
135                      'ro_user' => Config::SHARE_READ,
136                      'ro_password' => '',
137                      'rw_name' => '\\\\' . $_SERVER['SERVER_ADDR'] .'\\'. Config::SHARE_WRITE,
138                      'rw_user' => Config::SHARE_WRITE,
139                      'rw_password' => '');
140     }
141
142     public static function sharesAction()
143     {
144         $ok = self::callCommand("super musiikki-shares", array($_POST['ro_password'], $_POST['rw_password']));
145
146         return $ok;
147     }
148
149     public static function getpasswdAction()
150     {
151         return array();
152     }
153
154     public static function passwdAction()
155     {
156         if (!strlen($_POST['password'])) return false;
157
158         if (($f = fopen(Config::main()->get('password'), 'w')) === false) return false;
159
160         fwrite($f, sprintf("admin:%s\n", $_POST['password']));
161         fclose($f);
162
163         return true;
164     }
165
166     public static function gethaltAction()
167     {
168         return array();
169     }
170
171     public static function haltAction()
172     {
173         $ok = self::callCommand("super musiikki-wlan", array(''));
174         $ok = self::callCommand("super musiikki-halt");
175
176         return $ok;
177     }
178
179     public static function getrescanAction()
180     {
181         $mtime = filemtime(Config::main()->get('cache'));
182
183         return array('modified' => date ("d. F Y H:i:s", $mtime));
184     }
185
186     public static function rescanAction()
187     {
188         $mtime = filemtime(Config::main()->get('cache'));
189         if ($mtime > time()-10)
190             return array('info' => 'Rescan läuft gerade und kann nicht erneut getriggert werden.');
191
192         if (($f = fopen(Config::main()->get('rescan_file'), 'w')) !== false) {
193             fwrite($f, time());
194             fclose($f);
195             return true;
196         }
197
198         return false;
199     }
200
201     public static function getsearchAction()
202     {
203         return array();
204     }
205
206     public static function searchAction()
207     {
208         $cache = new Cache();
209
210         $list = $cache->findTitles($_POST['keyword']);
211
212         return ['results' => $list,
213                 'playlist' => $_SESSION['playlist']];
214     }
215
216     public static function getresultsAction()
217     {
218         return array();
219     }
220
221     public static function playlistSelectAction()
222     {
223         $_SESSION['playlist'] = $_POST['name'];
224     }
225
226     public static function getplaylistsAction()
227     {
228         $playlists = new Playlists();
229         $selected = null;
230         if (array_key_exists('playlist', $_SESSION))
231             $selected = $_SESSION['playlist'];
232
233         return ['list' => $playlists->getList(),
234                 'selected' => $selected];
235     }
236
237     public static function playlistAction()
238     {
239         $playlists = new Playlists();
240
241         return ['title' => $_POST['name'],
242                 'list' => $playlists->getContents($_POST['name'])];
243     }
244
245     public function playlistNewAction()
246     {
247         $playlists = new Playlists();
248         $playlists->create($_POST['name']);
249     }
250
251     public function playlistAddAction()
252     {
253         $cache = new Cache();
254         $playlists = new Playlists();
255
256         if (!array_key_exists('playlist', $_SESSION))
257             return;
258
259         $playlists->add($_SESSION['playlist'], $cache->getRelativePath($_POST['id']));
260     }
261 }