Merge branch 'develop'

This commit is contained in:
snipe 2017-10-02 13:09:17 -07:00
commit e389f67629
40 changed files with 1177 additions and 64682 deletions

View file

@ -43,7 +43,7 @@ before_script:
# use the $DB env variable to determine the phpunit.xml to use # use the $DB env variable to determine the phpunit.xml to use
# script: ./vendor/bin/codecept run --env testing-ci # script: ./vendor/bin/codecept run --env testing-ci
script: script:
- ./vendor/bin/codecept run unit --env testing-ci - ./vendor/bin/codecept run unit
# - ./vendor/bin/codecept run acceptance --env=testing-ci # - ./vendor/bin/codecept run acceptance --env=testing-ci
- ./vendor/bin/codecept run functional --env=functional-travis - ./vendor/bin/codecept run functional --env=functional-travis
#script: ./vendor/bin/codecept run #script: ./vendor/bin/codecept run

View file

@ -23,7 +23,7 @@ class LocationsController extends Controller
$allowed_columns = ['id','name','address','address2','city','state','country','zip','created_at', $allowed_columns = ['id','name','address','address2','city','state','country','zip','created_at',
'updated_at','parent_id', 'manager_id']; 'updated_at','parent_id', 'manager_id'];
$locations = Location::select([ $locations = Location::with('parent', 'manager', 'childLocations')->select([
'locations.id', 'locations.id',
'locations.name', 'locations.name',
'locations.address', 'locations.address',
@ -37,7 +37,10 @@ class LocationsController extends Controller
'locations.created_at', 'locations.created_at',
'locations.updated_at', 'locations.updated_at',
'locations.currency' 'locations.currency'
])->withCount('assets')->withCount('users'); ])->withCount('locationAssets')
->withCount('assignedAssets')
->withCount('assets')
->withCount('users');
if ($request->has('search')) { if ($request->has('search')) {
$locations = $locations->TextSearch($request->input('search')); $locations = $locations->TextSearch($request->input('search'));
@ -52,7 +55,6 @@ class LocationsController extends Controller
$total = $locations->count(); $total = $locations->count();
$locations = $locations->skip($offset)->take($limit)->get(); $locations = $locations->skip($offset)->take($limit)->get();
return (new LocationsTransformer)->transformLocations($locations, $total); return (new LocationsTransformer)->transformLocations($locations, $total);
} }
@ -74,7 +76,6 @@ class LocationsController extends Controller
return response()->json(Helper::formatStandardApiResponse('success', (new LocationsTransformer)->transformLocation($location), trans('admin/locations/message.create.success'))); return response()->json(Helper::formatStandardApiResponse('success', (new LocationsTransformer)->transformLocation($location), trans('admin/locations/message.create.success')));
} }
return response()->json(Helper::formatStandardApiResponse('error', null, $location->getErrors())); return response()->json(Helper::formatStandardApiResponse('error', null, $location->getErrors()));
} }
/** /**
@ -109,7 +110,13 @@ class LocationsController extends Controller
$location->fill($request->all()); $location->fill($request->all());
if ($location->save()) { if ($location->save()) {
return response()->json(Helper::formatStandardApiResponse('success', (new LocationsTransformer)->transformLocation($location), trans('admin/locations/message.update.success'))); return response()->json(
Helper::formatStandardApiResponse(
'success',
(new LocationsTransformer)->transformLocation($location),
trans('admin/locations/message.update.success')
)
);
} }
return response()->json(Helper::formatStandardApiResponse('error', null, $location->getErrors())); return response()->json(Helper::formatStandardApiResponse('error', null, $location->getErrors()));
@ -129,7 +136,6 @@ class LocationsController extends Controller
$location = Location::findOrFail($id); $location = Location::findOrFail($id);
$this->authorize('delete', $location); $this->authorize('delete', $location);
$location->delete(); $location->delete();
return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/locations/message.delete.success'))); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/locations/message.delete.success')));
} }
} }

View file

@ -75,7 +75,7 @@ class AssetsController extends Controller
} else { } else {
$company = null; $company = null;
} }
return view('hardware/index')->with('company',$company); return view('hardware/index')->with('company', $company);
} }
/** /**
@ -94,7 +94,6 @@ class AssetsController extends Controller
} }
$this->authorize('view', $asset); $this->authorize('view', $asset);
return redirect()->route('hardware.show', $asset->id)->with('topsearch', $topsearch); return redirect()->route('hardware.show', $asset->id)->with('topsearch', $topsearch);
} }
/** /**
@ -126,9 +125,7 @@ class AssetsController extends Controller
if ($request->has('model_id')) { if ($request->has('model_id')) {
$selected_model = AssetModel::find($request->input('model_id')); $selected_model = AssetModel::find($request->input('model_id'));
$view->with('selected_model', $selected_model); $view->with('selected_model', $selected_model);
} else {
} }
return $view; return $view;
} }
@ -168,7 +165,6 @@ class AssetsController extends Controller
// Create the image (if one was chosen.) // Create the image (if one was chosen.)
if (Input::has('image')) { if (Input::has('image')) {
$image = Input::get('image'); $image = Input::get('image');
// After modification, the image is prefixed by mime info like the following: // After modification, the image is prefixed by mime info like the following:
@ -201,7 +197,6 @@ class AssetsController extends Controller
->put('default', $messageBag)); ->put('default', $messageBag));
return response()->json(['image' => $e->getMessage()], 422); return response()->json(['image' => $e->getMessage()], 422);
} }
} }
@ -211,31 +206,26 @@ class AssetsController extends Controller
// Need to investigate and fix. Using static method for now. // Need to investigate and fix. Using static method for now.
$model = AssetModel::find($request->get('model_id')); $model = AssetModel::find($request->get('model_id'));
if ($model->fieldset) { if ($model->fieldset) {
foreach ($model->fieldset->fields as $field) { foreach ($model->fieldset->fields as $field) {
if ($field->field_encrypted=='1') { if ($field->field_encrypted=='1') {
if (Gate::allows('admin')) { if (Gate::allows('admin')) {
$asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug())); $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug()));
} }
} else { } else {
$asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug()); $asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug());
} }
} }
} }
// Was the asset created? // Was the asset created?
if ($asset->save()) { if ($asset->save()) {
$asset->logCreate(); $asset->logCreate();
if(request('assigned_user')) { if (request('assigned_user')) {
$target = User::find(request('assigned_user')); $target = User::find(request('assigned_user'));
} elseif(request('assigned_asset')) { } elseif (request('assigned_asset')) {
$target = Asset::find(request('assigned_asset')); $target = Asset::find(request('assigned_asset'));
} elseif(request('assigned_location')) { } elseif (request('assigned_location')) {
$target = Location::find(request('assigned_location')); $target = Location::find(request('assigned_location'));
} }
if (isset($target)) { if (isset($target)) {
@ -268,15 +258,15 @@ class AssetsController extends Controller
$this->authorize($item); $this->authorize($item);
return view('hardware/edit', compact('item')) return view('hardware/edit', compact('item'))
->with('model_list', Helper::modelList()) ->with('model_list', Helper::modelList())
->with('supplier_list', Helper::suppliersList()) ->with('supplier_list', Helper::suppliersList())
->with('company_list', Helper::companyList()) ->with('company_list', Helper::companyList())
->with('locations_list', Helper::locationsList()) ->with('locations_list', Helper::locationsList())
->with('statuslabel_list', Helper::statusLabelList()) ->with('statuslabel_list', Helper::statusLabelList())
->with('assigned_to', Helper::usersList()) ->with('assigned_to', Helper::usersList())
->with('manufacturer', Helper::manufacturerList()) ->with('manufacturer', Helper::manufacturerList())
->with('statuslabel_types', Helper::statusTypeList()) ->with('statuslabel_types', Helper::statusTypeList())
->with('category', Helper::categoryList('asset')); ->with('category', Helper::categoryList('asset'));
} }
@ -291,7 +281,6 @@ class AssetsController extends Controller
public function update(AssetRequest $request, $assetId = null) public function update(AssetRequest $request, $assetId = null)
{ {
// Check if the asset exists // Check if the asset exists
if (!$asset = Asset::find($assetId)) { if (!$asset = Asset::find($assetId)) {
// Redirect to the asset management page with error // Redirect to the asset management page with error
@ -369,7 +358,6 @@ class AssetsController extends Controller
if (Gate::allows('admin')) { if (Gate::allows('admin')) {
$asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt(e($request->input($field->convertUnicodeDbSlug()))); $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt(e($request->input($field->convertUnicodeDbSlug())));
} }
} else { } else {
$asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug()); $asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug());
} }
@ -385,7 +373,6 @@ class AssetsController extends Controller
\Input::flash(); \Input::flash();
\Session::flash('errors', $asset->getErrors()); \Session::flash('errors', $asset->getErrors());
return response()->json(['errors' => $asset->getErrors()], 500); return response()->json(['errors' => $asset->getErrors()], 500);
} }
/** /**
@ -407,8 +394,8 @@ class AssetsController extends Controller
$this->authorize('delete', $asset); $this->authorize('delete', $asset);
DB::table('assets') DB::table('assets')
->where('id', $asset->id) ->where('id', $asset->id)
->update(array('assigned_to' => null)); ->update(array('assigned_to' => null));
$asset->delete(); $asset->delete();
@ -447,7 +434,6 @@ class AssetsController extends Controller
->with('users_list', Helper::usersList()) ->with('users_list', Helper::usersList())
->with('assets_list', Helper::assetsList()) ->with('assets_list', Helper::assetsList())
->with('locations_list', Helper::locationsList()); ->with('locations_list', Helper::locationsList());
} }
/** /**
@ -469,11 +455,11 @@ class AssetsController extends Controller
} }
$this->authorize('checkout', $asset); $this->authorize('checkout', $asset);
if(request('assigned_user')) { if (request('assigned_user')) {
$target = User::find(request('assigned_user')); $target = User::find(request('assigned_user'));
} elseif(request('assigned_asset')) { } elseif (request('assigned_asset')) {
$target = Asset::find(request('assigned_asset')); $target = Asset::find(request('assigned_asset'));
} elseif(request('assigned_location')) { } elseif (request('assigned_location')) {
$target = Location::find(request('assigned_location')); $target = Location::find(request('assigned_location'));
} }
// $user = User::find(Input::get('assigned_to')); // $user = User::find(Input::get('assigned_to'));
@ -519,7 +505,6 @@ class AssetsController extends Controller
$this->authorize('checkin', $asset); $this->authorize('checkin', $asset);
return view('hardware/checkin', compact('asset'))->with('statusLabel_list', Helper::statusLabelList())->with('backto', $backto); return view('hardware/checkin', compact('asset'))->with('statusLabel_list', Helper::statusLabelList())->with('backto', $backto);
} }
@ -544,7 +529,7 @@ class AssetsController extends Controller
$this->authorize('checkin', $asset); $this->authorize('checkin', $asset);
$admin = Auth::user(); $admin = Auth::user();
if($asset->assignedType() == Asset::USER) { if ($asset->assignedType() == Asset::USER) {
$user = $asset->assignedTo; $user = $asset->assignedTo;
} }
if (is_null($target = $asset->assignedTo)) { if (is_null($target = $asset->assignedTo)) {
@ -583,7 +568,7 @@ class AssetsController extends Controller
} }
if ($backto=='user') { if ($backto=='user') {
return redirect()->to("admin/users/".$user->id.'/view')->with('success', trans('admin/hardware/message.checkin.success')); return redirect()->route("users.show", $user->id)->with('success', trans('admin/hardware/message.checkin.success'));
} }
return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkin.success')); return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkin.success'));
} }
@ -607,15 +592,16 @@ class AssetsController extends Controller
$asset = Asset::withTrashed()->find($assetId); $asset = Asset::withTrashed()->find($assetId);
$this->authorize('view', $asset); $this->authorize('view', $asset);
$settings = Setting::getSettings(); $settings = Setting::getSettings();
$audit_log = Actionlog::where('action_type','=','audit')->where('item_id','=',$assetId)->where('item_type','=',Asset::class)->orderBy('created_at','DESC')->first(); $audit_log = Actionlog::where('action_type', '=', 'audit')
->where('item_id', '=', $assetId)
->where('item_type', '=', Asset::class)
->orderBy('created_at', 'DESC')->first();
if (isset($asset)) { if (isset($asset)) {
if (!is_null($asset->assetloc)) { if (!is_null($asset->assetloc)) {
$use_currency = $asset->assetloc->currency; $use_currency = $asset->assetloc->currency;
} else { } else {
if ($settings->default_currency!='') { if ($settings->default_currency!='') {
$use_currency = $settings->default_currency; $use_currency = $settings->default_currency;
} else { } else {
@ -629,7 +615,7 @@ class AssetsController extends Controller
); );
return view('hardware/view', compact('asset', 'qr_code', 'settings')) return view('hardware/view', compact('asset', 'qr_code', 'settings'))
->with('use_currency', $use_currency)->with('audit_log',$audit_log); ->with('use_currency', $use_currency)->with('audit_log', $audit_log);
} }
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist', compact('id'))); return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist', compact('id')));
@ -652,8 +638,7 @@ class AssetsController extends Controller
$size = Helper::barcodeDimensions($settings->barcode_type); $size = Helper::barcodeDimensions($settings->barcode_type);
$qr_file = public_path().'/uploads/barcodes/qr-'.str_slug($asset->asset_tag).'-'.str_slug($asset->id).'.png'; $qr_file = public_path().'/uploads/barcodes/qr-'.str_slug($asset->asset_tag).'-'.str_slug($asset->id).'.png';
if (isset($asset->id,$asset->asset_tag)) { if (isset($asset->id, $asset->asset_tag)) {
if (file_exists($qr_file)) { if (file_exists($qr_file)) {
$header = ['Content-type' => 'image/png']; $header = ['Content-type' => 'image/png'];
return response()->file($qr_file, $header); return response()->file($qr_file, $header);
@ -665,7 +650,6 @@ class AssetsController extends Controller
} }
} }
} }
} }
@ -683,8 +667,7 @@ class AssetsController extends Controller
$asset = Asset::find($assetId); $asset = Asset::find($assetId);
$barcode_file = public_path().'/uploads/barcodes/'.str_slug($settings->alt_barcode).'-'.str_slug($asset->asset_tag).'.png'; $barcode_file = public_path().'/uploads/barcodes/'.str_slug($settings->alt_barcode).'-'.str_slug($asset->asset_tag).'.png';
if (isset($asset->id,$asset->asset_tag)) { if (isset($asset->id, $asset->asset_tag)) {
if (file_exists($barcode_file)) { if (file_exists($barcode_file)) {
$header = ['Content-type' => 'image/png']; $header = ['Content-type' => 'image/png'];
return response()->file($barcode_file, $header); return response()->file($barcode_file, $header);
@ -695,7 +678,6 @@ class AssetsController extends Controller
return response($barcode_obj->getPngData())->header('Content-type', 'image/png'); return response($barcode_obj->getPngData())->header('Content-type', 'image/png');
} }
} }
} }
/** /**
@ -762,7 +744,6 @@ class AssetsController extends Controller
*/ */
public function postImportHistory(Request $request) public function postImportHistory(Request $request)
{ {
if (!ini_get("auto_detect_line_endings")) { if (!ini_get("auto_detect_line_endings")) {
ini_set("auto_detect_line_endings", '1'); ini_set("auto_detect_line_endings", '1');
} }
@ -780,9 +761,7 @@ class AssetsController extends Controller
foreach ($results as $row) { foreach ($results as $row) {
if (is_array($row)) { if (is_array($row)) {
$row = array_change_key_case($row, CASE_LOWER); $row = array_change_key_case($row, CASE_LOWER);
$asset_tag = Helper::array_smart_fetch($row, "asset tag"); $asset_tag = Helper::array_smart_fetch($row, "asset tag");
if (!array_key_exists($asset_tag, $item)) { if (!array_key_exists($asset_tag, $item)) {
@ -797,7 +776,6 @@ class AssetsController extends Controller
$item[$asset_tag][$batch_counter]['email'] = Helper::array_smart_fetch($row, "email"); $item[$asset_tag][$batch_counter]['email'] = Helper::array_smart_fetch($row, "email");
if ($asset = Asset::where('asset_tag', '=', $asset_tag)->first()) { if ($asset = Asset::where('asset_tag', '=', $asset_tag)->first()) {
$item[$asset_tag][$batch_counter]['asset_id'] = $asset->id; $item[$asset_tag][$batch_counter]['asset_id'] = $asset->id;
$base_username = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $item[$asset_tag][$batch_counter]['name']); $base_username = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $item[$asset_tag][$batch_counter]['name']);
@ -854,12 +832,10 @@ class AssetsController extends Controller
} else { } else {
$status['error'][]['asset'][$asset_tag]['msg'] = 'Asset and user was matched but could not be saved.'; $status['error'][]['asset'][$asset_tag]['msg'] = 'Asset and user was matched but could not be saved.';
} }
} else { } else {
$item[$asset_tag][$batch_counter]['checkedout_to'] = null; $item[$asset_tag][$batch_counter]['checkedout_to'] = null;
$status['error'][]['user'][Helper::array_smart_fetch($row, "name")]['msg'] = 'User does not exist so no checkin log was created.'; $status['error'][]['user'][Helper::array_smart_fetch($row, "name")]['msg'] = 'User does not exist so no checkin log was created.';
} }
} else { } else {
$item[$asset_tag][$batch_counter]['asset_id'] = null; $item[$asset_tag][$batch_counter]['asset_id'] = null;
$status['error'][]['asset'][$asset_tag]['msg'] = 'Asset does not exist so no match was attempted.'; $status['error'][]['asset'][$asset_tag]['msg'] = 'Asset does not exist so no match was attempted.';
@ -875,7 +851,6 @@ class AssetsController extends Controller
// Only do this if a matching user was found // Only do this if a matching user was found
if ((array_key_exists('checkedout_to', $asset_batch[$x])) && ($asset_batch[$x]['checkedout_to']!='')) { if ((array_key_exists('checkedout_to', $asset_batch[$x])) && ($asset_batch[$x]['checkedout_to']!='')) {
if (($total_in_batch > 1) && ($x < $total_in_batch) && (array_key_exists($next, $asset_batch))) { if (($total_in_batch > 1) && ($x < $total_in_batch) && (array_key_exists($next, $asset_batch))) {
$checkin_date = Carbon::parse($asset_batch[$next]['checkout_date'])->subDay(1)->format('Y-m-d H:i:s'); $checkin_date = Carbon::parse($asset_batch[$next]['checkout_date'])->subDay(1)->format('Y-m-d H:i:s');
$asset_batch[$x]['real_checkin'] = $checkin_date; $asset_batch[$x]['real_checkin'] = $checkin_date;
@ -982,7 +957,6 @@ class AssetsController extends Controller
} }
$log->delete(); $log->delete();
return redirect()->back()->with('success', trans('admin/hardware/message.deletefile.success')); return redirect()->back()->with('success', trans('admin/hardware/message.deletefile.success'));
} }
// Prepare the error message // Prepare the error message
$error = trans('admin/hardware/message.does_not_exist', compact('id')); $error = trans('admin/hardware/message.does_not_exist', compact('id'));
@ -1049,25 +1023,19 @@ class AssetsController extends Controller
if ($request->has('bulk_actions')) { if ($request->has('bulk_actions')) {
if ($request->input('bulk_actions')=='labels') { if ($request->input('bulk_actions')=='labels') {
$count = 0; $count = 0;
return view('hardware/labels') return view('hardware/labels')
->with('assets', Asset::find($asset_ids)) ->with('assets', Asset::find($asset_ids))
->with('settings', Setting::getSettings()) ->with('settings', Setting::getSettings())
->with('count', $count) ->with('count', $count)
->with('settings', ->with('settings', Setting::getSettings());
Setting::getSettings()
);
} elseif ($request->input('bulk_actions')=='delete') { } elseif ($request->input('bulk_actions')=='delete') {
$assets = Asset::with('assignedTo', 'assetloc')->find($asset_ids); $assets = Asset::with('assignedTo', 'assetloc')->find($asset_ids);
$assets->each(function($asset) { $assets->each(function ($asset) {
$this->authorize('delete',$asset); $this->authorize('delete', $asset);
}); });
return view('hardware/bulk-delete')->with('assets', $assets); return view('hardware/bulk-delete')->with('assets', $assets);
// Bulk edit // Bulk edit
} elseif ($request->input('bulk_actions')=='edit') { } elseif ($request->input('bulk_actions')=='edit') {
return view('hardware/bulk') return view('hardware/bulk')
@ -1148,9 +1116,8 @@ class AssetsController extends Controller
} }
DB::table('assets') DB::table('assets')
->where('id', $key) ->where('id', $key)
->update($update_array); ->update($update_array);
} // endforeach } // endforeach
return redirect()->to("hardware")->with('success', trans('admin/hardware/message.update.success')); return redirect()->to("hardware")->with('success', trans('admin/hardware/message.update.success'));
// no values given, nothing to update // no values given, nothing to update
@ -1172,7 +1139,6 @@ class AssetsController extends Controller
{ {
$this->authorize('delete', Asset::class); $this->authorize('delete', Asset::class);
if (Input::has('ids')) { if (Input::has('ids')) {
$assets = Asset::find(Input::get('ids')); $assets = Asset::find(Input::get('ids'));
foreach ($assets as $asset) { foreach ($assets as $asset) {
@ -1180,9 +1146,8 @@ class AssetsController extends Controller
$update_array['assigned_to'] = null; $update_array['assigned_to'] = null;
DB::table('assets') DB::table('assets')
->where('id', $asset->id) ->where('id', $asset->id)
->update($update_array); ->update($update_array);
} // endforeach } // endforeach
return redirect()->to("hardware")->with('success', trans('admin/hardware/message.delete.success')); return redirect()->to("hardware")->with('success', trans('admin/hardware/message.delete.success'));
// no values given, nothing to update // no values given, nothing to update
@ -1282,10 +1247,8 @@ class AssetsController extends Controller
$asset->next_audit_date = $request->input('next_audit_date'); $asset->next_audit_date = $request->input('next_audit_date');
if ($asset->save()) { if ($asset->save()) {
$asset->logAudit(request('note'),request('location_id')); $asset->logAudit(request('note'), request('location_id'));
return redirect()->to("hardware")->with('success', trans('admin/hardware/message.audit.success')); return redirect()->to("hardware")->with('success', trans('admin/hardware/message.audit.success'));
} }
} }
} }

View file

@ -357,12 +357,12 @@ class LicensesController extends Controller
public function getCheckin($seatId = null, $backTo = null) public function getCheckin($seatId = null, $backTo = null)
{ {
// Check if the asset exists // Check if the asset exists
if (is_null($licenseseat = LicenseSeat::find($seatId))) { if (is_null($licenseSeat = LicenseSeat::find($seatId))) {
// Redirect to the asset management page with error // Redirect to the asset management page with error
return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found'));
} }
$this->authorize('checkin', $licenseseat); $this->authorize('checkin', $licenseSeat);
return view('licenses/checkin', compact('licenseseat'))->with('backto', $backTo); return view('licenses/checkin', compact('licenseSeat'))->with('backto', $backTo);
} }
@ -519,13 +519,16 @@ class LicensesController extends Controller
//Log the upload to the log //Log the upload to the log
$license->logUpload($filename, e($request->input('notes'))); $license->logUpload($filename, e($request->input('notes')));
} }
// This being called from a modal seems to confuse redirect()->back()
// It thinks we should go to the dashboard. As this is only used
// from the modal at present, hardcode the redirect. Longterm
// maybe we evaluate something else.
if ($upload_success) { if ($upload_success) {
return redirect()->back()->with('success', trans('admin/licenses/message.upload.success')); return redirect()->route('licenses.show', $license->id)->with('success', trans('admin/licenses/message.upload.success'));
} }
return redirect()->back()->with('error', trans('admin/licenses/message.upload.error')); return redirect()->route('licenses.show', $license->id)->with('error', trans('admin/licenses/message.upload.error'));
} }
return redirect()->back()->with('error', trans('admin/licenses/message.upload.nofiles')); return redirect()->route('licenses.show', $license->id)->with('error', trans('admin/licenses/message.upload.nofiles'));
} }
// Prepare the error message // Prepare the error message
$error = trans('admin/licenses/message.does_not_exist', compact('id')); $error = trans('admin/licenses/message.does_not_exist', compact('id'));

