2424namespace Pterodactyl \Repositories ;
2525
2626use Crypt ;
27+ use Log ;
2728use DB ;
2829use Validator ;
2930
@@ -56,21 +57,20 @@ public function create($server, $options)
5657
5758 DB ::beginTransaction ();
5859
59- $ db = new Models \Database ;
60- $ db ->fill ([
61- 'server ' => $ server ->id ,
62- 'db_server ' => $ options ['db_server ' ],
63- 'database ' => $ server ->uuidShort . '_ ' . $ options ['database ' ],
64- 'username ' => $ server ->uuidShort . '_ ' . str_random (7 ),
65- 'remote ' => $ options ['remote ' ],
66- 'password ' => Crypt::encrypt (str_random (20 ))
67- ]);
68- $ db ->save ();
69-
70- // Contact Remote
71- $ dbr = Models \DatabaseServer::findOrFail ($ options ['db_server ' ]);
72-
7360 try {
61+ $ db = new Models \Database ;
62+ $ db ->fill ([
63+ 'server ' => $ server ->id ,
64+ 'db_server ' => $ options ['db_server ' ],
65+ 'database ' => $ server ->uuidShort . '_ ' . $ options ['database ' ],
66+ 'username ' => $ server ->uuidShort . '_ ' . str_random (7 ),
67+ 'remote ' => $ options ['remote ' ],
68+ 'password ' => Crypt::encrypt (str_random (20 ))
69+ ]);
70+ $ db ->save ();
71+
72+ // Contact Remote
73+ $ dbr = Models \DatabaseServer::findOrFail ($ options ['db_server ' ]);
7474
7575 $ capsule = new Capsule ;
7676 $ capsule ->addConnection ([
@@ -82,7 +82,10 @@ public function create($server, $options)
8282 'password ' => Crypt::decrypt ($ dbr ->password ),
8383 'charset ' => 'utf8 ' ,
8484 'collation ' => 'utf8_unicode_ci ' ,
85- 'prefix ' => ''
85+ 'prefix ' => '' ,
86+ 'options ' => [
87+ \PDO ::ATTR_TIMEOUT => 3 ,
88+ ]
8689 ]);
8790
8891 $ capsule ->setAsGlobal ();
@@ -110,10 +113,9 @@ public function drop($database)
110113 $ db = Models \Database::findOrFail ($ database );
111114 $ dbr = Models \DatabaseServer::findOrFail ($ db ->db_server );
112115
113- try {
114-
115- DB ::beginTransaction ();
116+ DB ::beginTransaction ();
116117
118+ try {
117119 $ capsule = new Capsule ;
118120 $ capsule ->addConnection ([
119121 'driver ' => 'mysql ' ,
@@ -124,7 +126,10 @@ public function drop($database)
124126 'password ' => Crypt::decrypt ($ dbr ->password ),
125127 'charset ' => 'utf8 ' ,
126128 'collation ' => 'utf8_unicode_ci ' ,
127- 'prefix ' => ''
129+ 'prefix ' => '' ,
130+ 'options ' => [
131+ \PDO ::ATTR_TIMEOUT => 3 ,
132+ ]
128133 ]);
129134
130135 $ capsule ->setAsGlobal ();
@@ -143,4 +148,83 @@ public function drop($database)
143148
144149 }
145150
151+ /**
152+ * Deletes a database server from the system if it is empty.
153+ * @param int $server The ID of the Database Server.
154+ * @return
155+ */
156+ public function delete ($ server )
157+ {
158+ $ dbh = Models \DatabaseServer::findOrFail ($ server );
159+ $ databases = Models \Database::where ('db_server ' , $ dbh ->id )->count ();
160+
161+ if ($ databases > 0 ) {
162+ throw new DisplayException ('You cannot delete a database server that has active databases attached to it. ' );
163+ }
164+
165+ return $ dbh ->delete ();
166+ }
167+
168+ /**
169+ * Adds a new Database Server to the system.
170+ * @param array $data
171+ */
172+ public function add (array $ data )
173+ {
174+ $ validator = Validator::make ($ data , [
175+ 'name ' => 'required|string|max:255 ' ,
176+ 'host ' => 'required|ip|unique:database_servers,host ' ,
177+ 'port ' => 'required|numeric|between:1,65535 ' ,
178+ 'username ' => 'required|string|max:32 ' ,
179+ 'password ' => 'required|string ' ,
180+ 'linked_node ' => 'sometimes ' ,
181+ ]);
182+
183+ if ($ validator ->fails ()) {
184+ throw new DisplayValidationException ($ validator ->errors ());
185+ }
186+
187+ DB ::beginTransaction ();
188+
189+ try {
190+ $ capsule = new Capsule ;
191+ $ capsule ->addConnection ([
192+ 'driver ' => 'mysql ' ,
193+ 'host ' => $ data ['host ' ],
194+ 'port ' => $ data ['port ' ],
195+ 'database ' => 'mysql ' ,
196+ 'username ' => $ data ['username ' ],
197+ 'password ' => $ data ['password ' ],
198+ 'charset ' => 'utf8 ' ,
199+ 'collation ' => 'utf8_unicode_ci ' ,
200+ 'prefix ' => '' ,
201+ 'options ' => [
202+ \PDO ::ATTR_TIMEOUT => 3 ,
203+ ]
204+ ]);
205+
206+ $ capsule ->setAsGlobal ();
207+
208+ // Allows us to check that we can connect to things.
209+ Capsule::select ('SELECT 1 FROM dual ' );
210+
211+ $ dbh = new Models \DatabaseServer ;
212+ $ dbh ->fill ([
213+ 'name ' => $ data ['name ' ],
214+ 'host ' => $ data ['host ' ],
215+ 'port ' => $ data ['port ' ],
216+ 'username ' => $ data ['username ' ],
217+ 'password ' => Crypt::encrypt ($ data ['password ' ]),
218+ 'max_databases ' => NULL ,
219+ 'linked_node ' => (!empty ($ data ['linked_node ' ]) && $ data ['linked_node ' ] > 0 ) ? $ data ['linked_node ' ] : NULL
220+ ]);
221+ $ dbh ->save ();
222+
223+ DB ::commit ();
224+ } catch (\Exception $ ex ) {
225+ DB ::rollBack ();
226+ throw $ ex ;
227+ }
228+ }
229+
146230}
0 commit comments