View file

@ -87,9 +87,8 @@ class SuppliersController extends Controller
$supplier->image = $file_name; $supplier->image = $file_name;
} }
// Was it created?
if ($supplier->save()) { if ($supplier->save()) {
// Redirect to the new supplier page // Redirect to the nw supplier page
return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.create.success')); return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.create.success'));
} }
return redirect()->back()->withInput()->withErrors($supplier->getErrors()); return redirect()->back()->withInput()->withErrors($supplier->getErrors());

View file

@ -29,7 +29,6 @@ class ImportsTransformer
'header_row' => $import->header_row, 'header_row' => $import->header_row,
'first_row' => $import->first_row, 'first_row' => $import->first_row,
'field_map' => $import->field_map, 'field_map' => $import->field_map,
'process_url'=> route('api.imports.importFile', $import->id),
]; ];
return $array; return $array;

View file

@ -38,8 +38,8 @@ class LocationsTransformer
'state' => e($location->state), 'state' => e($location->state),
'country' => e($location->country), 'country' => e($location->country),
'zip' => e($location->zip), 'zip' => e($location->zip),
'assets_checkedout' => $location->assets()->count(), 'assets_checkedout' => $location->location_assets_count,
'assets_default' => $location->assignedassets()->count(), 'assets_default' => $location->assigned_assets_count,
'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'), 'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'),

View file

@ -15,18 +15,18 @@ class Supplier extends SnipeModel
protected $rules = array( protected $rules = array(
'name' => 'required|min:3|max:255|unique_undeleted', 'name' => 'required|min:3|max:255|unique_undeleted',
'address' => 'min:3|max:50', 'address' => 'max:50|nullable',
'address2' => 'min:2|max:50', 'address2' => 'max:50|nullable',
'city' => 'min:3|max:255', 'city' => 'max:255|nullable',
'state' => 'min:0|max:32', 'state' => 'max:32|nullable',
'country' => 'min:0|max:2', 'country' => 'max:3|nullable',
'fax' => 'min:7|max:35', 'fax' => 'min:7|max:35|nullable',
'phone' => 'min:7|max:35', 'phone' => 'min:7|max:35|nullable',
'contact' => 'min:0|max:100', 'contact' => 'max:100|nullable',
'notes' => 'min:0|max:255', 'notes' => 'max:255|nullable',
'email' => 'email|min:5|max:150', 'email' => 'email|max:150|nullable',
'zip' => 'min:0|max:10', 'zip' => 'max:10|nullable',
'url' => 'min:3|max:250', 'url' => 'sometimes|nullable|string|max:250',
); );
/** /**

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -3,6 +3,10 @@
"/css/AdminLTE.css": "/css/AdminLTE.css", "/css/AdminLTE.css": "/css/AdminLTE.css",
"/css/app.css": "/css/app.css", "/css/app.css": "/css/app.css",
"/css/overrides.css": "/css/overrides.css", "/css/overrides.css": "/css/overrides.css",
"/vue.js.map": "/vue.js.map",
"/css/AdminLTE.css.map": "/css/AdminLTE.css.map",
"/css/app.css.map": "/css/app.css.map",
"/css/overrides.css.map": "/css/overrides.css.map",
"/public/css/dist/all.css": "/public/css/dist/all.css", "/public/css/dist/all.css": "/public/css/dist/all.css",
"/public/js/dist/all.js": "/public/js/dist/all.js" "/public/js/dist/all.js": "/public/js/dist/all.js"
} }

52911
build/vue.js

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -11,6 +11,8 @@
"doctrine/cache": "^1.6", "doctrine/cache": "^1.6",
"doctrine/common": "^2.7", "doctrine/common": "^2.7",
"doctrine/dbal": "v2.5.13", "doctrine/dbal": "v2.5.13",
"doctrine/inflector": "1.1.*",
"doctrine/instantiator": "1.0.*",
"erusev/parsedown": "^1.6", "erusev/parsedown": "^1.6",
"fideloper/proxy": "^3.1", "fideloper/proxy": "^3.1",
"intervention/image": "^2.3", "intervention/image": "^2.3",
@ -27,10 +29,11 @@
"schuppo/password-strength": "~1.5", "schuppo/password-strength": "~1.5",
"spatie/laravel-backup": "^3.0.0", "spatie/laravel-backup": "^3.0.0",
"tecnickcom/tc-lib-barcode": "^1.15", "tecnickcom/tc-lib-barcode": "^1.15",
"tightenco/ziggy": "^0.4.1",
"unicodeveloper/laravel-password": "^1.0", "unicodeveloper/laravel-password": "^1.0",
"watson/validating": "^3.0", "watson/validating": "^3.0",
"doctrine/instantiator": "1.0.*", "phpspec/prophecy": "1.6.2",
"doctrine/inflector": "1.2.*" "phpdocumentor/reflection-docblock": "3.2.2"
}, },
"require-dev": { "require-dev": {
"fzaninotto/faker": "~1.4", "fzaninotto/faker": "~1.4",

1064
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -255,7 +255,7 @@ return [
Laravel\Tinker\TinkerServiceProvider::class, Laravel\Tinker\TinkerServiceProvider::class,
Unicodeveloper\DumbPassword\DumbPasswordServiceProvider::class, Unicodeveloper\DumbPassword\DumbPasswordServiceProvider::class,
Schuppo\PasswordStrength\PasswordStrengthServiceProvider::class, Schuppo\PasswordStrength\PasswordStrengthServiceProvider::class,
Tightenco\Ziggy\ZiggyServiceProvider::class, // Laravel routes in vue
/* /*
* Application Service Providers... * Application Service Providers...

View file

@ -19,12 +19,14 @@ $factory->defineAs(Actionlog::class, 'asset-checkout', function (Faker\Generator
$company = factory(App\Models\Company::class)->create(); $company = factory(App\Models\Company::class)->create();
$user = factory(App\Models\User::class)->create(['company_id' => $company->id]); $user = factory(App\Models\User::class)->create(['company_id' => $company->id]);
$target = factory(App\Models\User::class)->create(['company_id' => $company->id]); $target = factory(App\Models\User::class)->create(['company_id' => $company->id]);
// $item = factory(App\Models\Asset::class)->create(['company_id' => $company->id]); do {
$item = factory(App\Models\Asset::class)->create(['company_id' => $company->id]);
} while (!$item->isValid());
// dd($item); // dd($item);
return [ return [
'user_id' => $user->id, 'user_id' => $user->id,
'action_type' => 'checkout', 'action_type' => 'checkout',
'item_id' => factory(App\Models\Asset::class)->create(['company_id' => $company->id])->id, 'item_id' => $item->id,
'item_type' => App\Models\Asset::class, 'item_type' => App\Models\Asset::class,
'target_id' => $target->id, 'target_id' => $target->id,
'target_type' => get_class($target), 'target_type' => get_class($target),

Binary file not shown.

BIN
public/js/dist/all.js vendored

Binary file not shown.

View file

@ -67,7 +67,7 @@ tr {
<script> <script>
export default { export default {
props: ['file', 'customFieldUrl'], props: ['file', 'customFields'],
data() { data() {
return { return {
activeFile: this.file, activeFile: this.file,
@ -130,14 +130,13 @@ tr {
{id: 'jobtitle', text: 'Job Title' }, {id: 'jobtitle', text: 'Job Title' },
{id: 'phone_number', text: 'Phone Number' }, {id: 'phone_number', text: 'Phone Number' },
], ],
customFields: [], customFields: this.customFields,
}, },
columnMappings: this.file.field_map || {}, columnMappings: this.file.field_map || {},
activeColumn: null, activeColumn: null,
} }
}, },
created() { created() {
this.fetchCustomFields();
window.eventHub.$on('showDetails', this.toggleExtendedDisplay) window.eventHub.$on('showDetails', this.toggleExtendedDisplay)
this.populateSelect2ActiveItems(); this.populateSelect2ActiveItems();
}, },
@ -155,21 +154,9 @@ tr {
} }
}, },
methods: { methods: {
fetchCustomFields() {
this.$http.get(this.customFieldUrl)
.then( ({data}) => {
data = data.rows;
data.forEach((item) => {
this.columnOptions.customFields.push({
'id': item.db_column_name,
'text': item.name,
})
})
});
},
postSave() { postSave() {
this.statusText = "Processing..."; this.statusText = "Processing...";
this.$http.post(this.file.process_url, { this.$http.post(route('api.imports.importFile', this.file.id), {
'import-update': this.options.update, 'import-update': this.options.update,
'import-type': this.options.importType, 'import-type': this.options.importType,
'column-mappings': this.columnMappings 'column-mappings': this.columnMappings

View file

@ -11,8 +11,6 @@ th {
<script> <script>
require('blueimp-file-upload'); require('blueimp-file-upload');
export default { export default {
props: ['importUrl'],
/* /*
* The component's data. * The component's data.
*/ */
@ -32,13 +30,15 @@ th {
currentPercent: "0", currentPercent: "0",
statusText: '', statusText: '',
visible: false visible: false
} },
customFields: [],
}; };
}, },
mounted() { mounted() {
window.eventHub.$on('importErrors', this.updateImportErrors); window.eventHub.$on('importErrors', this.updateImportErrors);
this.fetchFiles(); this.fetchFiles();
this.fetchCustomFields();
let vm = this; let vm = this;
$('#fileupload').fileupload({ $('#fileupload').fileupload({
dataType: 'json', dataType: 'json',
@ -71,7 +71,7 @@ th {
methods: { methods: {
fetchFiles() { fetchFiles() {
this.$http.get(this.importUrl) this.$http.get(route('api.imports.index'))
.then( ({data}) => this.files = data, // Success .then( ({data}) => this.files = data, // Success
//Fail //Fail
(response) => { (response) => {
@ -80,8 +80,20 @@ th {
this.alert.message="Something went wrong fetching files..."; this.alert.message="Something went wrong fetching files...";
}); });
}, },
fetchCustomFields() {
this.$http.get(route('api.customfields.index'))
.then( ({data}) => {
data = data.rows;
data.forEach((item) => {
this.customFields.push({
'id': item.db_column_name,
'text': item.name,
})
})
});
},
deleteFile(file, key) { deleteFile(file, key) {
this.$http.delete(this.importUrl+"/"+file.id) this.$http.delete(route('api.imports.destroy', file.id))
.then((response) => this.files.splice(key, 1), // Success, remove file from array. .then((response) => this.files.splice(key, 1), // Success, remove file from array.
(response) => {// Fail (response) => {// Fail
this.alert.type="danger"; this.alert.type="danger";
@ -98,7 +110,7 @@ th {
}, },
updateImportErrors(errors) { updateImportErrors(errors) {
this.importErrors = errors; this.importErrors = errors;
} },
}, },
computed: { computed: {

View file

@ -56,6 +56,7 @@
<script> <script>
export default { export default {
props: ['clientsUrl', 'tokensUrl'],
/* /*
* The component's data. * The component's data.
*/ */
@ -91,7 +92,7 @@
* Get all of the authorized tokens for the user. * Get all of the authorized tokens for the user.
*/ */
getTokens() { getTokens() {
this.$http.get('/oauth/tokens') this.$http.get(this.tokensUrl)
.then(response => { .then(response => {
this.tokens = response.data; this.tokens = response.data;
}); });
@ -101,7 +102,7 @@
* Revoke the given token. * Revoke the given token.
*/ */
revoke(token) { revoke(token) {
this.$http.delete('/oauth/tokens/' + token.id) this.$http.delete(this.tokensUrl +'/'+ token.id)
.then(response => { .then(response => {
this.getTokens(); this.getTokens();
}); });

View file

@ -219,6 +219,7 @@
/* /*
* The component's data. * The component's data.
*/ */
props: ['clientsUrl'],
data() { data() {
return { return {
clients: [], clients: [],
@ -271,7 +272,7 @@
* Get all of the OAuth clients for the user. * Get all of the OAuth clients for the user.
*/ */
getClients() { getClients() {
this.$http.get('/oauth/clients') this.$http.get(this.clientsUrl)
.then(response => { .then(response => {
this.clients = response.data; this.clients = response.data;
}); });
@ -289,7 +290,7 @@
*/ */
store() { store() {
this.persistClient( this.persistClient(
'post', '/oauth/clients', 'post', this.clientsUrl,
this.createForm, '#modal-create-client' this.createForm, '#modal-create-client'
); );
}, },
@ -310,7 +311,7 @@
*/ */
update() { update() {
this.persistClient( this.persistClient(
'put', '/oauth/clients/' + this.editForm.id, 'put', this.clientsUrl + '/' + this.editForm.id,
this.editForm, '#modal-edit-client' this.editForm, '#modal-edit-client'
); );
}, },
@ -319,8 +320,10 @@
* Persist the client to storage using the given form. * Persist the client to storage using the given form.
*/ */
persistClient(method, uri, form, modal) { persistClient(method, uri, form, modal) {
console.log('persisting');
form.errors = []; form.errors = [];
console.log('method: ' + method);
this.$http[method](uri, form) this.$http[method](uri, form)
.then(response => { .then(response => {
this.getClients(); this.getClients();
@ -344,7 +347,7 @@
* Destroy the given client. * Destroy the given client.
*/ */
destroy(client) { destroy(client) {
this.$http.delete('/oauth/clients/' + client.id) this.$http.delete(this.clientsUrl +'/' + client.id)
.then(response => { .then(response => {
this.getClients(); this.getClients();
}); });

View file

@ -160,6 +160,7 @@
<script> <script>
export default { export default {
props: ['tokenUrl', 'scopesUrl'],
/* /*
* The component's data. * The component's data.
*/ */
@ -209,7 +210,7 @@
* Get all of the personal access tokens for the user. * Get all of the personal access tokens for the user.
*/ */
getTokens() { getTokens() {
this.$http.get('/oauth/personal-access-tokens') this.$http.get(this.tokenUrl)
.then(response => { .then(response => {
this.tokens = response.data; this.tokens = response.data;
}); });
@ -219,7 +220,7 @@
* Get all of the available scopes. * Get all of the available scopes.
*/ */
getScopes() { getScopes() {
this.$http.get('/oauth/scopes') this.$http.get(this.scopesUrl)
.then(response => { .then(response => {
this.scopes = response.data; this.scopes = response.data;
}); });
@ -240,7 +241,7 @@
this.form.errors = []; this.form.errors = [];
this.$http.post('/oauth/personal-access-tokens', this.form) this.$http.post(this.tokenUrl, this.form)
.then(response => { .then(response => {
this.form.name = ''; this.form.name = '';
this.form.scopes = []; this.form.scopes = [];
@ -293,7 +294,7 @@
* Revoke the given token. * Revoke the given token.
*/ */
revoke(token) { revoke(token) {
this.$http.delete('/oauth/personal-access-tokens/' + token.id) this.$http.delete(this.tokenUrl +'/'+ token.id)
.then(response => { .then(response => {
this.getTokens(); this.getTokens();
}); });

View file

@ -9,7 +9,10 @@
{{-- Page content --}} {{-- Page content --}}
@section('content') @section('content')
@if (!config('app.lock_passwords')) @if (!config('app.lock_passwords'))
<passport-personal-access-tokens></passport-personal-access-tokens> <passport-personal-access-tokens
token-url="{{ url('oauth/personal-access-tokens') }}"
scopes-url="{{ url('oauth/scopes') }}">
</passport-personal-access-tokens>
@else @else
<p class="help-block">{{ trans('general.feature_disabled') }}</p> <p class="help-block">{{ trans('general.feature_disabled') }}</p>
@endif @endif

View file

@ -4,7 +4,7 @@
<p>{{ trans('mail.a_user_canceled') }} <a href="{{ url('/') }}"> {{ $snipeSettings->site_name }}</a>. </p> <p>{{ trans('mail.a_user_canceled') }} <a href="{{ url('/') }}"> {{ $snipeSettings->site_name }}</a>. </p>
<p>{{ trans('mail.user') }} <a href="{{ url('/') }}/admin/users/{{ $user_id }}/view">{{ $requested_by }}</a><br> <p>{{ trans('mail.user') }} <a href="{{ route('users.show', $user_id) }}">{{ $requested_by }}</a><br>
{{ trans('mail.item') }} <a href="{{ $item_url }}">{{ $item_name }}</a> ({{ $item_type }}) <br> {{ trans('mail.item') }} <a href="{{ $item_url }}">{{ $item_name }}</a> ({{ $item_type }}) <br>
{{ trans('mail.canceled') }} {{ $requested_date }} {{ trans('mail.canceled') }} {{ $requested_date }}
</p> </p>

View file

@ -4,7 +4,7 @@
<p>{{ trans('mail.a_user_requested') }} <a href="{{ url('/') }}"> {{ $snipeSettings->site_name }}</a>. </p> <p>{{ trans('mail.a_user_requested') }} <a href="{{ url('/') }}"> {{ $snipeSettings->site_name }}</a>. </p>
<p>{{ trans('mail.user') }} <a href="{{ url('/') }}/admin/users/{{ $user_id }}/view">{{ $requested_by }}</a><br> <p>{{ trans('mail.user') }} <a href="{{ route('users.show', $user_id) }}">{{ $requested_by }}</a><br>
{{ trans('mail.item') }} <a href="{{ $item_url }}">{{ $item_name }}</a> ({{ $item_type }}) <br> {{ trans('mail.item') }} <a href="{{ $item_url }}">{{ $item_name }}</a> ({{ $item_type }}) <br>
{{ trans('mail.requested') }} {{ $requested_date }} {{ trans('mail.requested') }} {{ $requested_date }}
@if ($item_quantity > 1) @if ($item_quantity > 1)

View file

@ -15,7 +15,7 @@
@for($i=0; $count > $i; $i++) @for($i=0; $count > $i; $i++)
<tr> <tr>
<td> <td>
<a href="{{ url('/') }}/admin/{{ $data[$i]['type'] }}/{{ $data[$i]['id'] }}/view">{{ $data[$i]['name'] }}</a> <a href="{{ route($data[$i]['type'].'.show', $data[$i]['id']) }}">{{ $data[$i]['name'] }}</a>
</td> </td>
<td>{{ $data[$i]['type'] }}</td> <td>{{ $data[$i]['type'] }}</td>
<td>{{ $data[$i]['remaining'] }}</td> <td>{{ $data[$i]['remaining'] }}</td>

View file

@ -16,7 +16,7 @@
{{-- Page content --}} {{-- Page content --}}
@section('content') @section('content')
<div id="app"> <div id="app">
<importer inline-template import-url="{{route('api.imports.index')}}" v-cloak> <importer inline-template v-cloak>
<div class="row"> <div class="row">
<alert v-show="alert.visible" :alert-type="alert.type" v-on:hide="alert.visible = false">@{{ alert.message }}</alert> <alert v-show="alert.visible" :alert-type="alert.type" v-on:hide="alert.visible = false">@{{ alert.message }}</alert>
<errors :errors="importErrors"></errors> <errors :errors="importErrors"></errors>
@ -65,7 +65,7 @@
<import-file <import-file
:key="currentFile.id" :key="currentFile.id"
:file="currentFile" :file="currentFile"
customFieldUrl="{{route('api.customfields.index')}}" :custom-fields="customFields"
@alert="updateAlert(alert)"> @alert="updateAlert(alert)">
</import-file> </import-file>
</template> </template>

View file

@ -27,13 +27,11 @@
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<script nonce="{{ csrf_token() }}"> <script nonce="{{ csrf_token() }}">
window.Laravel = { csrfToken: '{{ csrf_token() }}' }; window.Laravel = { csrfToken: '{{ csrf_token() }}' };
</script> </script>
<style nonce="{{ csrf_token() }}">
<style nonce="{{ csrf_token() }}">
@if ($snipeSettings) @if ($snipeSettings)
@if ($snipeSettings->header_color) @if ($snipeSettings->header_color)
.main-header .navbar, .main-header .logo { .main-header .navbar, .main-header .logo {
@ -68,16 +66,15 @@
} }
</style> </style>
<script nonce="{{ csrf_token() }}"> <script nonce="{{ csrf_token() }}">
window.snipeit = { window.snipeit = {
settings: { settings: {
"per_page": {{ $snipeSettings->per_page }} "per_page": {{ $snipeSettings->per_page }}
} }
}; };
</script> </script>
<!-- Add laravel route sinto javascript Primarily useful for vue.-->
@routes
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]> <!--[if lt IE 9]>

View file

@ -6,28 +6,31 @@
@parent @parent
@stop @stop
@section('header_right') @section('header_right')
<a href="{{ URL::previous() }}" class="btn btn-primary pull-right">{{ trans('general.back') }}</a> <a href="{{ URL::previous() }}" class="btn btn-primary pull-right">
{{ trans('general.back') }}</a>
@stop @stop
{{-- Page content --}} {{-- Page content --}}
@section('content') @section('content')
<div class="row form-wrapper"> <div class="row">
<!-- left column --> <!-- left column -->
<div class="col-md-10 column"> <div class="col-md-7">
<form class="form-horizontal" method="post" action="{{ route('licenses.checkin.save', $licenseSeat->id) }}" autocomplete="off">
{{csrf_field()}}
@if ($backto=='user') <div class="box box-default">
<form class="form-horizontal" method="post" action="{{ route('licenses.checkin', array('licenseeat_id'=> $licenseseat->id, 'backto'=>'user')) }}" autocomplete="off"> <div class="box-header with-border">
@else <h3 class="box-title"> {{ $licenseSeat->license->name }}</h3>
<form class="form-horizontal" method="post" action="{{ route('licenses.checkin', $licenseseat->id) }}" autocomplete="off"> </div>
@endif <div class="box-body">
{{csrf_field()}}
<!-- Asset name --> <!-- license name -->
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label> <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.name') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<p class="form-control-static">{{ $licenseseat->license->name }}</p> <p class="form-control-static">{{ $licenseSeat->license->name }}</p>
</div> </div>
</div> </div>
@ -35,7 +38,7 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">{{ trans('admin/hardware/form.serial') }}</label> <label class="col-sm-2 control-label">{{ trans('admin/hardware/form.serial') }}</label>
<div class="col-md-6"> <div class="col-md-6">
<p class="form-control-static">{{ $licenseseat->license->serial }}</p> <p class="form-control-static">{{ $licenseSeat->license->serial }}</p>
</div> </div>
</div> </div>
@ -43,20 +46,18 @@
<div class="form-group {{ $errors->has('note') ? 'error' : '' }}"> <div class="form-group {{ $errors->has('note') ? 'error' : '' }}">
<label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label> <label for="note" class="col-md-2 control-label">{{ trans('admin/hardware/form.notes') }}</label>
<div class="col-md-7"> <div class="col-md-7">
<textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $licenseseat->note) }}</textarea> <textarea class="col-md-6 form-control" id="note" name="note">{{ Input::old('note', $licenseSeat->note) }}</textarea>
{!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!} {!! $errors->first('note', '<span class="alert-msg"><i class="fa fa-times"></i> :message</span>') !!}
</div> </div>
</div> </div>
<!-- Form actions --> <div class="box-footer">
<div class="form-group"> <a class="btn btn-link" href="{{ route('licenses.index') }}">{{ trans('button.cancel') }}</a>
<label class="col-md-2 control-label"></label> <button type="submit" class="btn btn-success pull-right"><i class="fa fa-check icon-white"></i> {{ trans('general.checkin') }}</button>
<div class="col-md-7"> </div>
<a class="btn btn-link" href="{{ route('licenses.index') }}">{{ trans('button.cancel') }}</a> </div> <!-- /.box-->
<button type="submit" class="btn btn-success"><i class="fa fa-check icon-white"></i> {{ trans('general.checkin') }}</button> </form>
</div> </div> <!-- /.col-md-7-->
</div> </div>
</form>
</div> <!-- .col-md-10-->
</div>
@stop @stop

View file

@ -14,8 +14,8 @@
@section('content') @section('content')
@if (!config('app.lock_passwords')) @if (!config('app.lock_passwords'))
<div id="app"> <div id="app">
<passport-clients></passport-clients> <passport-clients clients-url="{{ url('oauth/clients') }}"></passport-clients>
<passport-authorized-clients></passport-authorized-clients> <passport-authorized-clients clients-url="{{ url('oauth/clients') }}" tokens-url="{{ url('oauth/tokens') }}"></passport-authorized-clients>
</div> </div>
@else @else
<p class="help-block">{{ trans('general.feature_disabled') }}</p> <p class="help-block">{{ trans('general.feature_disabled') }}</p>

View file

@ -32,7 +32,7 @@
<div class="panel box box-default"> <div class="panel box box-default">
<div class="box-header with-border"> <div class="box-header with-border">
<h4 class="box-title"> <h4 class="box-title">
<i class="fa fa-lock"></i> Security <i class="fa fa-tags"></i> Labels
</h4> </h4>
</div> </div>
<div class="box-body"> <div class="box-body">

View file

@ -25,7 +25,7 @@ Route::group([ 'prefix' => 'licenses', 'middleware' => ['auth'] ], function () {
]); ]);
Route::post('{licenseId}/checkin/{backto?}', [ Route::post('{licenseId}/checkin/{backto?}', [
'as' => 'licenses.checkin', 'as' => 'licenses.checkin.save',
'uses' => 'LicensesController@postCheckin' 'uses' => 'LicensesController@postCheckin'
]); ]);

View file

@ -40,11 +40,11 @@ mkdir $tmp
# Debian/Ubuntu friendly f(x)s # Debian/Ubuntu friendly f(x)s
progress () { progress () {
while kill -0 "$pid" > /dev/null 2>&1 while kill -0 "$pid" > /dev/null 2>&1
do do
for i in "${spin[@]}" for i in "${spin[@]}"
do do
if [ -e /proc/"$pid" ]; then if [ -e /proc/"$pid" ]; then
echo -ne "\b$i" echo -ne "\b$i"
sleep .1 sleep .1
else else
@ -54,60 +54,61 @@ progress () {
done done
} }
#Used for Debian and Ubuntu
vhenvfile () { vhenvfile () {
find /etc/apache2/mods-enabled -maxdepth 1 -name 'rewrite.load' >/dev/null 2>&1 find /etc/apache2/mods-enabled -maxdepth 1 -name 'rewrite.load' >/dev/null 2>&1
apachefile=/etc/apache2/sites-available/$name.conf apachefile=/etc/apache2/sites-available/$name.conf
echo "* Create Virtual host for apache." echo "* Create Virtual host for apache."
{ {
echo "<VirtualHost *:80>" echo "<VirtualHost *:80>"
echo "ServerAdmin webmaster@localhost" echo "ServerAdmin webmaster@localhost"
echo "<Directory $webdir/$name/public>" echo "<Directory $webdir/$name/public>"
echo " Require all granted" echo " Require all granted"
echo " AllowOverride All" echo " AllowOverride All"
echo " </Directory>" echo " </Directory>"
echo " DocumentRoot $webdir/$name/public" echo " DocumentRoot $webdir/$name/public"
echo " ServerName $fqdn" echo " ServerName $fqdn"
echo " ErrorLog /var/log/apache2/snipeIT.error.log" echo " ErrorLog /var/log/apache2/snipeIT.error.log"
echo " CustomLog /var/log/apache2/access.log combined" echo " CustomLog /var/log/apache2/access.log combined"
echo "</VirtualHost>" echo "</VirtualHost>"
} >> $apachefile } >> $apachefile
echo >> $hosts "127.0.0.1 $hostname $fqdn" echo >> $hosts "127.0.0.1 $hostname $fqdn"
log "a2ensite $name.conf" log "a2ensite $name.conf"
cat > "$webdir/$name/.env" <<-EOF cp $webdir/$name/.env.example $webdir/$name/.env
#Created By Snipe-it Installer
APP_TIMEZONE=$(cat /etc/timezone) sed -i '1 i\#Created By Snipe-it Installer' $webdir/$name/.env
DB_HOST=localhost sed -i 's,^\(APP_TIMEZONE=\).*,\1'$(cat /etc/timezone)',' $webdir/$name/.env
DB_DATABASE=snipeit sed -i 's,^\(DB_HOST=\).*,\1'localhost',' $webdir/$name/.env
DB_USERNAME=snipeit sed -i 's,^\(DB_DATABASE=\).*,\1'snipeit',' $webdir/$name/.env
DB_PASSWORD=$mysqluserpw sed -i 's,^\(DB_USERNAME=\).*,\1'snipeit',' $webdir/$name/.env
APP_URL=http://$fqdn sed -i 's,^\(DB_PASSWORD=\).*,\1'$mysqluserpw',' $webdir/$name/.env
APP_KEY=$random32 sed -i 's,^\(APP_URL=\).*,\1'http://$fqdn',' $webdir/$name/.env
EOF sed -i 's,^\(APP_KEY=\).*,\1'$$random32',' $webdir/$name/.env
} }
perms () { perms () {
chmod_dirs=( "$webdir/$name/storage" ) chmod_dirs=( "$webdir/$name/storage" )
chmod_dirs+=( "$webdir/$name/storage/private_uploads" ) chmod_dirs+=( "$webdir/$name/storage/private_uploads" )
chmod_dirs+=( "$webdir/$name/public/uploads" ) chmod_dirs+=( "$webdir/$name/public/uploads" )
#Change permissions on directories #Change permissions on directories
for chmod_dir in "${chmod_dirs[@]}" for chmod_dir in "${chmod_dirs[@]}"
do do
chmod -R 755 "$chmod_dir" chmod -R 755 "$chmod_dir"
done done
} }
log () { log () {
eval "$@" |& tee -a /var/log/snipeit-install.log >/dev/null 2>&1 eval "$@" |& tee -a /var/log/snipeit-install.log >/dev/null 2>&1
} }
#CentOS Friendly f(x)s #CentOS Friendly f(x)s
function isinstalled { function isinstalled {
if yum list installed "$@" >/dev/null 2>&1; then if yum list installed "$@" >/dev/null 2>&1; then
true true
else else
false false
fi fi
} }
if [ -f /etc/lsb-release ]; then if [ -f /etc/lsb-release ]; then
@ -115,26 +116,26 @@ if [ -f /etc/lsb-release ]; then
version="$(lsb_release -s -r)" version="$(lsb_release -s -r)"
codename="$(lsb_release -c -s)" codename="$(lsb_release -c -s)"
elif [ -f /etc/os-release ]; then elif [ -f /etc/os-release ]; then
distro="$(. /etc/os-release && echo $ID)" distro="$(. /etc/os-release && echo $ID)"
version="$(. /etc/os-release && echo $VERSION_ID)" version="$(. /etc/os-release && echo $VERSION_ID)"
#Order is important here. If /etc/os-release and /etc/centos-release exist, we're on centos 7. #Order is important here. If /etc/os-release and /etc/centos-release exist, we're on centos 7.
#If only /etc/centos-release exist, we're on centos6(or earlier). Centos-release is less parsable, #If only /etc/centos-release exist, we're on centos6(or earlier). Centos-release is less parsable,
#so lets assume that it's version 6 (Plus, who would be doing a new install of anything on centos5 at this point..) #so lets assume that it's version 6 (Plus, who would be doing a new install of anything on centos5 at this point..)
elif [ -f /etc/centos-release ]; then elif [ -f /etc/centos-release ]; then
distro="Centos" distro="Centos"
version="6" version="6"
else else
distro="unsupported" distro="unsupported"
fi fi
echo " echo "
_____ _ __________ _____ _ __________
/ ___/____ (_)___ ___ / _/_ __/ / ___/____ (_)___ ___ / _/_ __/
\__ \/ __ \/ / __ \/ _ \______ / / / / \__ \/ __ \/ / __ \/ _ \______ / / / /
___/ / / / / / /_/ / __/_____// / / / ___/ / / / / / /_/ / __/_____// / / /
/____/_/ /_/_/ .___/\___/ /___/ /_/ /____/_/ /_/_/ .___/\___/ /___/ /_/
/_/ /_/
" "
echo "" echo ""
@ -143,22 +144,22 @@ echo " Welcome to Snipe-IT Inventory Installer for Centos, Debian and Ubuntu!"
echo "" echo ""
shopt -s nocasematch shopt -s nocasematch
case $distro in case $distro in
*Ubuntu*) *Ubuntu*)
echo " The installer has detected Ubuntu version $version as the OS." echo " The installer has detected Ubuntu version $version as the OS."
distro=ubuntu distro=ubuntu
;; ;;
*Debian*) *Debian*)
echo " The installer has detected Debian version $version as the OS." echo " The installer has detected Debian version $version as the OS."
distro=debian distro=debian
;; ;;
*centos*|*redhat*|*ol*|*rhel*) *centos*|*redhat*|*ol*|*rhel*)
echo " The installer has detected $distro version $version as the OS." echo " The installer has detected $distro version $version as the OS."
distro=centos distro=centos
;; ;;
*) *)
echo " The installer was unable to determine your OS. Exiting for safety." echo " The installer was unable to determine your OS. Exiting for safety."
exit exit
;; ;;
esac esac
shopt -u nocasematch shopt -u nocasematch
#Get your FQDN. #Get your FQDN.
@ -166,29 +167,29 @@ shopt -u nocasematch
echo -n " Q. What is the FQDN of your server? ($fqdn): " echo -n " Q. What is the FQDN of your server? ($fqdn): "
read fqdn read fqdn
if [ -z "$fqdn" ]; then if [ -z "$fqdn" ]; then
fqdn="$(hostname --fqdn)" fqdn="$(hostname --fqdn)"
fi fi
echo " Setting to $fqdn" echo " Setting to $fqdn"
echo "" echo ""
#Do you want to set your own passwords, or have me generate random ones? #Do you want to set your own passwords, or have me generate random ones?
until [[ $ans == "yes" ]] || [[ $ans == "no" ]]; do until [[ $ans == "yes" ]] || [[ $ans == "no" ]]; do
echo -n " Q. Do you want me to automatically create the snipe database user password? (y/n) " echo -n " Q. Do you want to automatically create the database user password? (y/n) "
read setpw read setpw
case $setpw in case $setpw in
[yY] | [yY][Ee][Ss] ) [yY] | [yY][Ee][Ss] )
mysqluserpw="$(echo `< /dev/urandom tr -dc _A-Za-z-0-9 | head -c16`)" mysqluserpw="$(echo `< /dev/urandom tr -dc _A-Za-z-0-9 | head -c16`)"
ans="yes" ans="yes"
;; ;;
[nN] | [n|N][O|o] ) [nN] | [n|N][O|o] )
echo -n " Q. What do you want your snipeit user password to be?" echo -n " Q. What do you want your snipeit user password to be?"
read -s mysqluserpw read -s mysqluserpw
echo "" echo ""
ans="no" ans="no"
;; ;;
*) echo " Invalid answer. Please type y or n" *) echo " Invalid answer. Please type y or n"
;; ;;
esac esac
done done
@ -207,346 +208,349 @@ chmod 700 $dbsetup
## TODO: Progress tracker on each step ## TODO: Progress tracker on each step
case $distro in case $distro in
debian) debian)
##################################### Install for Debian ############################################## ##################################### Install for Debian ##############################################
#Update/upgrade Debian/Ubuntu repositories, get the latest version of git. #Update/upgrade Debian/Ubuntu repositories, get the latest version of git.
#Git clone snipeit, create vhost, edit hosts file, create .env file, mysql install #Git clone snipeit, create vhost, edit hosts file, create .env file, mysql install
#composer install, set permissions, restart apache. #composer install, set permissions, restart apache.
#BTW, Debian, I swear, you're such a pain. #BTW, Debian, I swear, you're such a pain.
webdir=/var/www webdir=/var/www
echo -e "\n* Updating Debian packages in the background... ${spin[0]}\n" echo -e "\n* Updating Debian packages in the background... ${spin[0]}\n"
apt-get update >> /var/log/snipeit-install.log & pid=$! 2>&1 apt-get update >> /var/log/snipeit-install.log & pid=$! 2>&1
wait wait
apt-get upgrade >> /var/log/snipeit-install.log & pid=$! 2>&1 apt-get upgrade >> /var/log/snipeit-install.log & pid=$! 2>&1
wait wait
echo -e "\n* Installing packages... ${spin[0]}\n" echo -e "\n* Installing packages... ${spin[0]}\n"
echo -e "\n* Going to suppress more messages that you don't need to worry about. Please wait... ${spin[0]}" echo -e "\n* Going to suppress more messages that you don't need to worry about. Please wait... ${spin[0]}"
DEBIAN_FRONTEND=noninteractive apt-get -y install mariadb-server mariadb-client apache2 git unzip php5 php5-mcrypt php5-curl php5-mysql php5-gd php5-ldap libapache2-mod-php5 curl >> /var/log/snipeit-install.log & pid=$! 2>&1 DEBIAN_FRONTEND=noninteractive apt-get -y install mariadb-server mariadb-client apache2 git unzip php5 php5-mcrypt php5-curl php5-mysql php5-gd php5-ldap libapache2-mod-php5 curl >> /var/log/snipeit-install.log & pid=$! 2>&1
progress progress
wait wait
echo -e "\n* Cloning Snipeit, extracting to $webdir/$name..." echo -e "\n* Cloning Snipeit, extracting to $webdir/$name..."
git clone https://github.com/snipe/snipe-it $webdir/$name >> /var/log/snipeit-install.log & pid=$! 2>&1 git clone https://github.com/snipe/snipe-it $webdir/$name >> /var/log/snipeit-install.log & pid=$! 2>&1
progress progress
php5enmod mcrypt >> /var/log/snipeit-install.log 2>&1 php5enmod mcrypt >> /var/log/snipeit-install.log 2>&1
a2enmod rewrite >> /var/log/snipeit-install.log 2>&1 a2enmod rewrite >> /var/log/snipeit-install.log 2>&1
vhenvfile vhenvfile
wait wait
echo >> $hosts "127.0.0.1 $hostname $fqdn" echo >> $hosts "127.0.0.1 $hostname $fqdn"
a2ensite $name.conf a2ensite $name.conf
echo -e "* Modify the Snipe-It files necessary for a production environment.\n* Securing Mysql" echo -e "* Modify the Snipe-It files necessary for a production environment.\n* Securing Mysql"
# Have user set own root password when securing install # Have user set own root password when securing install
# and just set the snipeit database user at the beginning # and just set the snipeit database user at the beginning
/usr/bin/mysql_secure_installation /usr/bin/mysql_secure_installation
echo -e "* Creating Mysql Database and User.\n## Please Input your MySQL/MariaDB root password: " echo -e "* Creating Mysql Database and User.\n## Please Input your MySQL/MariaDB root password: "
mysql -u root -p < $dbsetup mysql -u root -p < $dbsetup
cd $webdir/$name/ cd $webdir/$name/
curl -sS https://getcomposer.org/installer | php curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source php composer.phar install --no-dev --prefer-source
perms perms
service apache2 restart service apache2 restart
php artisan key:generate
php artisan passport:install
;;
ubuntu)
##################################### Install for Ubuntu ##############################################
#Update/upgrade Debian/Ubuntu repositories, get the latest version of git.
#Git clone snipeit, create vhost, .env file, mysql install
#composer install, set permissions, restart apache.
webdir=/var/www
echo -ne "\n* Adding MariaDB repo in the background... ${spin[0]}"
(echo "deb [arch=amd64,i386] http://ftp.hosteurope.de/mirror/mariadb.org/repo/10.1/ubuntu $codename main" | tee /etc/apt/sources.list.d/mariadb.list >/dev/null 2>&1)
log "apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8"
echo -ne "\n* Updating with apt-get update in the background... ${spin[0]}"
log "apt-get update" & pid=$!
[ -f /var/lib/dpkg/lock ] && rm -f /var/lib/dpkg/lock
progress
echo -ne "\n* Upgrading packages with apt-get upgrade in the background... ${spin[0]}"
log "apt-get -y upgrade" & pid=$!
progress
echo -ne "\n* Setting up LAMP in the background... ${spin[0]}\n"
log "DEBIAN_FRONTEND=noninteractive apt-get install -y mariadb-server mariadb-client apache2 libapache2-mod-php curl" & pid=$!
progress
if [ "$version" == "16.04" ]; then
log "apt-get install -y git unzip php php-mcrypt php-curl php-mysql php-gd php-ldap php-zip php-mbstring php-xml" & pid=$!
progress
log "phpenmod mcrypt"
log "phpenmod mbstring"
log "a2enmod rewrite"
else
log "apt-get install -y git unzip php5 php5-mcrypt php5-curl php5-mysql php5-gd php5-ldap" & pid=$!
progress
log "php5enmod mcrypt"
log "a2enmod rewrite"
fi
echo -ne "\n* Cloning Snipeit, extracting to $webdir/$name... ${spin[0]}"
log "git clone https://github.com/snipe/snipe-it $webdir/$name" & pid=$!
progress
vhenvfile
echo -e "* MySQL Phase next.\n"
service mysql status >/dev/null || service mysql start
/usr/bin/mysql_secure_installation
echo -e "* Creating MySQL Database and user.\n* Please Input your MySQL/MariaDB root password created in the previous step.: "
mysql -u root -p < $dbsetup
echo -e "\n* Securing Mysql\n* Installing and configuring composer"
cd $webdir/$name/
curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source
perms
chown -R www-data:www-data "/var/www/$name"
service apache2 restart
php artisan key:generate php artisan key:generate
php artisan passport:install php artisan passport:install
;; ;;
centos ) ubuntu)
if [[ "$version" =~ ^6 ]]; then ##################################### Install for Ubuntu ##############################################
##################################### Install for Centos/Redhat 6 ############################################## #Update/upgrade Debian/Ubuntu repositories, get the latest version of git.
#Git clone snipeit, create vhost, .env file, mysql install
#composer install, set permissions, restart apache.
webdir=/var/www/html webdir=/var/www
#Allow us to get the mysql engine echo -ne "\n* Adding MariaDB repo in the background... ${spin[0]}"
echo "" (echo "deb [arch=amd64,i386] http://ftp.hosteurope.de/mirror/mariadb.org/repo/10.1/ubuntu $codename main" | tee /etc/apt/sources.list.d/mariadb.list >/dev/null 2>&1)
echo "## Adding IUS, epel-release and mariaDB repos."; log "apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8"
mariadbRepo=/etc/yum.repos.d/MariaDB.repo echo -ne "\n* Updating with apt-get update in the background... ${spin[0]}"
touch "$mariadbRepo" log "apt-get update" & pid=$!
{ [ -f /var/lib/dpkg/lock ] && rm -f /var/lib/dpkg/lock
echo "[mariadb]" progress
echo "name = MariaDB" echo -ne "\n* Upgrading packages with apt-get upgrade in the background... ${spin[0]}"
echo "baseurl = http://yum.mariadb.org/10.0/centos6-amd64" log "apt-get -y upgrade" & pid=$!
echo "gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB" progress
echo "gpgcheck=1" echo -ne "\n* Setting up LAMP in the background... ${spin[0]}\n"
echo "enable=1" log "DEBIAN_FRONTEND=noninteractive apt-get install -y mariadb-server mariadb-client apache2 libapache2-mod-php curl" & pid=$!
} >> "$mariadbRepo" progress
if [ "$version" == "16.04" ]; then
log "yum -y install wget epel-release" log "apt-get install -y git unzip php php-mcrypt php-curl php-mysql php-gd php-ldap php-zip php-mbstring php-xml" & pid=$!
log "wget -P "$tmp/" https://centos6.iuscommunity.org/ius-release.rpm" progress
log "rpm -Uvh "$tmp/ius-release*.rpm"" log "phpenmod mcrypt"
log "phpenmod mbstring"
#Install PHP and other needed stuff. log "a2enmod rewrite"
echo "## Installing PHP and other needed stuff"; else
PACKAGES="httpd MariaDB-server git unzip php56u php56u-mysqlnd php56u-bcmath php56u-cli php56u-common php56u-embedded php56u-gd php56u-mbstring php56u-mcrypt php56u-ldap" log "apt-get install -y git unzip php5 php5-mcrypt php5-curl php5-mysql php5-gd php5-ldap" & pid=$!
progress
for p in $PACKAGES;do log "php5enmod mcrypt"
if isinstalled "$p"; then log "a2enmod rewrite"
echo " ## $p already installed" fi
else echo -ne "\n* Cloning Snipeit, extracting to $webdir/$name... ${spin[0]}"
echo -n " ## installing $p ... " log "git clone https://github.com/snipe/snipe-it $webdir/$name" & pid=$!
log "yum -y install $p" progress
echo ""; vhenvfile
fi echo -e "* MySQL Phase next.\n"
done; service mysql status >/dev/null || service mysql start
/usr/bin/mysql_secure_installation
echo -e "\n## Downloading Snipe-IT from github and putting it in the web directory."; echo -e "* Creating MySQL Database and user.\n* Please Input your MySQL/MariaDB root password created in the previous step.: "
mysql -u root -p < $dbsetup
log "wget -P $tmp/ https://github.com/snipe/snipe-it/archive/$file" echo -e "\n* Securing Mysql\n* Installing and configuring composer"
unzip -qo $tmp/$file -d $tmp/ cd $webdir/$name/
cp -R $tmp/$fileName $webdir/$name curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source
# Make mariaDB start on boot and restart the daemon perms
echo "## Starting the mariaDB server."; chown -R www-data:www-data "/var/www/$name"
chkconfig mysql on service apache2 restart
/sbin/service mysql start php artisan key:generate
echo "## Securing mariaDB server.";
/usr/bin/mysql_secure_installation
echo "## Creating MySQL Database/User."
echo "## Please Input your MySQL/MariaDB root password: "
mysql -u root -p < $dbsetup
#Create the new virtual host in Apache and enable rewrite
echo "## Creating the new virtual host in Apache.";
apachefile=/etc/httpd/conf.d/$name.conf
{
echo ""
echo ""
echo ""
echo "<VirtualHost *:80>"
echo "ServerAdmin webmaster@localhost"
echo " <Directory $webdir/$name/public>"
echo " Allow From All"
echo " AllowOverride All"
echo " Options +Indexes"
echo " </Directory>"
echo " DocumentRoot $webdir/$name/public"
echo " ServerName $fqdn"
echo " ErrorLog /var/log/httpd/snipeIT.error.log"
echo " CustomLog /var/log/access.log combined"
echo "</VirtualHost>"
} >> "$apachefile"
echo "## Setting up hosts file.";
echo >> $hosts "127.0.0.1 $hostname $fqdn"
# Make apache start on boot and restart the daemon
echo "## Starting the apache server.";
chkconfig httpd on
/sbin/service httpd start
tzone=$(grep ZONE /etc/sysconfig/clock | tr -d '"' | sed 's/ZONE=//g');
echo "## Configuring .env file."
cat > $webdir/$name/.env <<-EOF
#Created By Snipe-it Installer
APP_TIMEZONE=$tzone
DB_HOST=localhost
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=$mysqluserpw
APP_URL=http://$fqdn
APP_KEY=$random32
DB_DUMP_PATH='/usr/bin'
EOF
echo "## Configure composer"
cd $webdir/$name
curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source
perms
chown -R apache:apache $webdir/$name
/sbin/service iptables status >/dev/null 2>&1
if [ $? = 0 ]; then
#Open http/https port
iptables -I INPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -I INPUT 1 -p tcp -m tcp --dport 443 -j ACCEPT
#Save iptables
service iptables save
fi
service httpd restart
php artisan key:generate
php artisan passport:install
elif [[ "$version" =~ ^7 ]]; then
##################################### Install for Centos/Redhat 7 ##############################################
webdir=/var/www/html
#Allow us to get the mysql engine
echo -e "\n## Add IUS, epel-release and mariaDB repos.";
log "yum -y install wget epel-release"
log "wget -P $tmp/ https://centos7.iuscommunity.org/ius-release.rpm"
log "rpm -Uvh $tmp/ius-release*.rpm"
#Install PHP and other needed stuff.
echo "## Installing PHP and other needed stuff";
PACKAGES="httpd mariadb-server git unzip php56u php56u-mysqlnd php56u-bcmath php56u-cli php56u-common php56u-embedded php56u-gd php56u-mbstring php56u-mcrypt php56u-ldap"
for p in $PACKAGES;do
if isinstalled "$p"; then
echo " ## $p already installed"
else
echo -n " ## installing $p ... "
log "yum -y install $p"
echo "";
fi
done;
echo -e "\n## Downloading Snipe-IT from github and put it in the web directory.";
log "git clone https://github.com/snipe/snipe-it $webdir/$name"
# Make mariaDB start on boot and restart the daemon
echo "## Starting the mariaDB server.";
systemctl enable mariadb.service
systemctl start mariadb.service
echo "## Securing mariaDB server.";
echo "";
echo "";
/usr/bin/mysql_secure_installation
echo "## Creating MySQL Database/User."
echo "## Please Input your MySQL/MariaDB root password "
mysql -u root -p < "$dbsetup"
##TODO make sure the apachefile doesnt exist isnt already in there
#Create the new virtual host in Apache and enable rewrite
apachefile="/etc/httpd/conf.d/$name.conf"
{
echo "## Creating the new virtual host in Apache.";
echo ""
echo ""
echo "LoadModule rewrite_module modules/mod_rewrite.so"
echo ""
echo "<VirtualHost *:80>"
echo "ServerAdmin webmaster@localhost"
echo " <Directory $webdir/$name/public>"
echo " Allow From All"
echo " AllowOverride All"
echo " Options +Indexes"
echo " </Directory>"
echo " DocumentRoot $webdir/$name/public"
echo " ServerName $fqdn"
echo " ErrorLog /var/log/httpd/snipeIT.error.log"
echo " CustomLog /var/log/access.log combined"
echo "</VirtualHost>"
} >> "$apachefile"
##TODO make sure this isnt already in there
echo "## Setting up hosts file.";
echo >> $hosts "127.0.0.1 $hostname $fqdn"
echo "## Starting the apache server.";
# Make apache start on boot and restart the daemon
systemctl enable httpd.service
systemctl restart httpd.service
tzone=$(timedatectl | gawk -F'[: ]' ' $9 ~ /zone/ {print $11}');
echo "## Configuring .env file."
cat > $webdir/$name/.env <<-EOF
#Created By Snipe-it Installer
APP_TIMEZONE=$tzone
DB_HOST=localhost
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=$mysqluserpw
APP_URL=http://$fqdn
APP_KEY=$random32
DB_DUMP_PATH='/usr/bin'
EOF
# Change permissions on directories
#Install / configure composer
cd $webdir/$name
curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source
perms
chown -R apache:apache $webdir/$name
# Make SeLinux happy
chcon -R -h -t httpd_sys_script_rw_t $webdir/$name/
#Check if SELinux is enforcing
if [ "$(getenforce)" == "Enforcing" ]; then
#Add SELinux and firewall exception/rules.
#Required for ldap integration
setsebool -P httpd_can_connect_ldap on
#Sets SELinux context type so that scripts running in the web server process are allowed read/write access
chcon -R -h -t httpd_sys_script_rw_t $webdir/$name/
fi
systemctl restart httpd.service
php artisan key:generate
php artisan passport:install php artisan passport:install
;;
centos )
if [[ "$version" =~ ^6 ]]; then
##################################### Install for Centos/Redhat 6 ##############################################
else webdir=/var/www/html
echo "Unable to Handle Centos Version #. Version Found: " $version #Allow us to get the mysql engine
return 1 echo ""
fi echo "## Adding IUS, epel-release and mariaDB repositories.";
mariadbRepo=/etc/yum.repos.d/MariaDB.repo
touch "$mariadbRepo"
{
echo "[mariadb]"
echo "name = MariaDB"
echo "baseurl = http://yum.mariadb.org/10.0/centos6-amd64"
echo "gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB"
echo "gpgcheck=1"
echo "enable=1"
} >> "$mariadbRepo"
log "yum -y install wget epel-release"
log "wget -P "$tmp/" https://centos6.iuscommunity.org/ius-release.rpm"
log "rpm -Uvh "$tmp/ius-release*.rpm""
#Install PHP and other needed stuff
echo "## Installing PHP and other requirements.";
PACKAGES="httpd mariadb-server git unzip php71u php71u-mysqlnd php71u-bcmath php71u-cli php71u-common php71u-embedded php71u-gd php71u-mbstring php71u-mcrypt php71u-ldap php71u-json php71u-simplexml"
for p in $PACKAGES;do
if isinstalled "$p"; then
echo " ## $p already installed"
else
echo -n " ## Installing $p ... "
log "yum -y install $p"
echo "";
fi
done;
echo -e "\n## Cloning Snipe-IT from github to the web directory.";
log "git clone https://github.com/snipe/snipe-it $webdir/$name"
# Make mariaDB start on boot and restart the daemon
echo "## Starting the mariaDB server.";
chkconfig mysql on
/sbin/service mysql start
echo "## Securing mariaDB server.";
/usr/bin/mysql_secure_installation
echo "## Creating MySQL Database/User."
echo "## Please Input your MySQL/MariaDB root password: "
mysql -u root -p < $dbsetup
#Create the new virtual host in Apache and enable rewrite
echo "## Creating the new virtual host in Apache.";
apachefile=/etc/httpd/conf.d/$name.conf
{
echo ""
echo ""
echo ""
echo "<VirtualHost *:80>"
echo "ServerAdmin webmaster@localhost"
echo " <Directory $webdir/$name/public>"
echo " Allow From All"
echo " AllowOverride All"
echo " Options +Indexes"
echo " </Directory>"
echo " DocumentRoot $webdir/$name/public"
echo " ServerName $fqdn"
echo " ErrorLog /var/log/httpd/snipeIT.error.log"
echo " CustomLog /var/log/access.log combined"
echo "</VirtualHost>"
} >> "$apachefile"
echo "## Setting up hosts file.";
echo >> $hosts "127.0.0.1 $hostname $fqdn"
# Make apache start on boot and restart the daemon
echo "## Starting the apache server.";
chkconfig httpd on
/sbin/service httpd start
tzone=$(grep ZONE /etc/sysconfig/clock | tr -d '"' | sed 's/ZONE=//g');
echo "## Configuring .env file."
cp $webdir/$name/.env.example $webdir/$name/.env
sed -i '1 i\#Created By Snipe-it Installer' $webdir/$name/.env
sed -i 's,^\(APP_TIMEZONE=\).*,\1'$tzone',' $webdir/$name/.env
sed -i 's,^\(DB_HOST=\).*,\1'localhost',' $webdir/$name/.env
sed -i 's,^\(DB_DATABASE=\).*,\1'snipeit',' $webdir/$name/.env
sed -i 's,^\(DB_USERNAME=\).*,\1'snipeit',' $webdir/$name/.env
sed -i 's,^\(DB_PASSWORD=\).*,\1'$mysqluserpw',' $webdir/$name/.env
sed -i 's,^\(APP_URL=\).*,\1'http://$fqdn',' $webdir/$name/.env
sed -i 's,^\(APP_KEY=\).*,\1'$$random32',' $webdir/$name/.env
echo "## Configure composer"
cd $webdir/$name
curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source
perms
chown -R apache:apache $webdir/$name
/sbin/service iptables status >/dev/null 2>&1
if [ $? = 0 ]; then
#Open http/https port
iptables -I INPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -I INPUT 1 -p tcp -m tcp --dport 443 -j ACCEPT
#Save iptables
service iptables save
fi
service httpd restart
echo "## Generating the application key."
php artisan key:generate --force
echo "## Artisan Migrate."
php artisan migrate --force
elif [[ "$version" =~ ^7 ]]; then
##################################### Install for Centos/Redhat 7 ##############################################
webdir=/var/www/html
#Allow us to get the mysql engine
echo -e "\n## Adding IUS, epel-release and mariaDB repositories.";
log "yum -y install wget epel-release"
log "wget -P $tmp/ https://centos7.iuscommunity.org/ius-release.rpm"
log "rpm -Uvh $tmp/ius-release*.rpm"
#Install PHP and other requirements
echo "## Installing PHP and other requirements.";
PACKAGES="httpd mariadb-server git unzip php71u php71u-mysqlnd php71u-bcmath php71u-cli php71u-common php71u-embedded php71u-gd php71u-mbstring php71u-mcrypt php71u-ldap php71u-json php71u-simplexml"
for p in $PACKAGES;do
if isinstalled "$p"; then
echo " ## $p already installed"
else
echo -n " ## Installing $p ... "
log "yum -y install $p"
echo "";
fi
done;
echo -e "\n## Cloning Snipe-IT from github to the web directory.";
log "git clone https://github.com/snipe/snipe-it $webdir/$name"
# Make mariaDB start on boot and restart the daemon
echo "## Starting the mariaDB server.";
systemctl enable mariadb.service
systemctl start mariadb.service
echo "## Securing mariaDB server.";
echo "";
echo "";
/usr/bin/mysql_secure_installation
echo "## Creating MySQL Database/User."
echo "## Please Input your MySQL/MariaDB root password "
mysql -u root -p < "$dbsetup"
##TODO make sure the apachefile doesnt exist isnt already in there
#Create the new virtual host in Apache and enable rewrite
apachefile="/etc/httpd/conf.d/$name.conf"
{
echo "## Creating the new virtual host in Apache.";
echo ""
echo ""
echo "LoadModule rewrite_module modules/mod_rewrite.so"
echo ""
echo "<VirtualHost *:80>"
echo "ServerAdmin webmaster@localhost"
echo " <Directory $webdir/$name/public>"
echo " Allow From All"
echo " AllowOverride All"
echo " Options +Indexes"
echo " </Directory>"
echo " DocumentRoot $webdir/$name/public"
echo " ServerName $fqdn"
echo " ErrorLog /var/log/httpd/snipeIT.error.log"
echo " CustomLog /var/log/access.log combined"
echo "</VirtualHost>"
} >> "$apachefile"
##TODO make sure this isnt already in there
echo "## Setting up hosts file.";
echo >> $hosts "127.0.0.1 $hostname $fqdn"
echo "## Starting the apache server.";
# Make apache start on boot and restart the daemon
systemctl enable httpd.service
systemctl restart httpd.service
tzone=$(timedatectl | gawk -F'[: ]' ' $9 ~ /zone/ {print $11}');
echo "## Configuring .env file."
cp $webdir/$name/.env.example $webdir/$name/.env
sed -i '1 i\#Created By Snipe-it Installer' $webdir/$name/.env
sed -i 's,^\(APP_TIMEZONE=\).*,\1'$tzone',' $webdir/$name/.env
sed -i 's,^\(DB_HOST=\).*,\1'localhost',' $webdir/$name/.env
sed -i 's,^\(DB_DATABASE=\).*,\1'snipeit',' $webdir/$name/.env
sed -i 's,^\(DB_USERNAME=\).*,\1'snipeit',' $webdir/$name/.env
sed -i 's,^\(DB_PASSWORD=\).*,\1'$mysqluserpw',' $webdir/$name/.env
sed -i 's,^\(APP_URL=\).*,\1'http://$fqdn',' $webdir/$name/.env
sed -i 's,^\(APP_KEY=\).*,\1'$$random32',' $webdir/$name/.env
#Install / configure composer
cd $webdir/$name
curl -sS https://getcomposer.org/installer | php
php composer.phar install --no-dev --prefer-source
#Set permissions
perms
chown -R apache:apache $webdir/$name
#Check if SELinux is enforcing
if [ "$(getenforce)" == "Enforcing" ]; then
#Add SELinux and firewall exception/rules
#Required for ldap integration
setsebool -P httpd_can_connect_ldap on
#Sets SELinux context type so that scripts running in the web server process are allowed read/write access
chcon -R -h -t httpd_sys_script_rw_t $webdir/$name/
fi
systemctl restart httpd.service
echo "## Generating the application key."
php artisan key:generate --force
echo "## Artisan Migrate."
php artisan migrate --force
echo "## Creating scheduler cron."
(crontab -l ; echo "* * * * * /usr/bin/php $webdir/$name/artisan schedule:run >> /dev/null 2>&1") | crontab -
else
echo "Unable to Handle Centos Version #. Version Found: " $version
return 1
fi
esac esac
echo "" echo ""
echo " ***If you want mail capabilities, edit $webdir/$name/.env and edit based on .env.example***" echo " ***If you want mail capabilities, edit $webdir/$name/.env***"
echo "" echo ""
echo " ***Open http://$fqdn to login to Snipe-IT.***" echo " ***Open http://$fqdn to login to Snipe-IT.***"
echo "" echo ""

View file

@ -1,8 +1,8 @@
-- MySQL dump 10.13 Distrib 5.7.18, for Linux (x86_64) -- MySQL dump 10.13 Distrib 5.7.19, for Linux (x86_64)
-- --
-- Host: localhost Database: snipeittests -- Host: localhost Database: snipeittests
-- ------------------------------------------------------ -- ------------------------------------------------------
-- Server version 5.7.18-0ubuntu0.16.10.1 -- Server version 5.7.19-0ubuntu0.17.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@ -1347,7 +1347,7 @@ CREATE TABLE `users` (
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `users_activation_code_index` (`activation_code`), KEY `users_activation_code_index` (`activation_code`),
KEY `users_reset_password_code_index` (`reset_password_code`) KEY `users_reset_password_code_index` (`reset_password_code`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
-- --
@ -1392,4 +1392,4 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2017-05-22 20:08:33 -- Dump completed on 2017-10-01 15:36:56

View file

@ -1,10 +1,16 @@
<?php <?php
namespace Helper; namespace Helper;
use Illuminate\Support\Facades\Artisan;
// here you can define custom actions // here you can define custom actions
// all public methods declared in helper class will be available in $I // all public methods declared in helper class will be available in $I
class Api extends \Codeception\Module class Api extends \Codeception\Module
{ {
public function setupDatabase()
{
Artisan::call('migrate');
Artisan::call('db:seed');
}
} }

View file

@ -11,3 +11,4 @@ modules:
environment_file: .env.testing environment_file: .env.testing
disable_middleware: true disable_middleware: true
cleanup: true cleanup: true

View file

@ -9,15 +9,16 @@ class ApiAssetsCest
public function _before(ApiTester $I) public function _before(ApiTester $I)
{ {
$I->setupDatabase();
$this->faker = \Faker\Factory::create(); $this->faker = \Faker\Factory::create();
$this->user = \App\Models\User::find(1); $this->user = \App\Models\User::find(1);
$I->amBearerAuthenticated($I->getToken($this->user)); $I->amBearerAuthenticated($I->getToken($this->user));
} }
/** @test */ /** @test */
public function indexAssets(ApiTester $I) public function indexAssets(ApiTester $I)
{ {
$I->wantTo('Get a list of assets'); $I->wantTo('Get a list of assets');
// setup // setup